本系列前面文章CAN总线基础部分跳过了总线出现错误的情况,本文主要从总线信号错误,总线错误状态和总线网络状态3个方面来介绍。
12 帧结构
12.1 错误帧
错误帧用于在接收和发送消息时检测出错误通知错误的帧,它由错误标志和错误界定符构成。
![6cfcf3ac1ad1d6241db618e9640749a9.png](https://i-blog.csdnimg.cn/blog_migrate/276a85bd69a9f8c64549e0da7b75d608.png)
上图1的错误标志包括主动错误标志(6个位的显性位)和被动错误标志(6个位的隐性位)两种。主动错误标志处于主动错误状态下的单元检测出错误时输出的错误标志。被动错误标志处于被动错误状态的单元检测出错误时输出的错误标志。错误界定符由8个位的隐性位构成。
注意上图0~6位的错误标志重叠,这段怎么确定呢?需先介绍2个概念:位填充和错误类型。
1)位填充(Bit Stuffing)
位填充是为防止突发错误而设定的功能。当同样的电平持续5位则添加一个位的反型数据位:
![ec7099c6eab6d66886b448ce6f33b641.png](https://i-blog.csdnimg.cn/blog_migrate/22dc49473487243f5ad3711fc47e64d2.jpeg)
![c98a274685e2900f5d628f97995c9abd.png](https://i-blog.csdnimg.cn/blog_migrate/f74e692a3b488ee796a5f37d503e7170.jpeg)
注意:位填充作用范围为SOF-CRC段机间的数据。
2) 错误类型
错误类型有5种,如下图3所述。图4为CRC错误示意。
![69677d2a4696a980c3013ec28eeaf73c.png](https://i-blog.csdnimg.cn/blog_migrate/efed37dabd6094cca0bcc7fe8956280c.jpeg)
![e8880bfffd57e7bab08b7c8e5b43f18d.png](https://i-blog.csdnimg.cn/blog_migrate/232992976a14a03175351ad399e63f22.jpeg)
![4d1d02ddf00f85f776d4b539d6257b4e.png](https://i-blog.csdnimg.cn/blog_migrate/b8cf8c8765258a268f06005188c183fe.jpeg)
针对上述 位错误再做说明(引自[3]):
所谓“发出的电平与从总线上回读的电平不一致”,指的就是 节点向总线发出隐性位,却从总线上回读到显性位或者 节点向总线发出显性位,却从总线上回读到隐性位这两种情况。有三种例外情况不属于位错误:
在仲裁区,节点向总线发送隐性位却回读到显性位,不认为是位错误,这种情况表示该节点仲裁失败;
在ACK槽,节点向总线发送隐性位却回读到显性位,不认为是位错误,这种情况表示,该节点当前发送的这一帧报文至少被一个其它节点正确接收;
一个节点发送被动错误标志,该节点向总线发送连续六个隐性位(被动错误标志)却回读到显性位,不认为是位错误。因为被动错误标志是六个连续的隐性位,所以在总线上按照线与机制,有可能这六个连续隐性位被其它节点发送的显性电平覆盖。
3)错误帧发送
检查到错误后,什么时候发送错误帧呢?按照CAN协议的规定:
- 位错误、填充错误、格式错误、ACK错误。在错误产生的那一位的下一位开始发送错误帧。
- CRC错误。紧随ACK界定符后的位发送错误帧。
通过具体例子(引自[3])来了解错误帧发送,如下图5所示。
![39f41d11091e214896b58104c5d94639.png](https://i-blog.csdnimg.cn/blog_migrate/8e3d2fa2cc182ed5008d8eaee4769182.jpeg)
1)发送节点Node_A发送一个显性位,但是却从总线上听到一个隐形位,于是Node_A节点就会检测到一个位错误;
2)Node_A检测到位错误之后,立即在下一位开始发送主动错误帧:6个连续显性位的主动错误标志+8个连续隐性位的错误界定符;
3)对应Node_A发出的主动错误标志,总线上电平为6个连续显性位;
4)接收节点Node_B和Node_C从总线上听到连续6个显性位,那么就会检测到一个填充错误,于是这两个节点都会发送主动错误帧;
5)对应Node_B和Node_C发出的主动错误标志,总线电平又有6个连续显性电平,对应Node_B和Node_C发出的错误界定符,总线电平有8个连续的隐性电平。
6)在间歇场之后,Node_A节点重新发送刚刚出错的报文。
在了解了错误帧的发送后,最后回到之前提到错误标志重叠部分是怎样形成的,看下例(引自[3])
![f715b2cdccac5c12d91cf2af3df4da9d.png](https://i-blog.csdnimg.cn/blog_migrate/fd140b6c9b697a90caf86a3e5ac2e621.jpeg)
在这个例子,我们知道位错误的错误标志与填充错误的错误标志重叠2位,剩下部分还有4位:
![4c36db814cc2d4bf61f883a36c97f0df.png](https://i-blog.csdnimg.cn/blog_migrate/cb364b1c6d8130a1c11f787ddb9f9b9b.jpeg)
12.2 过载帧
为了后续介绍错误状态,这里再介绍下过载帧,它是用于接收单元通知其尚未完成接收准备的帧。过载帧由过载标志(6个位的显性位)和过载界定符(8个位的隐性位)构成。过载界定符的构成与错误界定符的构成相同。过载帧的构成如下图所示。
![89cdf1c8abf10bd2cb23ba7c4149830b.png](https://i-blog.csdnimg.cn/blog_migrate/6becb693291610f68f15684cf84991c3.png)
对于过载帧的帧结构我们可以这样理解:接收节点达到接收极限时,就会发出过载帧到总线上,显然,过载标志的6个连续显性位会屏蔽掉总线上其它节点的发送,也就是说这个时候的接收节点通过发送过载帧的方式来破坏其它节点的发送,这样在接收节点发送过载帧期间,其它节点就不能成功发送报文,于是就相当于把其它节点的发送推迟了,也就是说接收节点在其发送过载帧的这段时间得以“休息”。有3种情况会引起过载帧:
- 接收节点自身原因。接收节点由于某种原因需要延迟接收下一个数据帧或者遥控帧。
- 在帧间隔的间歇段的第一位和第二位检测到一个显性位(正常的间歇段都是隐性位)。帧间隔的间隔段本应是三个连续的隐性位,如果接收节点在间隔段检测到显性位,那么就意味着此时有报文发向接收节点,但这个时候是不应该有报文发来的,于是接收节点发送过载帧。
- CAN节点在错误界定符或过载界定符的第八位(最后一位)听到一个显性位0,节点会发送一个过载帧,且错误计数器不会增加。接收节点在错误界定符和过载界定符的最后一位听到显性位,也意味着有报文发向接收节点,但这个时候是不应该有报文发来的,于是接收节点发送过载帧。
13 错误状态
单元(节点)检测到错误帧时,随着错误的积累,单元会处于3种错误状态的一种,即主动错误状态,被动错误状态或总线关闭态。
1)主动错误状态:可以正常参加总线通信的状态,处于主动错误状态的单元检测出错误时,输出主动错误标志。
2)被动错误状态:是易引起错误的状态。处于被动错误状态的单元虽能参加总线通信,但为不妨碍其他单元通信,接收时不能积极地发送错误通知;处于被动错误状态的单元即使检测出错误,而其它处于主动错误状态的单元如果没发现错误,整个总线也被认为是没有错误的。处于被动错误状态的单元检测出错误时,输出被动错误标志。另外,处于被动错误状态的单元不能马上再次开始发送。在开始下次发送前,在间隔帧期间内必须插入“延迟传送”(8个位的隐性位)。
3)总线关闭态是不能参加总线上通信的状态。信息的接收和发送均被禁止。
单元到底会处于以上3种错误状态的哪一种,具体依靠发送错误计算和接收错误计数来管理,根据计数值决定进入何种状态。错误状态和计数值的关系如下表1和图8所示。
![da4896632dae1f48020c2eac9b20388a.png](https://i-blog.csdnimg.cn/blog_migrate/a41816e2465804d79e7995a73220aaa7.jpeg)
![47237f0ea01a6cb0f722d34c31ad9f86.png](https://i-blog.csdnimg.cn/blog_migrate/a5db8f7522f5e07b0d577e082b9ea36f.jpeg)
发送错误计数值和接收错误计数值根据一定的条件发送变化。错误计数值的变动条件如下表2,一次数据的接收和发送可能同时满足多个条件。错误计数器在错误标志的第一个位出现的时间点上开始计数。
![2692ee6026508df9fbbd841b554de936.png](https://i-blog.csdnimg.cn/blog_migrate/81e6e18c77a6efb3a82b26afefca38cb.jpeg)
当出现总线关闭态时,将设置CAN控制器状态为STOPPED,从而禁止读或写总线的数据。
而在实际软件开发过程中,其实一般也不关注上述错误状态的跳转,以Infineon的TC系列芯片为例,节点状态寄存器有一位存储总线关闭态,如下图9所示。
![86472fda428fef6eb9a19ccd2be1a1c4.png](https://i-blog.csdnimg.cn/blog_migrate/1bfe0652f9a2361f312651fb34dbf1e2.jpeg)
14 网络模式
根据AUTOSAR的CAN状态管理模块的文档可知,CAN状态管理模块内部有3种网络模式,分别是无通讯模式(COMM_NO_COMMUNICATION),静默模式(COMM_SILENT_COMMUNICATION)和完全通讯模式(COMM_FULL_COMMUNICATION),它们之间切换关系如下图10所示。
![a0fb50875ba83e932d28f3b5a3cc1b23.png](https://i-blog.csdnimg.cn/blog_migrate/70c19ffcecd2d0a2e35897c5a2a4a930.jpeg)
关于上述状态机跳转可参考[4],这里不做具体解释。若将上述各状态再细化,以CANSM_BSM_S_FULLCOM为例,如下图11所示。
![440fc274d29344546fc891893631b673.png](https://i-blog.csdnimg.cn/blog_migrate/781732a8677048e6869ae6e2bc5ea23a.jpeg)
通过上述2图可知两点:一是总线关闭态将如何影响网络模式的跳转,比如图9种导致CANSM_BSM_S_FULLCOM跳转到CANSM_BSM_S_SILENTCOM,进而到CANSM_BSM_S_SILENTCOM_BOR;二是相应网络模式下将会根据跳转条件最终决定CAN控制器的状态,比如图10中跳转到了S_RESTART_CC状态,将设置CAN控制器状态为CAN_CS_STARTED。
到此就介绍了关于总线信号错误引发的节点状态变化,从而引起网络模式变化而导致通讯无法进行的大致过程。通过前面文章的软件实现介绍,可知本质上还是最终通过更改CAN控制器状态而使接收与发送禁止。
Reference:
[1] CAN入门书.pdf
[2] CANPES.pdf
[3] https://blog.csdn.net/weixin_40528417/category_7489864.html
[4] TC27x D-Step 32-Bit Single-Chip Microcontroller
[5] Specification of CAN State Manager