CAN总线错误处理与故障界定

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/geek_liyang/article/details/80018325

    常听到一句话“汽车上都用CAN总线,那这个总线的稳定性应该是有所保障的”,而这种稳定性的保障,正是因为CAN总线直面了现场总线的复杂环境,做了相应的错误处理以及故障界定。

    工业现场总线的应用环境,不可避免的会有干扰在传输线上,虽然已经用差分信号传递数据,但是因为所有终端都是接到了一个CAN总线上,不可避免又会出现诸如发送消息碰撞,或者因为某个终端的性能下降等原因,影响整个总线的通信质量。CAN总线,定义了类似CSMA/CA来处理消息碰撞的问题,并通过ACK来保证报文发送成功并且实现了相关的错误处理以及故障界定策略,来保证总线上的稳定通信质量。

1. 碰撞处理

    CSMA/CA指的是可对发送的数据进行实时侦听,进行冲突检测,并实现同一通信线路的多路访问的一种协议。

    CAN总线上消息传递的基本单位为,其由不同的位场构成。

    数据帧,由帧起始、仲裁场、控制场、数据场、CRC 场、应答场、帧结尾7个位场组成。帧的起始位由一位显性电平组成,下面的示意图将显性电平画为了低电平。

    

    防止碰撞的关键就在于仲裁场,其中包括识别符和远程发送请求位(RTR)。CAN控制器能实时的侦测到当前总线的状态,当两个CAN控制器同时发送报文的时候,CAN控制器会实时监测监测总线状态,当其中一个CAN控制器在仲裁域发现其发送的电平本来是隐性位,但是读上来的确实显性位的时候,就会发生仲裁失败,退出发送状态,转为接收状态。所以说,对于总线上的数据,识别符部分越小(高位连续低电平个数较多)的帧,会抢占识别符高的帧发送。

    ACK位前后都是隐性位,发送此报文的CAN控制器会尝试发送隐性位。如果有其余的CAN控制器能够通过CRC校验成功,就会在ACK位将总线置成显性位。这样发送报文的CAN控制器通过读取的ACK位为显性位就知道总线上有其余的CAN节点成功接收到了数据。

2.错误处理

    作为CAN控制器,判断总线上发生了错误的依据,跟总线上的帧格式有着莫大的关系。我们将总线上正在发送报文的CAN控制器为发送器,其余的位接收器

扫描二维码关注公众号,回复: 2936091 查看本文章

    位错误:当接入总线的CAN控制器处于发送的阶段(发送报文已经仲裁成功),检测到总线上的位状态与发送的不相符,则发生位错误(ACK SLOT的隐性位除外)。

    填充错误:数据帧以及遥控帧,均通过位填充的方法编码。无论何时,发送器只要检测到位流里有5 个连续识别值的位,便自动在位流里插入一补码位。如果在通过NRZ编码过的帧部分,出现了连续相同的位电平,则产生填充错误。

    CRC错误:CRC 序列包括发送器的CRC 计算结果。接收器计算CRC 的方法与发送器相同。如果计算结果与接收到CRC 序列的结果不相符,则检测到一个CRC 错误(CRC ERROR)。

    形式错误:当一个固定形式的位场含有1 个或多个非法位,则检测到一个形式错误(FORM ERROR)。比如说帧结尾固定为隐性位,却检测到了显性位。

    应答错误:只要在ACK 间隙(ACK SLOT)期间所监视的位不为“显性”,则发送器会检测到一个应答错误

