CAN总线学习总结2——CAN错误及CAN busoff处理机制

CAN总线学习总结2——CAN错误及CAN Busoff处理机制

CAN总线具有严格的错误诊断功能,该功能已经固化在芯片中,一旦错误被检测,正在传送的数据帧将会立即停止而待总线空闲时再次重发直至发送成功,该过程并不需要CPU的干涉,除非错误累计该发送器进入总线关闭(Bus Off)。

一:CAN错误帧

错误帧由两个不同的场组成。第一个场是不同节点提供的错误标志重叠部分;第二个场是错误界定符。
CAN总线学习总结2——CAN错误及CAN busoff处理机制_第1张图片

  • 主动错误标志:6个连续的显性位
  • 被动错误标志:6个连续的隐性位
  • 错误界定符:8个连续的隐性位
  • 错误标志之后还有0~6个错误标志重叠部分,这一段的形成在“1.1 错误标志”和四:“错误通知”段中详细讲解。

1.1 错误标志

错误标志分为主动错误标志和被动错误标志两种:

  • 主动错误标志:
    主动错误标志由6个连续的显性位组成。处于主动错误状态的节点检测到错误时会发送主动错误标志。主动错误标志会违反位填充规则和位场的固定形式,这会造成其它节点也检测到错误并发送错误标志(错误标志重叠部分形成的原因)。所有节点所发送的显性序列叠加组成错误标志重叠部分。错误标志重叠部分的长度在6-12个显性位之间。
    Q:会不会存在一个节点处于主动错误状态,其他节点处于被动错误状态?(“4.1 位错误通知_3)”)
  • 被动错误标志:
    被动错误标志由6个连续的隐性位组成,被动错误标志可能会被其他节点的显性位改写。(必须为6个连续的隐性位才能代表被动错误标志发送完成)(应当理解为节点发送了6个连续隐性位就行,而不需要关注总线上的状态有没有被其他节点改写。)
    如果是一个发送节点发送被动错误标志,将会导致接收节点的位填充错误。以下两种情况除外:1:如果处在仲裁期间,且其他节点取得总线控制权;2:被动错误标志发送开始于小于CRC序列结束前的第六位的位置。(因为位填充检测结束于CRC序列)
    如果一个接受节点需要发送被动错误标志,它不会诱发总线上的任何活动,当检测到6个连续的隐性位才认为被动错误标志被送出。

1.2 错误界定符

错误界定符由八个连续的隐性位组成。当发送完错误标志后,所有节点开始向总线发送一个隐性位,并检测到总线电平为隐性时,发送余下的七个隐性位。

二:CAN错误类型

CAN总线学习总结2——CAN错误及CAN busoff处理机制_第2张图片

2.1 位错误

向总线发送一个位的节点同时会监控总线,当监控到总线的位数值和发送的位数值不一致时,则鉴定为一个位错误。(SOF到EOF的位使用位错误检测)
例外:
1)在仲裁或者ACK期间发送隐形位,但是检测到显性位时,不鉴定为位错误。
2)发送被动错误标志的节点在检测到显性位时,不鉴定为位错误。

2.2 填充错误

当出现6个连续的相同电平时,鉴定为填充错误。
注:SOF到CRC序列的结束的位使用位填充错误检测

1.3 CRC错误

当接收节点计算的CRC结果与接收到的CRC结果不一致时,鉴定为CRC错误。

1.4 形式错误

当固定的位场中,出现一个或者多个非法位时,鉴定为形式错误。(固定格式位场(CRC界定符、ACK界定符、帧结束)检测到一个或更多显性位
例外:
1)接收节点在EOF的最后一位检测到显性位,不鉴定为形式错误。
2)任何节点在错误界定符或过载界定符的最后一位检测到显性位,不鉴定为形式错误。

1.5 应答错误

在应答间隙期间,发送节点未检测到显性位,则鉴定为应答错误。

三:CAN错误界定

CAN节点可以区分常规错误和永久故障。有故障的发送节点将切换到总线关闭状态。总线关闭状态在逻辑上与总线断开,既不能发送也不能接收

