[CAN] CAN BUS的错误检测和错误状态管理

目录

错误检测

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,节点就会进入错误被动或者总线关闭状态

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值