(ACKNOWLEDGMENT ERROR)。

    当总线上的CAN控制器发生了这些错误,将会根据当前CAN控制器所处的状态做出相应的操作。

    根据设备的故障界定结果,设备可能会处于三种不同的状态:错误主动状态错误被动状态,以及总线关闭状态,三种状态表征设备当前的CAN总线状况按顺序逐渐严重。“错误主动”的单元可以正常地参与总线通讯并在错误被检测到时发出主动错误标志。“错误被动”的单元不允许发送主动错误标志。“错误被动”的单元参与总线通讯而且在错误被检测到时只发出被动错误标志。而且,发送以后,“错误被动”单元将在预设下一个发送之前处于等待状态。“总线关闭”的单元不允许在总线上有任何的影响(比如,关闭输出驱动器)。

    当CAN控制器检测到位错误,填充错误,形式错误或者应答错误,这个CAN控制器会即刻在下一位发出错误帧。错误帧由两个不同的场组成,第一个场是一根总线上挂载的所有CAN控制器提供的错误标志的叠加,第二个场是错误界定符。错误标志分为两种,一种是主动错误标志,由6个显性的位组成,由处于错误主动状态的CAN控制器发送。而作为处于错误被动状态的CAN控制器,发送的错误标志称为被动错误标志,由6个隐性位组成,因为发送的是隐性位,所以当处于被动错误的CAN控制器要发送错误帧的时候,只要检测到6个连续相同的极性位即算成功发送错误标志。

     数据帧以及遥控帧的帧起始、仲裁场、控制场、数据场以及CRC 序列,均通过位填充的方法编码。无论何时,发送器只要检测到位流里有5 个连续相同值的位,便自动在位流里插入一补充反向位。数据帧或远程帧(CRC 界定符、应答场和帧结尾)的剩余位场形式固定,不填充。错误帧和过载帧不进行编码。主动错误标志将破坏从帧起始到CRC 界定符的位填充规则,或者破坏了应答场或帧末尾场的固定格式。所以当一个处于错误主动状态的CAN控制器发送错误帧的时候,会引起所有其余处于错误主动状态的CAN控制器同时发送错误标志,因此,显性位叠加导致总线上会出现所有站的错误标志叠加到一起,但是因为在总线上出现错误帧之前的连续显性电平位数不确定,所以这个总长度最小为6位,最大为12位。

    错误界定符包括8 个“隐性”的位。错误标志传送了以后,每一站就发送“隐性”的位并一直监视总线直到检测出一个“隐性”的位为止。然后就开始发送7 位以上的“隐性”位。

    讲到这里就顺便讲一下过载帧。首先数据帧(或者远程帧)与前边的帧需要“隔离",这通过帧间空间来实现,帧间空间包括间歇场,挂起传送位场,以及总线空闲位场。间歇场由3个隐性位组成,而紧跟间歇场的挂起传送位场只有处于错误被动状态的CAN控制器会需要再连续监测总线3个隐性位,才能转到总线空闲状态。在总线空闲的状态上,监测到显性位理解为帧起始。过载帧格式跟由主动错误标志组成的错误帧一样,区别就在于其是在间歇场发出的,由接收器的内部条件决定(报文过载)决定的,过载标志的形式破坏了间歇场的固定形式。因此,所有其他的站都检测到一过载条件并与此同时发出过载标志。

    3.故障界定

    在每一总线单元里实现两种计数以便故障界定:
    • 发送错误计数

    • 接收错误计数

    这些计数按照固定的规则进行改变。

    接收错误增加/减少的方式包括:

    1.作为接收器,检测到了包括CRC错误等的错误,接收错误计数器加一(发送主动错误标志或过载标志时,如果发送器检测到位错误,则发送错误计数器值加八)。

    2.作为接收器,发送完错误错误标志之后如果检测到显性位,则接收错误计数器加八,而后如果还能连续检测到8位显性位,持续加八。

    3.如果接收计数器错误数值介于1和127之间,在成功接收到报文之后(直到应答间隙接收没有错误,及成功地发送了ACK 位),接收错误计数器值减1;如果大于127,则它会设置一个介于119 到127 之间值。如果接收错误计数器值是0,则它保持0;

    发送错误计数器增加/减少的方式包括:

    1.当发送器发送错误标志(检测到错误,或者接收器发送错误标志导致填充错误),发送错误计数器值加八。但是有两个例外,一个是发送器为错误被动,检测到的是应答错误,并且发送被动错误标志的时候检测不到一个错误,这个时候发送错误计数器不加八。另一种例外是发送器因为填充错误而发送错误标志(注:此填充错误发生于仲裁期间。引起填充错误是由于:填充

位位于RTR 位之前,并已作为“隐性”发送,但是却被监视为“显性”),发送错误计数器同样不自增。

    2.在发送器发送主动错误标志或者过载标志的时候,如果发送器检测到位错误,则发送错误计数器值加8。在发送主动错误标志、被动错误标志或过载标志以后,每多检测到8位显性位,则发送错误计数器值持续加8。

    4.报文成功传送后(得到ACK 及直到帧末尾结束没有错误),发送错误计数器值减1,除非已经是0。

    CAN控制根据这个计数器切换错误主动状态错误被动状态,以及总线关闭这三种状态,具体的切换关系图如下。

    

    这里多说一句题外话,BOSCH的原厂是描述的在总线监视到128 次出现11 个连续“隐性”位之后,“总线关闭”的节点可以变成“错误主动”不再是“总线关闭”),它的错误计数值也被设置为0。而这个功能在STM公司的芯片的CAN控制器实现上需要配置寄存器使能这个功能。

    BOSCH的原厂的协议说明有两条很重要注意。

    1.一个大约大于96 的错误计数值显示总线被严重干扰。最好能够预先采取措施测试这个条件。

    2.当节点启动之后,总线上只有1 个节点在线,以及如果这个节点发送一些报文,则将不会有应答,并检测到错误和重复报文。由此,节点会变为“错误被动”,而不是“总线关闭”。

猜你喜欢

转载自blog.csdn.net/geek_liyang/article/details/80018325