
一、CAN发展历史
CAN(Controller Area Network,控制器局域网),最初出现在80年代末的汽车工业中,由德国 Bosch 公司最先提出。当时,由于消费者对于汽车功能的要求越来越多,而这些功能的实现大多是基于电子操作的,这就使得电子装置之间的通讯越来越复杂,同时意味着需要更多的连接信号线。提出 CAN 总线的最初动机就是为了解决现代汽车中庞大的电子控制装置之间的通讯,减少不断增加的信号线。于是,他们设计了一个单一的网络总线,所有的外围器件可以被挂接在该总线上。
1991年,BOSCH发布了CAN2.0规范,分为:CAN2.0A(标准帧格式)、CAN2.0B(扩展帧格式)。这份文件是CAN历史上最重要的文件之一。
1993年,CAN协议成为国际标准ISO 11898。

**Logic Link Control:**逻辑链路控制。接收过滤、过载通知、恢复管理。
**Media Access Control:**媒体访问控制。数据封装/解封装、帧编码、媒体访问管理、错误检测、误差信号、串口化/去串口化。
**Physical Media Attachement:**物理介质连接。驱动器/接收器特性
后续,为了规范数据的组织、含义和传输,行业制定了高层协议。如,CANOpen、SAEJ1939、DeviceNet。
二、CAN 总线结构
2.1、闭环CAN总线网络

总线两端各连接一个120欧的电阻,两根信号线形成回路。这种CAN总线网络由ISO 11898标准定义,是高速、短距离的CAN网络,通信速率为125kbit/s到1Mbit/s。在1Mbit/s通讯速率时,总线长度最长达40m。
2.2、开环CAN总线网络

两根信号线独立,各自串联一个2.2k欧的电阻。这种CAN总线网络由ISO11519-2标准定义,是低速、远距离的CAN网络,通信速率最高125kbit/s。在40kbit/s速率时,总线最长距离可达1000m。
由于没有时钟,所以是异步通信 。并且不能同时接收和发送,所以是半双工通信 。CAN总线的两根信号线通常采用的是双绞线,传输的是差分信号,通过两根信号线的电压差CANH-CANL来表示总线电平。以差分信号传输信息具有抗干扰能力强,能有效抑制外部电磁干扰等优点,这也是CAN总线在工业上应用广泛的一个原因。
三、CAN总线电平
两根信号线的电压差CANH-CANL表示CAN总线的电平,与传输的逻辑信号1或0对应。对应于逻辑1的称为隐性(Recessive)电平,对应于逻辑0成为显性(Dominant)电平。上半部分为实际CANH和CANL的电平,下半部分对于的逻辑电平。
在高速CAN中,如上图的上半部分:
(1)显性电平:CAN高和CAN低之间电压典型值为2V(CAN高为3.5V,CAN低为1.5V);
(2)隐性电平:CAN高和CAN低之间电压典型值为0V(CAN高和CAN低为2.5V);
在低速CAN中,如上图的下半部分:
(1)显性电平:CAN高和CAN低之间电压差典型值为3V(CAN高为4V,CAN低为1V);
(2)隐形电平:CAN高和CAN低之间电压差典型值为-1.5V(CAN高为1.75V,CAN低为3.25V);
四、CAN总线帧格式
4.1、概述
CAN协议规定了五种类型的帧:数据帧、远程帧、错误帧、过载帧、帧间隔 。其中数据帧和远程帧由用户设置。其它帧则由CAN硬件设置。
数据帧和远程帧有两种格式:标准格式和扩展格式。区别于ID长度,标准格式ID长度为11bit,扩展格式长度为29bit。
**数据帧:**发送节点通过数据帧向接收节点传输数据
**远程帧:**接收节点通过远程帧向具有相同ID的发送单元请求数据
**错误帧:**当节点检测到错误时发送错误帧通知其它节点发生了错误
**过载帧:**接收节点通过发送过载帧来请求发送节点稍作等待
**帧间隔:**帧间隔用于分隔连续发送的数据帧或远程帧
4.2、数据帧
最常用的帧类型,用于数据传输。一个节点使用数据帧向总线发送实际的数据内容给其它节点。结构最复杂,包含七个字段:帧起始、仲裁段、控制段、数据段、CRC段、ACK段、帧结束。
标准帧和扩展帧仅在仲裁段和控制段有区别