3.1 CAN错误状态

对于错误界定,节点存在如下三种状态:

  • 主动错误
  • 被动错误
  • 总线关闭
    CAN总线学习总结2——CAN错误及CAN busoff处理机制_第3张图片
  • 主动错误:
    处于主动错误状态的节点能正常参与总线通信的收发,当检测到错误时将发送主动错误标志,错误标志由6个连续的显性位组成(这种连续的6个显性位与常规的填充位和其它帧固定格式不相同,正因为如此,硬件才容易区别)。
    如果是发送节点发送主动错误帧,这种情况相当于刚刚发送的那帧报文我发错了,我现在主动破坏它,其他节点不管接收到什么都不算数;
    如果是接收节点发送主动错误帧,这种情况相当于刚刚接收的那帧报文出错了,我现在主动站出来告诉大家这个错误,并把这帧报文破坏掉,刚才你们不管接收到什么都不算数

Tips:处于主动错误状态,说明这个节点目前是比较可靠的,出现错误的原因可能不是它本身的问题,即刚刚检测到的错误可能不仅仅只有它检测到,正因为如此,整个总线才允许它破坏正在发送中的报文。

  • 被动错误:
    处于被动错误状态的节点不能发送主动错误标志。它能参与正常通信,但当检测到错误时发送的是被动错误标志。被动错误标志由6个连续的隐性位组成。当发送结束后,处于被动错误状态的节点在下一次再次发送时之前需要等待一些额外时间。
    如果是发送节点发出被动错误帧,刚刚被发送的报文被破坏。错误帧发送完成后,接着的是帧间隔(3个隐性位)和“传输延时段”(8个隐性位),这时总线上的其他节点就可以判断总线处于空闲状态并参与总线竞争。这种机制可以让其他处于主动错误状态的节点优先使用总线。
    如果是接收节点发出被动错误帧,则不会对总线产生任何影响

Tips:处于被动错误状态,说明这个节点目前是不可靠的,出现错误的原因可能是它本身的问题,即刚刚检测到的错误可能只有它自己检测到,正因为如此,整个总线不会信任它的报告,从而只允许它发送6个连续的隐性位,这样才不会拖累其他节点。

  • 总线关闭:
    处于总线关闭状态的节点不允许发送和接收任何形式的帧报文。且只能通过用户请求进行恢复。
    注:由于存在实现方式的不同,CAN总线关闭状态存在只允许用户请求恢复和检测到128个11位连续的隐性位时自恢复两种不同的恢复形式。

Tips:如果总线上只有一个节点,该节点发送数据帧后得不到应答,TEC最大只能计数到128,即这种情况下节点只会进入被动错误状态而不会进入总线关闭状态。

3.2 CAN错误计数

CAN总线学习总结2——CAN错误及CAN busoff处理机制_第4张图片

四:CAN错误通知

总线通信错误以向总线发送错误帧作为标志。
位错误、填充错误、格式错误或者ACK错误产生后,将在当前发送位的下一位发送错误帧;
CRC错误产生后,紧随ACK界定符后的位发送错误帧。

错误帧发送完成后,总线空闲时自动重发出错的数据帧。

4.1 位错误通知

1)如下图所示:

  • 假设总线上所有节点处于主动错误状态;
  • 当一个发送节点监控到总线上的位数值与发送的位数值不一致时,检测为位错误,并发送主动错误标志(6个连续的显性位);
  • 接收节点接收到发送节点发送的6个连续的显性位时,会检测为位填充错误,也会发送主动错误标志;
  • 发送节点发送完主动错误标志后,开始监控总线是否为隐性位,当总线为隐性位时,开始发送错误界定符(8个连续的隐性位);
  • 当接收节点发送完主动错误标志后,开始向总线发送错误界定符;
  • 等待错误帧发送完成,总线空闲后,发送节点重新发送出错的报文;
    注:由于发送节点发送6个连续的显性位会破坏位填充规则,触发接收节点发送主动错误标志,发送节点和接收节点的结合是形成错误标志叠加部分的原因。(如下图所示错误标志重叠部分为6+6个显性位)

