错误处理是CAN总线额外的安全保障机制,其实没有这个错误处理机制CAN总线也能实现完整的收发操作,但CAN总线发生错误时有一定的处理机制会比较好。

错误处理机制是当某一个设备检测出传输的帧出现错误时,该设备会发出错误帧来破坏数据(主动错误状态)或者拉开总线(被动错误状态),破坏数据的话别的设备就会收到通知扔掉该错误的数据。


1 错误类型

错误共有5种: 位错误、填充错误、CRC错误、格式错误、应答错误。

解释(完整每一栏解释见“位错误”,后续解释类比“位错误”,不再解释那么详细):

(1)位错误:

  • 内容:发送方发出的位与回读的位(总线上的数据)不一致或者接收方发出的位与回读的位(总线上的数据)不一致,由于接收方不一定始终为接收方,也可能发送数据,故接收方也需要检测位错误。【不包含仲裁规则时的回读(回读不一致表示仲裁失利)还有ACK应答位(发送方发1回读0,这个0是接收方的应答操作。)】
  • 错误的检测帧(即检测的范围):数据帧和遥控帧的全部、错误帧、过载帧
  • 检测单元:即发送方和接收方都需要检测是否有位错误。

(2)填充错误:

  • 内容:即没有按填充规则正确填充,正确填充的话不会出现连续6个相同电平。
  • 错误的检测帧(即检测的范围):只需要数据帧和遥控帧的SOF到CRC段(因为后续的CRC界定符,ACK等都是固定格式,不需要位填充,故也不需要进行检测错误)
  • 检测单元:即发送方和接收方都需要检测是否有位错误。

(3)CRC错误

  • 内容:即接收方收到数据,根据数据帧或者遥控帧的前面内容自己再计算一遍CRC,是否与发来的CRC相同(发来的CRC是发送方通过算法算得的)。
  • 检测单元:只有接收方需要检测CRC错误。

(4)格式错误

  • 内容:在帧格式的定义中,有一些位是固定设置0或者1的,看这些位有没有设置正确。
  • 检测单元:只有接收方需要检测格式错误。

(5)ACK错误:

  • 内容:发送方发出数据后,没有设备产生应答(ACK为1),则表示发生了ACK错误。
  • 检测单元:只有发送方需要ACK错误。

2 错误状态

此前,我们学习错误帧的时候有主动和被动两种状态。

如果只有主动状态,一旦某一个设别检测出错误就发出错误帧直接破坏数据,其他设备也无法用,但如果这个设备本身出现了问题,就是不断乱发错误,那么就会影响整个CAN的正确传输,因此就需要被动错误状态,出现问题的设备主动放开总线,不影响其他设备的接收,因此CAN总线定义了几种错误状态来避免这个情况。

2.1 错误状态及其转换

下图是三种状态如何进行转换的图:

  • 主动错误状态的设备正常参与通信并在检测到错误时发出主动错误帧,会破坏总线上的数据。
  • 被动错误状态的设备正常参与通信(正常收发)但检测到错误时只能发出被动错误帧,不会破坏别的设备的通信。
  • 总线关闭状态的设备不能参与通信(相当于关小黑屋了!)。

设备默认为为从主动错误状态起始,每个设备内部管理一个TEC(发送错误计数器)和REC(接受错误计数器),根据TEC和REC的值确定自己的状态。

2.2 TEC和REC

TEC和REC均为 \geq 0,根据以下表格TEC和REC进行加减。

理解:

(10) 总线关闭态后,又检测到128次11个隐性,则TEC和REC归零,说明回到主动错误状态。

3 实例讲解

以出现ACK错误为例:

(1)设备处于主动错误状态,发送标准数据帧,正常传输。

  • 第一个框为数据帧ACK段的前面部分,发送正常;
  • ACK槽这一位总线拉开,说明有设备应答,没有出现ACK错误;
  • 7位结束标志EOF后再跟了三位帧间隔后才能开始下一帧数据传输,如果接收方过载的话,三位帧间隔就会被换成过载帧,再开始下一帧数据传输;
  • ACK界定符+7位EOF+3位帧间隔(主动状态)刚好达到11个隐性电平(逻辑1),代表总线空闲,可以进入下一帧。


(2)设备处于主动错误状态,发送标准数据帧,检测到ACK错误。

  • 同样,第一个框为数据帧ACK段的前面部分,发送正常;
  • ACK槽这一位总线没有被拉开(逻辑1),说明没有设备应答,出现ACK错误;
  • 由于此时设备是主动错误状态,故发送的是主动错误帧(下图中绿色框和蓝色框,6个0+8个1),那么传输的数据就会被破坏掉。

  • 8位错误界定符+3位帧间隔(主动状态),刚好达到11个隐性电平(逻辑1),代表总线空闲,可以进入下一帧。

而当设备连续出现16次主动错误状态下检测到了ACK错误,就会进去(3),此前,这16次检测到的ACK错误都是(2)这样的情况。

(3)设备处于被动错误状态,发送标准数据帧,检测到ACK错误

  • 同样,第一个框为数据帧ACK段的前面部分,发送正常;
  • ACK槽这一位总线没有被拉开(逻辑1),说明没有设备应答,出现ACK错误;
  • 由于此时设备已进入被动错误状态,故发送的是被动错误帧(下图中绿色框和蓝色框,6个1+8个1),那么该设备就放开总线,但不会破坏别的设备的数据。

  • 、注意,此时是被动状态的帧间隔,故需要3位帧间隔+8位延迟传输,这里刚好11个隐性电平(逻辑1),代表总线空闲,可以进入下一帧。


注:以上均是通过学习参考文献、哔哩哔哩网站上江协科技官方号以及网络资源所得的个人经验,如有侵权,请联系我,欢迎指正。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