一文了解CAN 总线错误

文摘   2025-01-08 07:20   上海  

本文将介绍CAN错误处理的基础知识、5 种CAN总线错误类型、CAN错误帧和CAN节点错误状态,结合实际应用情况,在6个实验中生成和记录CAN错误,并讨论如何排除CAN总线错误。具体目录如下:

  • 1 什么是CAN总线错误
  • 2 CAN错误帧
  • 3 5种CAN错误类型
  • 4 状态和错误计数器
  • 5 6个实践实验
  • 6 排除CAN错误
1 什么是CAN总线错误?
CAN如今已成为汽车和工业自动化系统的事实标准,CAN 的核心优势在于其稳健性,这使其成为安全关键应用的理想选择,而CAN错误处理对于CAN的稳健性至关重要。
CAN总线错误可能由多种原因引起,比如电缆故障、噪音、端接不正确和CAN节点故障等。识别、分类和解决此类CAN错误是确保整个CAN系统持续性能的关键。具体来说,错误处理可识别并拒绝错误报文,使发送方能够重新传输该报文。此外,该过程还有助于识别和断开持续传输错误报文的CAN节点。
错误处理是CAN标准和每个CAN控制器的内置部分。换句话说,每个CAN节点都以相同的方式处理故障识别和限制。下面是一个简单的说明性示例:

  • CAN 节点 1 将报文传输到 CAN 总线上,并读取其发送的每个位

  • 在这样做时,它发现一个发送的显性位被读成了隐性位

  • 这是一个“位错误”,节点 1 会发出主动错误标志来通知其他节点

  • 实际上,这意味着节点 1 向总线发送 6 个显性位序列

  • 反过来,其他节点将这 6 个显性位视为“位填充错误”

  • 作为响应,节点 2 和 3 同时发出主动错误标志

  • 这一系列出现错误标志的序列构成了“CAN 错误帧”的一部分

  • CAN 节点 1(发送方)将其“发送错误计数器”(TEC)增加 8

  • CAN 节点 2 和 3 将其“接收错误计数器”(REC) 增加 1

  • CAN 节点 1 自动重新传输报文,现在成功了

  • 因此,节点 1 将其 TEC 减少 1,节点 2 和 3 将其 REC 减少 1
该示例引用了许多我们将很快详细介绍的概念:错误帧错误类型计数器状态

2 CAN总线错误帧

在上例中,CAN节点“引发主动错误标志”,从而响应检测到CAN 错误而创建“错误帧”。
为了了解其工作原理,让我们首先看一个“正常”的 CAN 帧(没有错误),如下所示:

1) CAN 总线位填充

这里强调了CAN帧中的“位填充”。

位填充是CAN标准中一个微妙但至关重要的部分。基本上,它规定每当CAN节点发送五个相同逻辑电平(显性或隐性)的位时,它必须发送一个相反电平的位,接收CAN节点会自动删除这个额外的位,此过程有助于确保网络的持续同步。

按照前面的例子,当CAN节点1在传输CAN报文期间检测到错误时,它会立即传输相同逻辑电平的6位序列,也称为引发主动错误标志。

如果我们通过示波器测量 CAN 帧的传输并将结果数字化,我们还可以在实践中看到填充位(参见红色时间戳标记):

2)主动错误标志

CAN报文序列违反了位填充规则,称为“位填充错误”。此错误对网络上的所有CAN节点都是可见的(与导致此错误标志被引发的“位错误”相反)。因此,错误标志的引发可以看作是一种“全局”错误发现的方式,确保每个 CAN 节点都得到通知。

其他CAN节点会将主动错误标志视为位填充错误。作为响应,它们也会发出主动错误标志。

注意区分错误标志非常重要。具体来说,第一个错误标志(来自“发现”节点)通常称为主动错误标志,而后续“反应”节点的错误标志称为被动错误标志。

对于CAN错误帧的理解,可以通过三个示例场景来看:

示例 1:6 位错误标志
这里,所有CAN节点同时发现CAN报文中存在错误,并同时发出错误标志。

结果是错误标志全部重叠,并且显性位的总序列总共持续 6 位。在这种情况下,所有 CAN 节点都将认为自己是“发现”CAN 节点。

这种类型的同时发现在实践中并不常见。但是,它可能由于格式错误(例如CRC分隔符是显性而不是隐性)而发生,或者如果CAN发射器在写入CRC字段期间遇到位错误。
示例 2:12 位错误标志
这里,CAN 节点1传输一个显性位,但将其读取为隐性位,这意味着它发现了位错误。它立即传输 6 个显性位的序列,其他节点仅在读取完整的6 位之后才发现位填充错误,之后它们同时提高其错误标志,从而产生后续6个显性位序列,即总共12个。
示例 3:9 位错误标志
这里,CAN 节点1已经传输了3个显性位的序列,这时它发现位错误并开始发送6个显性位。一旦经过主动错误标志的一半,节点2和3就会识别出位填充错误(由于3个初始显性位后面跟着另外3个显性位),它们就会开始提升错误标志,结果是来自错误标志的显性位序列变为 9 位长。

