CAN错误处理

CAN怎样处理错误

错误处理机制内建在CAN协议中,对于CAN系统的性能极其重要。错误处理的目的是检测CAN总线上报文中的错误,从而发送方可以重传错误的报文。总线上的每个CAN控制器都将尝试检测报文中的错误。如果发现错误,发现节点将发送错误标志,因而会销毁总线通信。其它节点将检测由错误标志引发的错误(如果它们尚未检测到初始错误)并采取合适的操作(例如丢弃当前报文)。

每个节点维护两个错误计数器:发送错误计数器和接收错误计数器。有几个规则规定这些计数器如何增加和/或减小。总的来讲,检测到故障的发送方增加其发送错误计数器比侦听方增加其接收错误计数器要快。这是因为有很大可能故障在于发送方!当任何错误计数器超过特定值时,节点将先变成“错误被动”,也就是说,它在检测到错误时不会主动销毁总线通信,然后变成“离线”,这表示节点根本不参与总线通信。

通过使用错误计数器,CAN节点不但可以检测故障,而且可以进行错误限制。


错误检测机制

CAN协议定义了至少五种不同方法来检测错误。其中两种方法工作在比特等级,其它三种方法工作在报文等级。

  1. 比特监视。
  2. 比特填充。
  3. 帧检查。
  4. 确认检查。
  5. 循环冗余检查。

比特监视

CAN总线上的每个发送器都监视(也就是读回)发送的信号电平。如果真正读到的比特等级与发送的不同,会发出“比特错误”信号。(仲裁过程期间不会发出任何比特错误。)

比特填充

节点在发送五个具有相同电平的连续位后,将在发送的位流中加入第六个相反电平的位。接受方将删除这个额外的位。这样做是为了避免总线上过度的DC成分,但是这还给予接受方额外的机会来检测错误:如果总线上出现多于五个具有相同电平的连续位,将发出“填充错误”信号。

帧检查

CAN报文的一些部分有着固定的格式,也就是说,标准明确定义必须出现什么样的电平以及何时出现。(那些部分是CRC分隔符、ACK分隔符、帧结尾以及间断,但是针对间断有一些额外的特殊错误检查规则。)。如果CAN控制器在任一这些固定字段中检测到无效值,将发出“组成错误”信号。

确认检查

总线上所有正确收到报文的节点(不管它们是否对报文内容感兴趣)都需要在报文中所谓的确认槽中发送一个显性电平。此时,发送方将发送一个隐性电平。如果发送方无法在确认槽中检测到显性电平,将发出“确认错误”信号。

循环冗余检查

每条报文都带有15位的循环冗余检验和(CRC),任何节点如果检测到报文中的CRC与自己计算得到的结果不同,将发出CRC错误信号。


错误限制机制

总线上的每个CAN控制器将尝试在每条报文中检测以上所述的错误。如果发现错误,发现节点将发送一个错误标志,从而销毁总线通信。其它节点将检测错误标志引起的错误(如果它们尚未检测到初始错误)并采取合适的操作(也就是丢弃当前报文)。

每个节点维护两个错误计数器:发送错误计数器和接收错误计数器。有几个规则规定这些计数器如何增加和/或减小。总的来讲,检测到故障的发送方增加其发送错误计数器比侦听方增加其接收错误计数器要快。这是因为有很大可能故障在于发送方!

节点启动时处于“错误积极”模式。当两个错误计数器中任何一个的计数超过127时,节点将进入称为“错误消极”的状态。当发送错误计数器的计数超过255时,节点将进入“离线”状态。

  • “错误积极”节点在检测到错误时将发送“积极错误标志”。
  • “错误消极”节点在检测到错误时将发送“消极错误标志”。
  • “离线”的节点根本不会发送任何内容。

增加和减小错误计数器的规则稍显复杂,但是原理很简单:发送错误分配8个错误点,接收错误分配1个错误点。正确发送和/或接收的报文可以减小计数器的值。例子(经过稍许简化):我们假设总线上的节点A运行不佳。每次A试图发送一条报文,都以失败告终(不管什么原因)。每次发送失败时,A把发送错误计数器的值增加8并发送积极错误标志。然后A将试图重传报文,但是同样以失败告终。

当发送错误计数器的读数超过127(也就是16次尝试)时,节点A进入“错误消极”状态。区别在于A现在将在总线上发送“消极错误标志”。消极错误标志由6个隐性位组成,不会破坏其它总线通信,所以其它节点不会听到A在抱怨总线错误。但是,A继续增加其发送错误计数器。当计数器值超过255时,节点A最终放弃并进入“离线”状态。

其它节点怎样对待节点A?对于A发送的每个积极错误标志,其它节点将为它们的接收错误计数器值加1。当A进入“离线”状态时,其它节点的接收错误计数器的值将远远低于“错误消极”的限制(也就是127)。对于每个正确接收到的报文,这个值将减1。但是,节点A将保持离线。

 

大部分CAN控制器将为两种状态提供状态位(和对应的中断):

  • “错误警告” – 一个或两个错误计数器的计数都超过96。
  • 离线(如上所述)。

一些控制器(但不是所有)还为“错误消极”状态提供一个位。一些控制器还提供对错误计数器的直接访问。

CAN控制器在发生错误时自动重传报文的习惯有时候很烦人。市场上至少有一种控制器(来自Philips公司的SJA1000)允许完全手工控制错误处理。


总线故障模式

ISO 11898标准列出CAN总线线缆的几种故障模式:

  1. CAN_H中断
  2. CAN_L中断
  3. CAN_H短路至电池电压
  4. CAN_L短路至地线
  5. CAN_H短路至地线
  6. CAN_L短路至电池电压
  7. CAN_L短路至CAN_H线路
  8. CAN_H和CAN_L在同一位置中断
  9. 丢失与终端网络的连接

对于故障1-6和9,建议总线以减小的S/N比率继续运行。对于故障8,建议剩余的子系统继续运行。对于故障7,可以选择以减小的S/N比率继续运行。

实践中,使用82C250类型收发器的CAN系统不会在发生故障1-7时继续运行,在发生故障8-9时不一定可以继续运行。

不过,市场上存在可以处理所有故障的“可容错”控制器(例如TJA1053)。通常,这种容错的代价是受限制的最大速度。对于TJA1053,最大速度被限制为125 kbit/s。