Linux can-bus过度重传

Linux can-bus excessive retransmit

我正在从事一个涉及 linux 支持 CAN 总线的嵌入式设备的项目。

我注意到如果我尝试在没有任何东西连接到 CAN 总线的情况下发送 CAN 数据包,内核会自动无限次地重新尝试传输。我可以使用范围来验证这一点——相同的消息会自动一遍又一遍地传输。即使我关闭了创建消息的进程,即使这个进程只尝试传输一条消息,这种重传仍然存在。

我的问题是 - 这是 linux CAN 总线内核的正常行为吗?我担心的是,如果设备出现问题,并且错误地断定它单独在总线上,则该设备可能会淹没总线,导致其他总线参与者无法使用。我原以为会有某种重试限制。

设备使用的是linux4.14.48,can-chip是Philips SJA1000

您看到的可能是错误帧。合规行为是这样的:

  • 节点处于活动状态。它尝试发送一个数据帧,但没有设置 ACK 位,因为没有人在听它。
  • 它会发出一个错误帧,它几乎只包含 6 个显性位以故意破坏位填充。
  • 控制器将重新尝试发送消息。如果在没有收到 ACK 的情况下进行新的发送尝试,将发送另一个错误帧。这将自动重复。
  • 在 128 个错误之后,节点将进入错误被动,它仍然会发送错误帧,但现在处于隐性级别,不会中断其他流量。
  • 总共出现 256 个错误后,节点将总线关闭并完全关闭。

这应该全部由 CAN 控制器硬件处理,而不是 OS。总线关闭后,您可能需要重置或重启 SJA1000。如果它永远不会关闭总线,那么驱动程序代码中的某些内容可能会在一定数量的错误后不断重置 CAN 控制器。

请注意,微控制器实现可能会采取相同的操作并在出现错误时重置,因为这通常是在总线关闭后重新建立通信的唯一方法。这取决于 CAN 应用程序的性质。

简短的回答是肯定的 - 如果 ACK 是唯一的 TEM 错误,计数器将停止在 128 并且不会进入总线关闭状态。它会永远消失。这也发生在我身上,我只是从处理器端关闭了重新传输功能。不确定这是否是 CAN 标准函数。