本文参考瑞萨的《CAN总线入门》,周立功的《现场总线CANopen设计与应用》

在这里插入图片描述

1.CAN错误检测特点简介

错误检测是CAN的特点之一,在CAN协议中,可以使用5种错误识别机制,以确保将几乎所有出现的总线错误都识别出来(即Hamming Distance不等于6)。CAN的所有单元都可以检测错误。同时,检测出错误的单元会通知其他所有单元,正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送。即:在数据链路层上,CAN协议为了保证总线内的数据一致性,会将检测出的错误单元全局通知,相当于将信息进行全局同频,总线内所有单元都会将错误单元发送的消息进行作废处理。
CAN芯片会设计了错误计数器,用于区别错误状态的种类,并对处于不同状态的错误单元进行不同的处理。
在这里插入图片描述

1.1错误检测机制

但发送消息的单元出现错误时,CAN设备会作废之前接收到的该单元发送的消息,并发送一个错误帧。(错误帧是由 6个连续且具有相同逻辑值的位序列组成的错误标志)
CAN芯片可以使用位错误、填充规则错误、CRC错误、应答错误、格式错误五种机制进行错误检验。
五种机制具体介绍如下:
1.位错误:单元发送位时会对总线电平进行监听,简单的说就是会进行电平对比,如果单元发送的数值与监听的不同,会立即中断传输,同时产生位错误标志。但是需要注意以下情况:1.仲裁阶段时,发送显性电平接收隐形电平,不会被认为是位错误;2.在应答间隙,显性电平覆盖隐形电平也不会被认为是位错误。
2.填充规则错误:CAN在正常工作时,如果已经连续发送5个逻辑值相同的位时,发送器会将第6位插入一个取反值,也就是说,不会出现6个连续且逻辑值相同的位。如果在应答间隔符之前出现6个连续且逻辑值相同的位,就会产生填充规则错误。
3.CRC错误:单元发送的信息中会有CRC检验值,该值会与CAN芯片中算出的检验值进行对比,如果检验值不一致,会在应答界定符后面发送一个错误标志,同时将刚才那条消息作废。
4.应答错误:发送设备会以隐性电平发送的应答间隙位,如果该位没有被任何接收设备的显性电平覆盖,发送设备会中断传输,将发送的报文作废,同时在下一个位中发送一个错误标志。正常情况下,在应答间隙,所有的接收设备都需要对接收的帧信息进行应答。
5.格式错误:CRC界定符、应答界定符或EOF字段的前6位中发现一个显性电平位,则将已收到的报文作废,并在下一个位中发送一个错误标志。
位错误、填充规则错误、CRC错误、应答错误可以检测出数据帧、远程帧中的所有总线错误。

2.错误

为了防止出错的设备干扰正常设备的通信,CAN芯片内置了错误计数器,分别是REC和TEC,REC用于记录未正确接收消息的数量,TEC用于记录发送报文错误的数量。出现相应错误时,相应的计数器会加1,成功发送或接收消息时,相应计数器数值会减1.

2.1错误状态的种类

在这里插入图片描述

(1) 主动错误状态
主动错误状态是可以正常参加总线通信的状态。处于主动错误状态的单元检测出错误时,输出主动错误标志。
TEC和REC同时小于127时,会认为处于主动错误状态。
(2) 被动错误状态
被动错误状态是易引起错误的状态。处于被动错误状态的单元虽能参加总线通信,但为不妨碍其它单元通信,接收时不能积极地发送错误通知。处于被动错误状态的单元即使检测出错误,而其它处于主动错误状态的单元如果没发现错误,整个总线也被认为是没有错误的。处于被动错误状态的单元检测出错误时,输出被动错误标志。另外,处于被动错误状态的单元在发送结束后不能马上再次开始发送。在开始下次发送前,在间隔帧期间内必须插入“延迟传送”(8 个位的隐性位)。
TEC和REC二者有一个的数值处于128到255之间时,会被认为处于被动错误状态。
(3) 总线关闭态
总线关闭态是不能参加总线上通信的状态。信息的接收和发送均被禁止。
当TEC的数值大于255时,会进入总线关闭态,也就是所谓的BusOff状态
这些状态依靠发送错误计数和接收错误计数来管理,根据计数值决定进入何种状态。错误状态和计数值的关系如下表所示在这里插入图片描述
发送错误计数值和接受错误计数值具体变化如下表所示
在这里插入图片描述
遇事不决,可问春风!

/*
 * 作者:PrairieOne
 * csdn:PrairieOne
 * 嵌入式技术交流:738655377
 */
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