0 导读
本博文主要介绍了车用CAN通讯的基础知识,数据链路层部分,主要包括帧类型、帧起始&帧结束、仲裁段、控制段、数据段、CRC段&ACK段和错误帧等。
本博文比较适合没有接触过车用CAN通讯的朋友。假设在工作和学习中如果要涉及CAN通讯相关的内容,而无从下手的话,这篇文章比较适合你。如果你觉得对你有帮助,请收藏点赞,内容会持续更新打磨,请持续关注!
如果你对CAN物理层也想了解,请阅读【车辆CAN通讯系列】1 CAN通讯基础——物理层概述
1 CAN总线数据链路层概述
回顾 通讯分层 的概念,我们知道,数据链路层位于整个结构中的第二层,它由一系列的规则组成,规定什么样的电平代表什么样的意思,CAN控制器按照这样的规定发送和接收,总线上的电平信号。
1.1 帧的类型
- 数据帧
用于发送节点向接收节点传送数据,是使用最多的帧类型; - 远程帧
用于接收节点向某个发送节点请求数据; - 错误帧
用于当某个节点检测出错误时向其他节点通知错误的帧; - 过载帧
用于接收节点向发送节点通知自身接收能力的帧; - 帧间隔
将数据帧或远程帧与前面的帧分离的帧。
1.2 数据帧
数据帧有两种类型,标准帧和扩展帧。
1.2.1 帧起始和帧结束
帧起始和帧结束用于界定一个数据帧。无论是标准数据帧或扩展数据帧都包含这两个段。
如何同步呢?
1.2.2 仲裁段
CAN总线并没有规定节点的优先级,但通过仲裁段帧ID规定了数据帧的优先级。根据CAN2.0标准版本不同,帧ID分为11位和29位两种。
CAN控制器在发送数据的同时监控测试数据线的电平是否与发送数据对应电平相同,如果不同,则停止发送并做其他处理。
假设节点AB和C都发送相同格式相同类型的帧,如标准格式数据帧,它们竞争总线发送权的过程如下图:
- 从该分析过程得出结论是:帧ID值越小,优先级越高;
- 对于同为扩展格式数据帧、标准格式远程帧和扩展格式远程帧的情况相同。
由于数据帧的RTR位为显性电平,远程帧的RTR位为隐性电平,所以帧格式和帧ID都相同情况下,数据帧的优先级比远程帧优先级高:
由于标准帧的IDE位为显性电平,扩展帧的IDE位为隐性电平,对于前11位ID相同的标准帧和扩展帧,标准帧优先级比扩展帧高。
1.2.3 控制段
注意:接收节点对DLC = 9~15的情况并不视为错误
1.2.4 数据段
一个数据帧传输的数据量为0~8个字节,这种短帧结构使得CAN总线实时性很高,非常适合汽车和工控应用场合。
与其他总线相比,CAN总线的短帧结构具有以下优势:
- 数据量小,发送和接收时间短,实时性高;
- 数据量小,被干扰的概率小,总线的抗干扰能力强。
1.2.5 CRC段
CAN总线使用CRC校验进行数据检错,CRC校验值存放于CRC段。CRC校验段由15位CRC值和1位CRC界定符构成。
CRC段判断过程:
1.2.6 ACK段
1.3 远程帧
数据帧与远程帧的区别如下:
远程帧的应用
1.4 错误帧
1.4.1 错误类型
尽管CAN总线是可靠性很高的总线,但依然可能出现错误;CAN总线的错误类型共有5种。
错误检测区域
1.4.1.1 位错误
发送节点将自己发送到总线上的电平与同时从总线上回读到的电平进行比较,如果发现二者不一致,则该发送节点就会报出一个位错误。
下列三种情况不属于位错误:
- 在仲裁区,节点向总线发送隐性位却回读到显性位,则不认为是位错误,这种情况表示该节点仲裁失败;
- 在ACK槽,节点向总线发送隐性位却回读到显性位,则不认为是位错误,这种情况表示该节点当前发送的这帧报文至少被一个其他节点正确接收;
- 该节点发送被动错误标志,节点Node_A向总线发送连续6个隐性位(被动错误标志)却回读到显性位,则不认为是位错误。因为被动错误的标志就是6个连续的隐性位,所以在总线上按照线与机制,有可能这个6个连续隐性位被其他节点发送的显性电平“吃掉”。
1.4.1.2 ACK错误
在一帧报文(数据帧或者遥控帧)发出之后,如果接收节点Node_B成功接收了该帧报文,那么接收节点Node_B就要在该帧报文ACK槽对应的时间段内向总线上发送一个显性位来应答发送节点Node_A。这样发送节点Node_A就会在ACK槽时间段内从总线上回读到一个显性位。因此,当发送节点Node_A在ACK槽时间段内没有回读到显性位,那么发送节点Node_A就会检测到一个ACK应答错误。这表示没有一个节点成功接收该帧报文。
1.4.1.3 填充错误
在需要执行位填充原则的帧段(数据帧、远程帧的SOF~CRC序列),检测到连续6个同性位,则检测到一个填充错误。
1.4.1.4 格式错误
在一帧报文发送时,如果在必须发送预定值的区域内检测到了非法值,那么检测到一个格式错误。CAN报文中,有预定值的区域包括:
- 数据帧和远程帧的CRC界定符、ACK界定符;
- 错误帧界定符;
- 过载帧界定符。
1.4.2 错误通知
当出现上述5种错误类型之一时,发送或接收节点将发送错误帧。错误帧的结构如下,其中错误标识分为主动错误标识和被动错误标识。
1.4.3 节点错误状态
-
主动错误状态
节点处于主动错误状态可以正常通信;
处于主动错误状态的节点(可能是接收节点也可能是发送节点)在检测出错误时,发出主动错误标志; -
被动错误状态
节点处于被动错误状态可以正常通信;
处于被动错误状态的节点(可能是接收节点也可能是发送节点)在检测出错误时,发出被动错误标志; -
总线关闭状态
节点处于总线关闭状态,那么该节点不能收发报文;
处于总线关闭状态的节点,只能一直等待,在满足一定条件的时候,再次进入到被动错误状态。
注意:
这里所说的处于主动错误状态和被动错误状态的节点仍然可以正常通信,这里的正常通信指的是:节点仍然能够从总线上接收报文,也能够竞争总线获胜后向总线上发送报文。但是不代表接收的报文一定正确,也不代表一定能正确地发送报文。
为了防止自身由于某些原因导致无法正常接收的节点一直发送错误帧,干扰其他节点通信,CNA总线规定了节点的3种状态及其行为,如下图:
1.5 过载帧
当某个接收节点没有做好接收下一帧数据的准备时,将发送过载帧以通知发送节点;过载帧由过载标志和过载帧界定符组成:
由于存在多个节点同时过载且过载帧发送有时间差问题,可能出现过载标志叠加后超过6个 位的现象。
1.6 帧间隔
帧间隔用于将数据帧或远程帧和他们之前的帧分离开,但过载帧和错误帧前面不会插入帧间隔。
1.7 链路层数据处理流程
2 总结
看完本文,如果你已经理解了总线仲裁过程和错误处理机制,恭喜你,CAN总线的基础你已经掌握了,再实操一下,这个知识点就可以闭了!
站在巨人的肩膀上
【1】周立功官网《CAN-bus现场总线基础教程》;
【2】恒润科技《CAN基础》;