4.2.1、帧起始(Start of Frame, SOF)
SOF恒为显性位,即逻辑0;标示一个数据帧的开始,用于同步;只有再总线空闲期间节点才能发送SOF。
4.2.2、仲裁段(Arbitration Field)
标准格式:标识符(11bit)+RTR位+IDE位(显性位0)
扩展格式:基本标识符(11bit)+SRR位(隐性位1)+IDE(隐性位1)+扩展标识符(18bit)+RTR位
**标识符:**ID确定一条报文,也确定报文的仲裁优先级,ID数值越小,优先级越高。
**RTR(Remote Transmission Request,远程发送请求):**用于区分数据帧(显性位0)和远程帧(隐性位1)的标志。
**SRR(Substitute Remote Request,代理远程请求):**在扩展格式下替代RTR占位符,固定为隐性位1,保证标准帧优先级高于扩展帧。
**IDE(Identifier Extension,标志位扩展):**用于区分标准格式(显性位0)和扩展格式(隐性位1),保证标准远程帧优先级高于扩展远程帧。
数据帧仲裁段如下:

远程帧仲裁段如下:

4.2.3、控制段(Control Field)
IDE:在标准格式中已包含在仲裁段,扩展格式中在仲裁段IDE后
保留位:r0/r1,发送端为显性位0,接收方不做要求可以接收任意电平。
DLC(Data Length Code):数据长度,4位

4.2.4、数据段(Data Field)
包含实际要传输的数据,长度由DLC指定(0-8Byte)

4.2.5、CRC段(CRC Field)
1.CRC序列(CRC Sequence):15位循环冗余校验码,基于帧起始、仲裁段、控制段、数据段计算得出。
2.CRC界定符(CRC Delimiter):1位隐性位,标志CRC序列结束。

4.2.6、ACK段(ACK Field)
1.ACK槽(ACK Slot):发送隐性位1。任何正确接收到有效帧的接收器,在此期间发送一个显性位(0)覆盖它,向发送器确认接收成功。
2.ACK界定符:1位隐性位,标志ACK段结束。

4.2.7、帧结束(EOF-End of Frame)
7位隐性位,标志帧的结束。

4.3、远程帧(Remote Frame)
用于请求数据。一个节点发送远程帧,请求另一个具有相同标识符的节点发送其对应的数据帧。远程帧本身不包含任何数据。包含六个字段:帧起始、仲裁段、控制段、CRC段、ACK段、帧结束。
远程帧与数据帧结构非常相似,但有两个关键区别:
RTR位:在仲裁段中,RTR位是隐性位(1)。区分远程帧与数据帧的核心标志。
数据段:远程帧不传输数据,没有数据段。

4.4、帧间隔(Insterframe Space)
分隔连续发送的数据帧或这远程帧。它为接收节点提供必要的处理时间和同步时间,并允许总线在传输新帧前恢复隐性状态(空闲)。它也是过载帧和错误帧的发送窗口。
固定格式为3个连续的隐性位1,结合前面的DEL位和EOF段组成11位连续的隐性位。其它节点检测到后判断位总线进入空闲状态,可以尝试发送报文。

