目录

错误检测

Bit error 位错误

Stuff error 填充错误

CRC error 校验错误

Form error 格式错误

ACK error

错误计数器

错误计数器的计数规则

CAN错误状态

主动错误状态

被动错误状态

离线状态

如何理解三种错误状态

错误状态迁移

如何理解错误状态机的迁移

2. 总线上有节点工作不正常,经常被发出有错误的数据


控制器局域网络(Controller Area Network, CAN)是当今汽车和工业自动化系统的重要标准。可靠性是CAN总线协议的核心优势之一,这使其成为安全关键应用的理想选择。但值得注意的是,错误处理对CAN的稳健性来说至关重要。

CAN总线错误的发生可能有多种原因,比如电缆故障、噪声、不匹配的终端电阻、CAN节点故障等。识别、分类和解决此类CAN错误是确保整个CAN系统持久性能的关键。错误处理可以识别和拒绝错误的信息,使发送者能够重新传输信息。此外,该过程有助于识别和断开持续传输错误信息的CAN节点。

CAN 总线的错误管理主要需要从三个方便进行分析

1. 错误检测机制

2. 错误计数机制

3. 错误状态

错误检测

CAN控制器可以通过收发器监测总线电平,并在接收、发送时对报文进行错误检测,控制器应提供以下错误检测机制。

  • 总线监测(也就是通过收发器回环到RX PIN来监测总线电平)
  • 位填充检查
  • 帧格式检查
  • CRC校验
  • ACK检查

 

检查到错误有五种错误类型,它们并不相互排斥(也就是可以同时出现)。

  1. Bit error 位错误
  2. Stuff error 填充错误
  3. CRC error 
  4. Form error
  5. ACK error

Bit error 位错误

在总线上发送比特的节点也应监视总线。 当监视的位值与发送的位值不同时,认为检测到位错误。
例外:
 在仲裁期间发送隐性信息位时,显性位不应导致位错误,或者在 ACK 时隙期间发送了一个隐性位;
 发送被动错误标志并检测到显性位的节点不应将此解释为位错误。

 

Stuff error 填充错误

在帧字段中连续六个相等位电平出现时,认为检测到填充错误,因为帧字段应通过位填充的方法进行编码。(超过5个相等电平就应该插入一个相反的电平)

 

CRC error 校验错误

CRC 序列应由发送器的 CRC 计算结果组成。 接收器应以与发送器相同的方式计算 CRC。 当计算出的 CRC 序列不等于接收到的序列时,应检测到 CRC 错误。

 

 

Form error 格式错误

当固定格式位字段包含一个或多个非法位时,应检测到格式错误。
例外:
 接收器在 EOF 的最后一位监测显性位,或任何节点在错误定界符或过载定界符的最后一位监测显性位,不应将此解释为形式错误。

ACK error

每当发送器在 ACK 时隙期间没有监测到显性位时,它就会检测到一个 ACK 错误。

 

错误计数器

每个CAN控制器内部都有两个计数器,分别为接收错误计数器REC和发送错误计数器TEC。

两个计数器长度都为8bit,上电后为0,最大计数到255。

  • Receive error counter(REC):接收错误计数器
  • Transmit error counter(TEC):发送错误计数器

错误计数器的计数规则

当节点在发送或接收数据时,如果检测到错误,对应的错误计数器就会增加1或者8。

当成功接收或发送一帧数据,对应的计数器就减1。

错误计数器详细的更新规则如下:

错误计数器应根据以下规则进行更新(在给定的帧传输期间可以应用多个规则)。
a) 当接收器检测到错误时,接收错误计数器REC+ 1。例外:发送活动错误标志、过载标志期间的位错误。
b) 当接收器在发送错误标志后检测到显性位作为第一位时,接收错误计数器REC+8。
c) 当发送器发送错误标志时,发送错误计数器REC+8。
        1) 例外 1:如果发送器是错误被动状态,并且由于未检测到显性 ACK 而检测到 ACK 错误,并且在发送其被动错误标志时未检测到显性位。
        2) 例外 2:如果发送方因为仲裁期间发生填充错误而发送错误标志,因此,填充位应该是隐性的,并且已作为隐性发送但被监视为主导的。
        在这两种例外情况下,传输错误计数器保持不变。