上述引发错误标志的逻辑反映在我们所说的‘主动’CAN错误帧中。

特别注意不同节点所引发的次级错误标志如何相互重叠以及主标志和次级标志如何重叠,结果是引发的错误标志的显性位序列可能为6到12位长。该序列始终以 8 个隐性位序列终止,标志着错误帧的结束。

实际上,根据错误发现的时间,主动错误帧可能在错误CAN帧的不同位置“开始”。但结果是一样的:所有节点都会丢弃错误的CAN帧,而传输节点可以尝试重新传输失败的报文。

3)被动错误标志

如果CAN节点从其默认的“主动”状态转变为“被动”状态,它将只能引发所谓的“被动错误标志”。被动错误标志是6个隐性位的序列。在这种情况下,区分发送节点和接收节点发出的被动错误标志是很重要的。
例 4:发送方为错误被动模式
如果发射器(例如示例中的 CAN 节点 1)引发被动错误标志,这将对应于连续的 6 个隐性位序列。这反过来又被所有CAN节点检测为位填充错误。假设其他CAN节点仍处于主动错误标志,它们将引发6 个显性位的主动错误标志换句话说,被动发射器仍然可以“传达”CAN帧有错误的报文。

示例 5:接收方为错误被动模式
相反,如果接收方发出被动错误标志,这实际上对总线上的所有其他CAN节点来说是“不可见的”(因为任何显性位都会胜过隐性位序列)如下所示。

实际上,这意味着错误被动接收方不再具有破坏其他CAN节点传输的帧的能力。

3 CAN 错误类型

接下来来看看哪些错误可能导致CAN节点引发错误标志,CAN总线协议规定了5种CAN错误类型:
  1. 位错误 [发送方]
  2. 位填充错误[接收方]
  3. 格式错误 [接收方]

  4. ACK 错误(确认)[发送方]

  5. CRC 错误(循环冗余校验)[接收方]

上面简要介绍了位错误和位填充错误,这两种错误都是在位级别评估的,其余三种 CAN 错误类型是在报文级别评估的。下面我们详细介绍每种错误类型:
1)位错误
CAN总线上的每个CAN节点都会随时监控信号电平,这意味着发送CAN节点也会“读回”它发送的每个位。如果发送方读取的数据位电平与它发送的数据不同,发送方会将其检测为位错误。
如果在仲裁过程中(即发送 CAN ID 时)发生位不匹配,则不会将其解释为位错误。同样,确认槽(ACK 字段)中的不匹配不会导致位错误,因为 ACK 字段明确要求发送方的隐性位被接收方的显性位覆盖。

2)位填充错误

如上介绍过位填充CAN标准的一部分。它规定在每5个连续的相同逻辑电平位之后,第6位必须是补码,这是通过提供上升沿来确保网络持续同步所必需的。此外,它确保位流不会被误认为是错误帧或标记报文结束的帧间空间(7位隐性序列),所有CAN节点都会自动删除多余的位。
如果在 CAN 报文的总线上(SOF 和 CRC 字段之间)观察到相同逻辑级别的6位序列,则接收方会将其检测为位填充错误,又称填充错误。

3)格式错误

此报文级别检查利用了这样一个事实:CAN报文中的某些字段/位必须始终处于特定的逻辑级别,具体来说,1 位SOF 必须为显性,而整个8 位EOF字段必须为隐性。此外,ACK 和 CRC 分隔符必须为隐性。如果接收方发现其中任何位处于无效的逻辑级别,则接收方会将其检测为格式错误。

4)ACK 错误(确认)

当发送方发送 CAN报文时,它将包含ACK 字段(确认),发送方将在该字段中发送一个隐性位。所有监听的CAN节点都应在此字段中发送一个显性位,以验证报文的接收情况(无论节点是否对该报文感兴趣)。如果发送方未在 ACK 时隙中读取显性位,则发送方会将此检测为ACK错误。

5)CRC 错误(循环冗余校验)

每条 CAN 报文都包含一个15位的循环冗余校验和字段。在这里,发送方计算了CRC值并将其添加到报文中,每个接收节点也将自行计算CRC。如果接收方的CRC计算与发送方的 CRC不匹配,接收方会将其检测为CRC错误。

4 CAN 节点状态和错误计数器

CAN错误处理有助于销毁错误报文,并使CAN节点能够重试发送错误报文。这确保了短暂的局部干扰(例如来自噪声)不会导致无效/丢失数据。相反,发送方会尝试重新发送报文,如果它赢得仲裁(并且没有错误),则报文已成功发送。

