CAN总线上的节点在发送和接收报文时,如果检测到错误,该节点就会往总线上发送错误帧,通知总线上的其它节点出错了,需要停止接收或者发送报文。那么哪些情况会导致节点检测到错误呢?下面就来讨论一下这个问题。
CAN协议定义了五种错误类型:位错误、ACK错误、填充错误、CRC错误和格式错误。
1. 位错误
节点在往总线上发送电平的同时会检测总线上的电平,如果发现检测到的电平与自己发送的电平不一致,就说明总线上出现了位错误。比如发送了显性电平却检测到隐性电平,或者相反,就表明总线上出现了位错误。
2. ACK错误
CAN协议规定,在报文发出之后,如果接收节点B成功接收了该报文,那么B就要在报文ACK场向总线上发送一个显性位来应答发送节点A。因此,发送节点A会在ACK场从总线上检测到一个显性位。所以,如果发送节点A没有在ACK场检测到显性位,那么A就会检测到一个ACK应答错误,说明没有节点成功接收该报文,如下图所示。
3. 填充错误
CAN协议规定,节点发送数据时,当连续发送5位相同极性的数据时,则必须插入1个极性相反的位,如下图所示。
所以,在执行位填充原则的场内(数据帧和远程帧的SOF~CRC序列),最长的连续相同电平为5位,如果连续检测到六个同性位,则检测到一个位填充错误。
4. CRC错误
CRC序列是有发送器CRC计算的结果组成的,接收器和发送器以相同的方法计算CRC。如果计算的结果和接收到的CRC序列不同,则检测出一个CRC错误,如下图所示。
5. 格式错误
当固定形式的场中出现一个或多个非法位时,则检测到一个格式错误。
在CAN报文中,有固定形式的区域包括:
(1)数据帧和远程帧的CRC界定符、ACK界定符、EOF;
(2)错误帧界定符;
(3)过载帧界定符。
以上介绍了CAN协议规定的5种错误类型,并分析了每种错误发生的原因。希望通过本文的介绍,能够使大家对CAN总线有更深入的了解,从场的层面去分析每一帧报文,这样当CAN总线上出现错误时可以有的放矢地解决问题。