CAN总线学习总结2——CAN错误及CAN busoff处理机制_第5张图片
2)如下图所示:
错误重叠部分为6+4个显性位
CAN总线学习总结2——CAN错误及CAN busoff处理机制_第6张图片
3)如下图所示:

  • 假设发送节点处于被动错误状态,接收节点处于主动错误状态;
  • 当发送节点监控到总线上的位数值与发送的位数值不一致时,检测为位错误,并发送被动错误标志(6个连续的隐性位);
  • 接收节点接收到发送节点发送的6个连续的隐性位时,会检测为位填充错误,并会发送主动错误标志;
  • 发送节点发送完被动错误标志后,开始监控总线是否为隐性位,当总线为隐性位时,开始发送错误界定符(8个连续的隐性位);
  • 接收节点发送完主动错误标志后,开始监控总线是否为隐性位,当总线为隐性位时,开始发送错误界定符(8个连续的隐性位);
    CAN总线学习总结2——CAN错误及CAN busoff处理机制_第7张图片

4.2 格式错误通知

1)如下图所示:

  • 假设总线上所有节点处于主动错误状态;
  • 当接收节点和发送节点检测到总线上的格式错误时,向总线上发送主动错误标志;
    CAN总线学习总结2——CAN错误及CAN busoff处理机制_第8张图片

4.3 CRC错误通知

1)如下图所示:

  • 假设所有节点都处于主动错误状态;
  • 当接收节点检测到CRC错误后,在ACK界定符之后,向总线发送主动错误标志;
  • 发送节点检测到格式错误(EOF的固定格式为7个连续的隐性位),同时向总线发送主动错误标志;
    注:错误标志重叠部分为6+1个显性位

-CAN总线学习总结2——CAN错误及CAN busoff处理机制_第9张图片

五:CAN错误恢复

由于实现的方式不同,CAN busoff如下存在两种不同的形态:

  • 处于总线关闭状态的节点对总线没有任何影响,不允许发送任何帧,ACK,错误帧,过载帧。是否允许接收取决于实现方式 (能进不能出)。在检测到128个11位连续的隐性位后,节点可由总线关闭状态可以恢复到主动错误状态。
  • 处于总线关闭状态的节点不允许任何发送和接收,只有用户请求才可以恢复。

(注:在接触过的MC9S08DZ…、MC9S12XEP…、S32K…系列单片机,在实现方式上都可通过配置寄存器的方式,关闭或者使能CAN总线BUSOFF自恢复功能。)

5.1 CAN BUSOFF恢复过程

  • 节点进入总线关闭状态后,普遍采用的是 快慢恢复 的形式:
  1. 立即重新初始化 CAN 芯片;
  2. t(tBusOffQuick 或 tBusOffSlow)时间内应暂停发送报文,分为快速恢复和慢速恢复;
  3. 恢复到正常 CAN 通信。
    CAN总线学习总结2——CAN错误及CAN busoff处理机制_第10张图片
  • 节点进入总线关闭状态后:
  1. 首先,ECU 执行快速恢复模式;
  2. 连续 5 次快速恢复后,ECU 执行慢速恢复模式;
    注:所谓的快慢恢复,即进入CAN BUSOFF状态后,ECU重新初始化CAN模块,并等待t(tBusOffQuick 或 tBusOffSlow)后,重新使能总线报文的发送。如果报文发送成功,则CAN BUSOFF恢复成功;如果报文发送失败,当TEC > 255时总线会再次BUSOFF状态,再次执行恢复操作。
    CAN总线学习总结2——CAN错误及CAN busoff处理机制_第11张图片
  • 当节点进入总线关闭状态后:
    当ECU进入Bus-off状态后,因为不能接收到相关ECU(相关ECU:至少从该节点接收一条
    报文)的报文,会产生逾时错误,但此时,只存储bus-off故障,不存储其他ECU的报文超
    时故障。当ECU从Bus-off状态恢复之后,则立即重新启动报文超时监测功能。
    CAN总线学习总结2——CAN错误及CAN busoff处理机制_第12张图片

你可能感兴趣的:(CAN总线,can)