CAN总线错误

移除CAN总线终端电阻

移除CAN 终端电阻,这可以有效地将位电平设置为显性。同时,CANedge2发送器立即开始记录位错误(当它尝试发送隐性位但读取显性位时会发生这种情况)。CANedge2 接收器在检测到 6 个连续显性位时记录位填充错误。记录这些错误,直到再次添加终止。

设置错误的波特率

在这个测试中,我们将CANedge接收器节点配置为具有492.872K波特率,而发送器的波特率为500K,这是一个相当大的差异,并导致发送器的ACK错误和接收器的位填充错误。在更现实的场景中,各个节点的波特率配置的较小差异可能会导致间歇性错误帧,从而导致消息丢失。

这个例子比较极端,然而,在实践中,我们有时会看到使用标准比特率(250K、500K、……)的CAN总线,但其特定的位时序设置与通常推荐的设置不同。这不会导致通信完全关闭,但会导致几个百分比的周期性帧丢失。为了解决这个问题,可以在CANedge配置中构建一个“预定义比特率”,本质上是设置位时序以更好地匹配正在记录的CAN总线。

移除应答CAN节点

CANedge1:配置为应答数据

CANedge2 A:配置为“静默模式”(无确认)

CANedge2 B:配置为每 500ms 传输一个 CAN 帧

在默认设置中,数据由 CANedge2 B 传输到 CAN 总线上并无错误记录。但是,如果我们从总线上移除 CANedge1,则不再有任何 CAN 节点来确认发送器发送的帧。结果,发送器检测到ACK 错误。作为响应,它增加其发送错误计数器并在 CAN 总线上产生活动错误标志。这些又由 CANedge2 A(它静默监控总线)记录为格式错误。

CANedge之所以会记录格式错误,是因为发送器在识别出ACK时隙中缺少显性位时将其提高,一旦接收器在随后的EOF字段中观察到显性位(本该是隐性的),就会检测到格式错误。

很明显,当TEC从0增加到16x8=128时,发送器会广播16个主动错误标志。发送器现在已超过TEC的阈值127并进入被动错误模式。因此,发送器仍然会遇到ACK错误,但现在只会引发被动错误标志(接收器不可见)。在这一点上,发送器不断尝试发送相同的帧,并且接收器不断记录这个重传序列。

这种类型的错误是我们在技术支持中经常遇到的错误。具体来说,用户会尝试使用我们的CAN记录器来记录来自单个CAN节点的数据(例如从CANmod传感器到CAN模块),如果他们决定在这样的安装中启用CANedge上的“静默模式”,则没有CAN节点将确认单个CAN节点广播数据,这样得到的结果大概率将是空日志文件,或充满相同CAN帧重传的日志文件。

CAN帧冲突(无重传)

设置CAN总线时,避免CAN ID重复是关键,否则可能会导致帧冲突,因为两个CAN节点可能都认为他们已经赢得了仲裁,并同时开始传输它们的帧。

为了模拟这一点,我们使用与测试4相同的设置。此外,我们连接了一个PCAN-USB设备作为辅助发送器。CANedge2发送器现在配置为每10ms输出一个CAN ID为1且有效负载为8个0xFF字节的CAN帧。此外,我们将CANedge2配置为禁用因错误中断的帧的重新传输。PCAN-USB每2ms输出一个相同的CAN帧,有效载荷的第一个字节更改为0xFE。PCAN设备已启用重传。

这种设置会迅速产生帧冲突,从而导致CANedge和PCAN发送器检测到位错误。作为对此的响应,两者都会引发一个活动错误标志,CANedge接收器将其检测为位填充错误。PCAN设备立即尝试重新传输并成功,而CANedge等待进一步传输,直到要发送下一个消息。

这种类型的错误当然不应该发生在例如汽车中,因为设计和测试过程将确保所有 CAN 节点通过全球唯一的 CAN 标识符进行通信。但是,如果您安装第 3 方设备(例如传感器到 CAN 模块)以将数据注入现有 CAN 总线,则很容易出现此问题。如果您不确保外部 CAN 节点的 CAN ID 的全局唯一性,您可能会导致帧冲突,从而导致 CAN 总线上的错误。如果您的外部 CAN 节点广播具有高优先级 CAN ID 的数据,这一点尤其重要,因为您可能会影响安全关键 CAN 节点。

CAN帧冲突(包括重传)

在这个测试中,我们使用与之前相同的设置,但在CANedge2发送器上启用重传。在这种情况下,帧冲突会导致一系列后续帧冲突,因为CANedge2和PCAN-USB设备都试图重新传输其中断的消息。

由于产生的位错误,两者都会引发总共16个活动错误标志,它们被静默CANedge2接收器检测为位填充错误。然后两个发送器进入错误被动模式并停止产生主动错误标志,这意味着它们都不能破坏总线上的CAN帧。结果,其中一个发送器将成功传输完整的消息,从而结束重传,并使两个设备都能恢复传输。但是,这仅持续几秒钟,然后发生另一次碰撞。

冲突处理是一个很好的例子,说明CAN错误处理在“关闭”潜在有问题的序列和使CAN节点能够恢复通信方面很有效。如果发生帧冲突,很可能两个CAN节点都将设置为尝试重传,如果不是错误处理和限制,则将导致阻塞。

你可能感兴趣的:(CAN通讯,单片机,stm32)