4.5、错误帧(Error Frame)
1.用于通知数据传输期间发生的错误,错误帧由错误标志和错误界定符组成:
**(1)错误标志:**主动错误标志---6个连续显性位0、被动错误标志---6个连续隐性位1。
**(2)错误界定符:**8个连续隐性位1。
4.5.1、错误计数器
1.每个CAN节点维护两个独立计数器TEC(Transmit Error Counter,发送错误计数器) 、REC(Receive Error Counter,接收错误计数器)
2.计数器变化优先级:发送错误的惩罚(+8)、远大于错误接收(+1)
4.5.2、错误状态
(1)主动错误状态:TEC<128且REC<128。可正常收发,检测到错误时发送主动错误标志(6显性)。
(2)被动错误状态:TEC≥128或REC≥128。仍可收发,但发送错误时发被动错误标志(6隐性)。
(3)总线关闭状态:TEC>255。硬件禁发报文。
4.5.3、错误检测
1.位错误:当节点发出的位电平与在总线上回读的位电平不一致时。
2.ACK错误:
(1)当节点发送数据帧或远程帧时,ACK Slot会发送隐性电平1。在总线上的其它节点正确接收到该报文后,会发送显性电平0将ACK Slot覆盖,使发送节点知道报文被正确接收。
(2)如果发送节点发出的ACK Slot未能被显性电平1覆盖掉,那说明总线上没有节点正确的接收到了这条报文,发送节点检测到一个ACK应答错误。
3.填充错误:当需要执行位填充的位填充作用域上,检测到连续六个相同极性的电平,即检测到一个填充错误。
4.格式错误:在一帧报文发送时,如果必须在发送预定值的区域检查到了非法值,即检测到了一个格式错误。
4.6、过载帧(Overload Frame)
接收节点通过发送过载帧来请求发送节点稍作等待,是CAN协议内置的一种"流量控制"机制,允许接收节点请求发送方暂停,以便自己"赶上"处理速度。
4.6.1、产生条件
1.接收器内部繁忙:需要更多时间处理当前接收到的数据。
2.间歇场检测到显性位:在帧间空间的"间歇场"(Intermission)期间,所有节点都应发送隐性位(逻辑1)。如果某个节点检测到间歇场出现了显性位(逻辑0),它会在该显性位后的第1位时间开始发送过载帧。
4.6.2、帧结构
1.过载标志:由6个连续的显性位(0)组成。
2.过载界定符:由8个连续的隐性位(1)组成。在过载界定符发送完毕后,总线恢复空闲或允许新的帧开始传输。
五、位定时
5.1、比特率、波特率
5.1.1、比特率
bit/s(比特/秒),单位时间呢i传输二进制位数量。
5.1.2、波特率
Baud/s(波特/秒),单位时间的码元数量。
当一个码元用一个二进制位表示时,两相调制,此时波特率和比特率在数值上是一样的。常用的波特率:125k\250k\500k\1M\2M。
5.2、位时间
单个二进制位在总线上传输需要的时间。位时间=1/位速率。
CAN时钟是由系统时钟分频而来的一个时间长度,单位是一个时间份额TQ。CAN时钟频率=系统时钟频率/BRP(波特率预分频值)。TQ=1/CAN时钟频率。波特率=CAN时钟频率/位时间(TQ数量)。

5.3、位时间分段
在一个位时间中按照Tq单位分为同步段、传播段、相位缓冲段1、相位缓冲段2。
**同步段(SS):**检测信号跳变边沿,实现节点件时钟同步。
**传播段(PROP):**补偿总线物理延迟(线缆延迟+收发器延迟)。
**相位缓冲段1(PBS1):**补偿节点间时钟误差(通过重同步延长)。
**相位缓冲段2(PBS2):**补偿时钟误差(通过重同步缩短)。
5.4、位时间同步
CAN从总线采用的是异步串行通信,为了保证报文的接收节点能在正确的采样点采集到准确的电平。CAN的同步包括了硬同步和重同步。
5.4.1、硬同步
硬同步发生在SOF位,所有接收节点调整各自当前位的同步,调整宽度不限,使其位于发送的SOF内。
(1)发送节点Node_A在发送SOF时,下降沿在SS段;
(2)此时接收节点Node_B发现自己的当前位的SS段与Node_A不同步,当Node_A产生SOF位SS段时,Node_B当前位的SS段提前5个Tq产生了;
(3)接收节点Node_B强行将自己当前位的SS段拉到与SOF位的SS段同步。

5.4.2、重同步
重同步发生在SOF位以外的其它位,当接收节点当前位的下降沿落在了发送节点当前位的同步段之外时发生重同步。
(1)重同步通过调整相位缓冲段1(PBS1)的延长或者相位缓冲段2(PBS2)的缩短,来确保采样点的准确。
(2)同步跳转宽度(SJW,Synchro Jump Width):PBS1和PBS2重同步时允许跳转的最大宽度。
