一篇易懂的CAN错误帧指南

本文来自于本人公众号的几篇文章的合集,

CAN帧类型中,错误帧可能会经常听到,但又非常陌生。就我做多年软件开发经历,看到过位填充错误,但也没有去分析或解决过错误帧的案例。如果提到Bus off,通讯丢失,E2E之类的,那大多数人都有所耳闻了,为什么会这样呢?这是因为错误帧属于很基础的知识点了,如果对这个基础知识有兴趣,继续下文。

1. 错误帧的基本信息

1.1 错误帧的基本概念

错误帧是用于在接收和发送报文时检测出错误而通知错误的帧,错误帧由错误标志和错误界定符构成,如下所示:

Source: CAN入门书,renesas

由上图不难发现:错误标志包括主动错误标志(6个位的显性位)和被动错误标志(6个位的隐性位)两种。

  • 主动错误标志处于主动错误状态下的单元检测出错误时输出的错误标志。
  • 被动错误标志处于被动错误状态的单元检测出错误时输出的错误标志。
  • 错误界定符由8个位的隐性位构成。

而错误标志重叠的剩余部分显示0~6位,这里为了弄清如何确定具体的位数,需要介绍2个概念:位填充和错误类型。

1.2 位填充

位填充是为防止突发错误而设定的功能。当同样的电平持续5位则添加一个位的反型数据位:

Source: CAN入门书,renesas

注:位填充作用范围为SOF-CRC段间的数据。

1.3 错误类型

错误类型包括位错误,填充错误,CRC错误,格式错误和ACK错误,具体定义如下表:

Source: CAN入门书,renesas

下面对CRC错误和位错误稍作说明,如下分别示意了CRC计算正确和错误的情况

Source:CANPES.pdf

关于位错误, 所谓“发出的电平与从总线上回读的电平不一致”,指的就是节点向总线发出隐性位,却从总线上回读到显性位或者节点向总线发出显性位,却从总线上回读到隐性位这两种情况。

另外,有三种例外情况不属于位错误:

  • 在仲裁区,节点向总线发送隐性位却回读到显性位,不认为是位错误,这种情况表示该节点仲裁失败;
  • 在ACK槽,节点向总线发送隐性位却回读到显性位,不认为是位错误,这种情况表示,该节点当前发送的这一帧报文至少被一个其它节点正确接收;
  • 一个节点发送被动错误标志,该节点向总线发送连续六个隐性位(被动错误标志)却回读到显性位,不认为是位错误。因为被动错误标志是六个连续的隐性位,所以在总线上按照线与机制,有可能这六个连续隐性位被其它节点发送的显性电平覆盖。


2. 错误帧发送

检查到错误后,什么时候发送错误帧呢?按照CAN协议的规定:

  • 当节点检测到位错误、填充错误、格式错误和ACK错误后,就需要开始发送错误帧。
  • 当节点检测到CRC错误后,紧随ACK界定符后的位发送错误帧。

接下来,先通过位错误和填充错误的例子来了解错误帧的发送。当发送节点Node_A发送一个显性位,但是从总线上接收到一个隐性位,于是发送节点Node_A就会检测到一个位错误。当发送节点Node_A检测到位错误后,就立即在下一位开始发送主动错误帧,即6个连续显性位的主动错误标志和8个连续隐性位的错误界定符。

Source: https//blog.csdn.net/weixin_40528417/category_7489864.html

对应着发送节点Node_A发出的主动错误标志,总线上电平为6个连续显性位。此时,接收节点Node_B和Node_C从总线上听到连续6个显性位,那么就会检测到一个填充错误,于是这两个节点都会发送主动错误帧。那么总线电平又有6个连续显性电平,对应接收节点Node_B和Node_C发出的错误界定符,总线电平有8个连续的隐性电平。在间歇场之后,发送节点Node_A重新发送刚刚出错的报文。

再通过接着上面的例子继续了解错误标志重叠,上文介绍错误帧时,提到了错误标志重叠部的剩余部分,它由0~6位构成,但具体是几位并未明确,由上面的例子,我们知道发送节点Node_A因位错误发出主动错误标志,紧着接收节点Node_B和Node_C因填充错误也发出了主动错误标志,这里两个主动错误标志就出现了重叠,如下所示:

不难发现,这里位错误与填充错误重叠2位,即错误标志重叠部的剩余部分为4位。按照下图定义,错误标志重叠部就为10位​。

Source: CAN入门书,renesas

所以错误标志重叠具体几位,取决于相邻两错误标志的重叠位数。 最后,借用CAN/CAN-FD的Bus-Off排查和定位之错误帧2的示波器采集的实际数据再来了解错误帧发送,下图发送节点Tx(紫线)在箭头2到箭头4之间出现连续12us的显性位,而CAN位时间位2us,这意味着出现了连续的6个显性位,即错误帧的主动错误标志。

将差分电压波形(黄线)解析成逻辑电平,结果如下图所示:

3. 错误处理

节点发送错误帧之后,那么节点的状态有啥变化吗?想象一下,如果一个节点一直发送CAN报文错误,或者一个节点一直接收CAN报文错误。那最好是节点有相应的错误处理机制,下面就来了解错误状态

3.1 错误状态

错误状态的种类有:主动错误状态被动错误状态总线关闭态3种状态。