但是,如果错误是由于发送节点的系统故障造成的,该怎么办?这可能会引发发送/销毁同一条报文的无限循环,堵塞CAN总线。

这就是 CAN 节点状态和错误计数器发挥作用的地方。

简而言之,CAN错误跟踪的目的是通过适当降低有问题的CAN节点的权限来限制错误。具体来说,我们来看看三种可能的状态:

  1. 主动错误:这是每个CAN节点的默认状态,在该状态下,它能够传输数据并在检测到错误时引发“主动错误标志”
  2. 被动错误:在此状态下,CAN 节点仍然能够传输数据,但现在检测到错误时会引发“被动错误标志”。此外,除了3位间歇时间外,CAN 节点现在还必须等待额外的8位(又称暂停传输时间),然后才能恢复数据传输(以允许其他CAN节点控制总线)
  3. 总线关闭:在此状态下,CAN节点将与CAN总线断开连接,并且无法再传输数据或引发错误标志。
每个CAN控制器都会跟踪自己的状态并采取相应措施,CAN 节点根据其错误计数器的值改变状态。具体来说,每个CAN节点都会跟踪发送错误计数器 (TEC)和接收错误计数器 (REC):
  • 如果REC或TEC超过 127,则CAN节点进入被动错误状态
  • 如果TEC超过255,则 CAN 节点进入总线关闭状态

错误计数器如何变化?在我们了解错误计数器如何增加/减少的逻辑之前,让我们重新审视一下 CAN 错误帧以及主动/被动错误标志。

从CAN错误帧图示中可以明显看出,如果CAN节点在其自身的6个显性位序列之后观察到一个显性位,则该节点将知道它已发出主动错误标志。在这种情况下可以将此CAN 节点称为错误的“发现者”。
乍一看,如果CAN节点能够反复发现错误并迅速做出反应,先于其他节点发出错误标志,这听起来可能很积极。然而,在实践中,发现者通常也是导致错误的罪魁祸首。因此根据概述,它会受到更严厉的惩罚。

上述规则有一些补充/例外,比如CAN节点1会在发现位错误并发出错误标志时将 TEC 增加 8,在这种情况下,其他节点会将其 REC 增加 1。这具直观的后果,如果发送节点连续产生错误的CAN报文,它将很快达到被动错误状态并最终达到总线关闭状态,而接收节点不会改变状态。

接收方发出主动错误标志的情况似乎违反直觉。但如果接收方CAN节点发生故障导致其错误地检测到有效CAN报文中的错误,则可能出现这种情况。在这种情况下,接收方将发出主动错误标志而导致错误,或在所有CAN节点同时发出错误标志的情况下也可能发生这种情况。

5 示例:生成并记录错误帧

到此已经介绍了CAN错误和CAN错误处理的理论基础。接下来看看在实践中如何生成和记录CAN总线错误,为此我们将使用几个CANedge设备以及PCAN-USB设备。

测试 #1:无 CAN 总线错误

作为base,先进行不涉及CAN总线错误的测试。此处,CANedge2“发送方”将数据发送到 CANedge1“接收方”,并且两者都记录了CAN总线错误。
通过在CAN log文件验证了此测试期间没有发生CAN错误,这是符合预期的。

测试 #2:移除CAN总线终端电阻

在此测试中,在CAN记录会话中间移除终端电阻,这实际上相当于立即将位级别设置为显性。因此,CANedge2发送方立即开始记录位错误(当它尝试传输隐性位但读取显性位时发生),CANedge1 接收方在检测到6个连续显性位时记录位填充错误,这些错误会被记录,直到再次添加终端电阻。

如果正记录来自车辆、机器等的数据,那么缺少终端电阻很少会成为实际的CAN总线问题。然而在使用“测试台”设置时,这是一个常见问题,缺少终端电阻可能会造成混淆,因为很难将其与非活动CAN总线区分开。

测试 #3:设置错误的波特率

在本测试中,我们将CANedge1接收方节点的波特率配置为493.827K,而发送方的波特率为500K。这是一个相当极端的差异,导致发送方出现ACK错误,接收方出现位填充错误。

在更现实的场景中,各个节点的波特率配置之间的较小差异可能会导致间歇性错误帧,从而导致消息丢失。

测试 #4:移除确认 CAN 节点

在本次测试中,我们使用三个CANedge单元,配置如下:
  • CANedge1:配置为确认数据
  • CANedge2:配置为“静音模式”(无确认)
  • CANedge3:配置为每 500 毫秒传输一个CAN帧
在默认设置中,数据由CANedge3传输到CAN总线上,并且记录无错误。但是,如果从总线上移除CANedge1,则不再有任何CAN节点来确认发送方发送的帧。