d) 如果发送器在发送活动错误标志或过载标志时检测到位错误,则发送错误计数器TEC+8。
e) 如果接收器在发送活动错误标志或过载标志时检测到位错误,则接收错误计数器TEC+8。
f) 在发送活动错误标志、被动错误标志或过载标志后,任何节点都应容忍最多7 个连续显性位。在检测到第14个连续显性位后(在活动错误标志或过载标志的情况下)或在被动错误标志后检测到第 8 个连续显性位之后,并且每当在出现额外的8个连续显性位序列之后,REC和TEC都需要+8。
g) 成功传输一个帧后(收到 ACK 并且没有检测到错误,直到 EOF 被检测到完成),传输错误计数器应减1,直到为0。
h) 成功接收一个帧后(接收到 ACK 时隙没有错误并且成功ACK 位的发送),接收错误计数器应减 1,如果它介于1和127。如果接收错误计数器为0,则应保持为零 (0),如果它大于127,则应将其设置为介于119和127。

CAN错误状态

CAN节点的错误状态机用于表明节点当前的错误状态。

错误状态由3种状态组成

  • error-active:主动错误状态
  • error-passive:被动错误状态
  • bus-off:离线状态

不同的错误状态下,节点对错误产生后的处理机制是不同的,错误状态的命名其实也是按照当前状态下对错误的反应来命名的,而不是指示当前的节点错误。

主动错误状态

主动错误状态为节点的默认状态,在该状态下,如果节点在接收或发送数据时吗,检测到RX PIN从总线上接收到的报文有错误,那么节点可以发送错误帧(连续6个显性电平)。发送错误帧的目的有两个。第一是通知其他节点,总线上出现了错误。第二,破坏掉当前检测到有错误的这帧报文。防止错误报文被其他节点接收。

被动错误状态

错误被动状态的“被动”是相较错误主动状态而言,在错误被动状态下的节点,如果检测的总线错误,不能主动发送错误帧。但当前错误的数据不会被节点接收。

离线状态

当节点进入离线状态,不能再进行数据收发。

如何理解三种错误状态

简单来说,错误主动即使发现错误后主动打断这一帧错误并通知其他节点。这样的行为可以理解为当前节点认为自己状态很健康,发现错误有必要主动采取措施,保证整个总线的数据正常传输。

而错误被动的节点,可以认为是节点发现出错太多,这些错误很有可能是自身的原因产生的,对自身的状态产生怀疑,所以不再主动对总线上的错误采取措施(我自己知道错误就行了,不要再给总线上其他节点添乱)

而离线状态,则是节点发现错误过于频繁,并且很多错误是由自己发送产生的,此时需要将自己从总线上隔离出去,防止进一步影响其他节点通讯。

错误状态迁移

三种错误状态的迁移主要由两个错误计数器来完成。

当两个计数器其中一个超过127,节点就会进入错误被动,关闭错误帧的发送。

当发送错误计数器达到255时,节点直接进入离线状态,进行自我隔离

CAN错误状态机迁移图

如何理解错误状态机的迁移

当出现错误时,错误计数器进行累加,并且大部分比的错误,计数器都是直接加8。而正常收发一帧数据,计数器只会减1。这样的设计结合状态迁移的规则,是非常巧妙的,考虑如下几种场景。

1. 总线工作健康,只是由于短时间的干扰偶发一两个错误

所以如果只是偶发的几个错误导致错误计数器增加了一些值,在正常收发数据的节点,错误计数器都会很快会自减,不会超过127。所以节点会一直处于错误主动状态。

2. 总线上有节点工作不正常,经常被发出有错误的数据

如果错误帧/正常帧的比例超过1/8,那么错误计数器的值就会持续累加。如果节点状态短时间恢复正常,那么还可以继续工作。但是如果节点发生了永久性的故障,持续的发生错误,那么错误计数器持续增加超过127或者255,节点就会进入错误被动或者总线关闭状态

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