节点始终处于3种状态之一,它们的定义如下:

  • 主动错误状态:可以正常参加总线通信的状态,处于主动错误状态的单元检测出错误时,输出主动错误标志。
  • 被动错误状态:是易引起错误的状态。处于被动错误状态的单元虽能参加总线通信,但为不妨碍其他单元通信,接收时不能积极地发送错误通知;处于被动错误状态的单元即使检测出错误,而其它处于主动错误状态的单元如果没发现错误,整个总线也被认为是没有错误的。处于被动错误状态的单元检测出错误时,输出被动错误标志。
  • 总线关闭态是不能参加总线上通信的状态。信息的接收和发送均被禁止。

这些状态依靠发送错误计算和接收错误计数来管理,决定进入何种状态。错误状态和计数值的关系如下表:

Source: CAN入门书,renesas

3.2 错误计数

以发送错误计数值(TEC)为例,它是根据CAN总线协议的相关定义来变化。比如:

  • 发送节点在输出错误标志时,TEC需要+8;
  • 发送节点在发送主动错误标志时,检测出位错误,TEC需要+8;

假设有这么一个场景:某节点处于主动错误状态,初始TEC为0,一直向总线发送报文,但因干扰原因每次都发送失败(输出错误标志),那么就意味着每次发送都会使得TEC+8,因此发送了16次(TEC=8*16=128)该节点跳转到被动错误状态,再发送16次(TEC=128+8*16=256),该节点跳转到总线关闭态。

因此,理解好下面这个表所列的情况与TEC,REC的变化关系:

Source: CAN入门书,renesas

3.3 错误状态机

了解错误计数的机制后,针对错误状态机,定义了错误计数值与错误状态的关系跳转如下:

  • 当TEC<127且REC<127时,节点处于主动错误状态;
  • 当TEC>127或REC>127时,节点处于被动错误状态;
  • 当TEC>255时,节点处于总线关闭态;
  • 当在总线上检测到128次连续11个位的隐性位时,节点会从总线关闭态跳到主动错误状态。

Source: CAN入门书,renesas

通过以上内容就构建了由错误的出现引起错误计数值变化,进而导致错误状态的跳转,引起节点功能的变化。当节点处于总线关闭态,将不能参加总线上通讯,即CAN报文的接收和发送均被禁止。这意味着对CAN通讯的影响很大,因此接下来将详细介绍什么是Bus off,怎么产生的,又该如何处理等内容。

CAN总线嵌入式开发--从入门到实践

京东

¥50.00

去购买

CAN总线嵌入式开发--从入门到实践

京东

¥50.00

去购买

CAN总线嵌入式开发--从入门到实践

京东

¥50.00

去购买

4. Bus off

从CAN总线协议的定义来说,就是当节点处于被动错误状态时,发送错误计数值(TEC)大于255,那么节点就会跳转到总线关闭态,即Bus off,这时节点就不能参与总线通讯,无法发送和接收CAN报文。我们肯定不允许节点一直处于Bus off,不参与通讯,因此肯定需要有Bus off恢复机制。

当节点进入总线关闭状态后,如果MCU仅是开启自动恢复功能,CAN控制器在检测到128次11个连续的隐性位后即可恢复通信,在实际的CAN通信总线中,这一条件是很容易达到的。以125K的波特率为例,12811(1/125000)= 0.011264s。这意味着如果节点所在的CAN总线的帧间隔时间大于0.011264s,节点在总线空闲时间内便可轻易恢复通信。
我们已经知道,当进入总线关闭状态时,节点已经发生了严重的错误,处于不可信状态,如果迅速恢复参与总线通信,具有较高的风险,因此,在实际的应用中,往往会通过MCU对CAN控制器总线关闭状态的恢复过程进行编程处理,以控制节点从总线关闭状态恢复到错误主动状态的等待时间,达到既提高灵活性又保证节点在功能上的快速响应性的目的。具体包括“快恢复”和“慢恢复”策略,两种策略一般同时应用。

通过以上的讨论,我们可以知道,节点进入总线关闭状态后,存在以下几种恢复情况:

  1. MCU仅开启CAN控制器的自动恢复功能,节点只需检测到128次11个连续的隐性位便可以恢复通信。
  2. MCU没有开启CAN控制器的自动恢复功能,也不主动干预总线关闭错误,节点将一直无法“自动”恢复总线通信,只能通过重新上电的方式使节点恢复, 恢复过程如下图所示。

MCU对CAN控制器的恢复过程进行编程处理,这时节点的恢复行为由具体的编程逻辑决定,快恢复后慢恢复的恢复策略,恢复过程如下图所示。

一般OEM对ECU零部件供应商提出了相应的Bus off恢复策略,比如:先快恢复后慢恢复,恢复时间等需求:

  • 对于快恢复,恢复时间应小于100ms,恢复次数为5次.
  • 对于慢恢复,恢复间隔为1000ms,恢复次数不限。

其实所谓的快慢恢复,即进入CAN总线关闭态后,ECU重新初始化CAN模块,并等待一段恢复时间后,重新使能总线报文的发送。如果报文发送成功,则Bus off恢复成功。

5. 参考

  1. CAN入门书,renesas
  2. CANPES.pdf
  3. CAN总线从入门到放弃(二)- CAN总线错误状态转换 - 知乎 (zhihu.com)
  4. CAN总线错误帧详解-EDN 电子技术设计 (ednchina.com)
  5. CAN通信:Busoff问题知多少 (qq.com)
  6. CAN总线“错误”不在可怕-广州致远电子股份有限公司 (zlg.cn)
  7. 节点BusOff恢复过程分析与测试-广州致远电子股份有限公司 (zlg.cn)

一篇易懂的CAN错误帧指南 (zhihu.com)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值