因此,发送方检测到ACK 错误。作为响应,它增加其传输错误计数器并在CAN总线上发出主动错误标志,这些又被 CANedge2(静默监控总线)记录为格式错误。

测试 #5:CAN 帧冲突(无重传)

设置CAN总线时,避免CAN ID重叠是关键。如果不这样做,可能会导致帧冲突,因为两个 CAN 节点可能都认为自己赢得了仲裁,因此开始同时发送其帧。为了模拟这种情况,我们使用与测试 #4 相同的设置。此外,我们连接一个PCAN-USB设备作为辅助发送方。
CANedge3发送方现在配置为每10毫秒发送一个CAN帧,CAN ID为1,有效载荷为八个0xFF字节。此外将CANedge3配置为禁用因错误而中断的帧的重传。PCAN-USB每2 毫秒发送一个相同的CAN帧,有效载荷的第一个字节更改为0xFE。PCAN设备已启用重传。
此设置会快速产生帧冲突,导致CANedge和PCAN发送方检测到位错误。对此两者都会发出主动错误标志,CANedge接收方会将其检测为位填充错误。PCAN设备会立即尝试重新发送并成功,而CANedge会等待进一步传输,直到发送下一条报文。

这种错误当然不应该发生在汽车等设备上,因为设计和测试过程将确保所有CAN节点都通过全局唯一的CAN标识符进行通信。但是如果使用第三方设备将数据注入现有CAN总线,则很容易发生此问题。如果不确保外部CAN节点的CAN ID的全局唯一性,则可能会导致帧冲突,从而导致CAN总线错误。

测试#6:CAN 帧冲突(包括重传)

在此测试中,我们使用与之前相同的设置,但现在我们在CANedge3发送方上启用重传。在这种情况下,由于 CANedge3 和 PCAN-USB 设备都尝试重新发送中断的报文,因此帧冲突会导致一系列帧冲突。
由于产生的位错误,两者都会引发总共16个主动错误标志,这些标志被静默的 CANedge2接收方检测为位填充错误 。然后两个发射方都进入被动错误模式并停止引发主动错误标志,这意味着它们都无法破坏总线上的CAN帧。因此,其中一个发送方将成功传输完整报文,从而结束重新发送狂潮,并使两个设备都能恢复发送,但这只会持续几秒钟,然后就会发生另一次冲突。
冲突处理很好地说明了CAN错误处理在“关闭”潜在问题序列和使CAN节点恢复通信方面的有效。如果发生帧冲突,则两个CAN节点都可能会尝试重新发送,如果没有错误处理和限制,这将导致拥塞。

6 如何排除 CAN 错误

实际上,在开发和数据记录过程中,经常会遇到CAN总线错误。错误程度可能有所不同:可能会遇到100%的CAN错误,这是由于诸如测试台设置终止不当之类的基本问题造成的,或者可能试图通过排除CAN总线位时序问题来消除关键远程报文处理项目中令人沮丧的 0.1% 报文丢失。下面概述列出了CAN总线错误的最常见根本原因以及如何排除故障。
我们将“ACK”列为首要问题之一,这是因为CAN总线错误的最常见原因之一是用户尝试使用外部记录器/接口记录来自单个CAN总线节点的数据。此时记录器/接口可能支持“静默模式”,设备不会确认(ACK) CAN报文。因此由于测试台网络上只有一个其他CAN节点,因此通信将完全失败。解决方案只是在此类测试设置中禁用静默模式,CANedge还支持“受限”模式,阻止设备发送CAN帧,但允许其确认其他设备发送的CAN报文。
虽然在上述设置中应禁用静音模式,但建议在CAN总线数据记录器连接到活动CAN总线时启用它以进行现场部署。这有助于确保外部数据记录器不会以任何方式干扰安全关键的 CAN 通信。这一点尤其重要,因为如果位时序配置与CAN总线不完全匹配,外部设备可能会将 CAN 总线错误引入系统。
从列表中可以明显看出,可能遇到的一个常见问题与比特率问题有关。当然,如果将配置为以500K进行通信的CAN节点连接到以250K运行的CAN总线,则通信将完全失败。
但是,当节点的位时序配置存在细微差异时,就会出现更微妙的问题。比如可能连接两个CAN节点,它们都以250K运行,但由于间歇性CAN总线错误(例如0-1%的丢失),仍然会经历帧丢失。要解决此问题,可能需要更改其中一个CAN节点(例如外部CAN总线数据记录器)的位时序配置,使其更接近另一个CAN节点的设置。

创作不易,欢迎点赞再看收藏关注

汽车研发交流群,有兴趣的朋友请添加群主:prOmiseyes,备注:公司+职务入群。仅限汽车从业人员。

谦益行
分享汽车研发日常,助力你我共同成长。
 最新文章