CAN总线的报文帧共分为数据帧、远程帧、错误帧、过载帧和帧间隔5种类型
数据帧:用于发送节点向接收节点传送数据,是使用最多的帧类型。
远程帧:用于接收节点向某个发送节点请求数据。
错误帧:用于当某节点检测出错误时向其他节点通知错误的帧。
过载帧:用于接收节点向发送节点通知自身接收能力的帧。
帧间隔:用于将数据帧或远程帧与前面的帧分离的帧。
一、数据帧
数据帧是使用最多的帧,它由7个不同的位场组成:帧起始、仲裁场、控制场、CRC场、应答场、帧结尾。其中根据仲裁段ID码长度的不同,分为标准帧和扩展帧。数据场的长度可以为0。
1、帧起始和帧结束
帧起始和帧结束用于界定一个数据帧,无论是标准数据帧还是扩展数据帧都包含这两个段。
帧起始标志着数据帧和远程帧的起始,由一个单独的显性位组成。总线空闲时,发送节点发送帧起始,其他接收节点同步于该帧起始位。
帧结束由7个连续的隐形位组成。
2、仲裁段
如果多个节点同时发送数据时该怎么办呢?CAN-bus是如何解决总线竞争的问题呢?
该问题由仲裁段给出答案。
CAN-bus并没有规定节点的优先级,但通过仲裁段帧ID规定了数据帧的优先级。根据CAN2.0标准版本的不同,帧ID分为11位和29位两种。
总线仲裁
CAN控制器在发送数据的同时监测数据线的电平是否与发送数据对应电平相同,如果不同,则停止发送并做其他处理。
1)假设节点A、B和C都发送相同格式相同类型的帧,如标准格式数据帧,它们竞争总线的过程是:
从该分析过程得出结论是:帧ID值越小,优先级越高;
2)对于同为扩展格式数据帧、标准格式远程帧和扩展格式远程帧的情况同理。
3)由于数据帧的RTR位为显性电平,远程帧的RTR位为隐性电平,所以帧格式和帧ID都相同情况下,数据帧的优先级比远程帧优先级高:
节点B仲裁失败退出发送,进入只听模式;
节点A获得总线,继续发送剩余数据。
4)由于标准帧的IDE位为显性电平,扩展帧的IDE位为隐性电平,对于前11位ID相同的标准帧和扩展帧,标准帧优先级比扩展帧高。
当发送IDE位时,由于线与的原理,总线上出现显性电平:
节点B仲裁失败,进入只听模式。
节点A获得总线,继续发送剩余数据。
3、控制段
控制段共6位,标准帧的控制段由扩展帧标志位IDE、保留位r0和数据长度代码DLC组成;扩展帧控制段则由IDE、r1、r0和DLC组成。
4、数据段
一个数据帧传输的数据量为0~8个字节,这种短帧结构使得CAN-bus实时性很高,非常适合汽车和工控应用场合。
5、CRC段
CAN-bus使用CRC校验进行数据检错,CRC校验值存放于CRC段。CRC校验段由15位CRC值和1位CRC界定符构成。
6、ACK段
当一个接收节点接收的帧起始到CRC段之间的内容没发生错误时,它将在ACK段发送一个显性电平。
二、远程帧
一个节点可以向另一个指定的节点发送远程帧,以要求获取数据。
与数据帧相比,远程帧结构上无数据段,由6个段组成,同理分为标准格式和扩展格式,且RTR位为1(隐性电平)。
数据帧与远程帧的区别如下:
三、错误帧
尽管CAN-bus是可靠性很高的总线,但依然可能出现错误;CAN-bus的错误类型共有5种。
CAN-bus错误类型:
1、CRC错误
发送节点计算得到的CRC值与接收到的CRC值不同时发生错误
2、应答错误
发送节点在ACK阶段没有接收到应答信号时发生该错误
3、位发送错误
发送节点在发送时发现总线电平与发送电平不相同时发生该错误
4、位填充错误
通信线缆上传输信号违反“位填充”规则时发生该错误
5、格式错误
传输的数据帧格式与任何一种合法的帧格式不符时发生该错误
当出现5种错误类型之一时,发送或接收节点将发送错误帧。错误帧的结构如下,其中错误标识分为主动错误标识和被动错误标识。
主动错误标识由6个显性位组成,这违反了“位填充”规则。可以理解为当一个节点发现通信错误时,它将会主动将帧彻底破坏掉,让其他节点都知道它接收出错了。
为防止自身由于某些原因导致无法正常接收的节点一直发送错误帧,干扰其他节点通信,CAN-bus规定了节点的3种状态及其行为。
【REC表示接收错误计数器,TEC表示发送错误计数器,复位时两者都被清0。】
主动错误:设备正常参与总线通信,检测到错误时发送主动错误标识。
被动错误:设备正常参与总线通信,检测到错误时发送被动错误标识。
总线关闭:数据帧的收发都被禁止。
四、过载帧
当某个接收节点没有做好接收下一帧数据的准备时,将发送过载帧以通知发送节点;过载帧由过载标志和过载帧界定符组成。
过载帧结构:
由于存在多个节点同时过载且过载帧发送有时间差问题,可能出现过载标志叠加后超过6个位的现象。
五、帧间隔
帧间隔用于将数据帧或远程帧和他们之前的帧分离开,但过载帧和错误帧前面不会插入帧间隔。
1、帧间隔过后,如果无节点发送帧,则总线进入空闲。
2、帧间隔过后,如果被动错误节点要发送帧,则先发送8个隐性电平的传输延迟,再发送帧。
保证主动错误节点优先发送,避免被动错误节点因硬件故障干扰整个网络。
六、总结
CAN-bus整个链路层处理数据的流程是:
在收发报文的过程中,收发错误计数器会根据错误类型和节点状态自动增减计数,如下:
1、复位时将错误计数器初始化为0
2、检测到一次失败的传输,接收错误计数器REC加1
3、REC加8
4、成功收到一帧报文,REC减1
5、在发送时检测到错误,发送错误计数器TEC加8
6、成功发送一帧报文,TEC减1
7、如果TEC小于127,TEC加8
8、如果TEC大于255,从CAN-bus断开连接。
如果你想了解更多技术,可以关注公众号(FieldBus-Hongke)。