【问题标题】:Linux can-bus excessive retransmitLinux can-bus 过度重传
【发布时间】:2020-12-09 07:48:57
【问题描述】:

我正在开展一个项目,该项目涉及支持 CAN 总线的 linux 嵌入式设备。

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

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

设备使用的是linux 4.14.48,can-chip是飞利浦SJA1000。

【问题讨论】:

    标签: linux can-bus


    【解决方案1】:

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

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

    这一切都应该由 CAN 控制器硬件处理,而不是由操作系统处理。一旦 SJA1000 总线关闭,您可能需要重置或重启 SJA1000。如果它从不关闭总线,那么驱动程序代码中的某些内容可能会在出现一定数量的错误后不断重置 CAN 控制器。

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

    【讨论】:

    • 感谢您的回复!那我的设备肯定有问题。它不传输错误帧,它只是不断地连续不断地输出相同的帧,没有任何延迟,永远。如果我没看错的话,这是对 CAN 总线规范的公然违反。
    • @avl_sweden 是的,好吧......驱动程序可能在失败时重置控制器。但我仍然希望在这种情况下看到一些错误帧。你确定你没有在“环回”中运行它吗?也就是说,控制器被告知与自己对话并忽略实际总线的调试模式?
    • 我不认为它在“回环”中。一旦我将某些东西连接到总线,它会响应“Ack”,总线就会正常工作。仅当没有任何响应时才会出现此问题。但我现在注意到了一些事情。它确实传输错误帧。前 16 次重传实际上在它们之后附加了一个错误帧!
    • 根据这个链接:port.de/cgi-bin/CAN/CanFaqErrors,传输错误计数器不应该仅仅因为错误被动节点没有收到确认而增加。难道这就是为什么它从不去公共汽车吗?那么原则上可能没有什么问题?无限重传只是有点奇怪吗?
    • @avl_sweden 我不记得所有肮脏的细节,但想想看,它可能会一直持续发送错误帧,专门针对无 ACK 错误。我必须去阅读 CAN 标准才能确定。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 1970-01-01
      相关资源
      最近更新 更多