在CAN总线上传输具有相同ID的不同消息


12

CAN仲裁是使用ID完成的,总线上的任何节点都可以使用任何ID进行传输(理想情况下不应该,但讨厌的节点可以)。

如果连接在同一CAN总线上的两个不同节点传输具有相同ID但具有不同数据字节的消息怎么办?

我的想法:它将在公共汽车上产生垃圾。谁拥有那些占主导地位的比特,谁就会被传输。


1
我不确定他们为什么这样做。我本以为将仲裁应用于整个消息更有意义。
Rocketmagnet 2012年

Answers:


12

CAN规范的第6.1节:

位错误:在总线上发送位的单元也监视总线。当监视的位值与发送的位值不同时,必须在该位时间检测到位错误。例外是在仲裁字段的填充位流中或在ACK时隙中发送“隐性”位。

因此,首先发送一个“ 1”而另一个发送“ 0”的节点将注意到一个比特错误,然后通过发送错误标志(见3.1.3节)以正常方式发出错误信号,如正式描述的那样在第6.2节中。

非正式地,如果该节点是错误活动的(应该是通常情况),它将发送6个显性位的错误标志,所有其他节点也将检测到(作为填充错误)。这样会完全破坏该消息:

  • 没有人会收到它
  • 没有一个发射器会认为他们已经成功发射了任何东西。

然后,每个发送器将尝试重新发送-根据重新发送的精确时间,一个可以在另一个之前充分启动,然后再进行总线的增益控制。否则,可能会再次发生相同的顺序。(否则,另一个更高优先级的消息可能会使它们同时退出一段时间!)


扩展的答案受@clabbacchio下面的答案的启发。

您提到了“讨厌的节点”,而clabbacchio提出了一个有效的观点,即如果两个节点在不同的时间发送,则每个接收器都需要决定如何处理其多次接收。

去年的一次黑客攻击证明了这一点。本文在“ PSCM规范”部分中讨论了攻击者如何与总线上的常规消息同步并在“好” ECU即将发送该消息之前播放其恶意消息。接收方ECU接受较早的消息,更新其消息计数器,然后将“好”消息丢弃为错误消息,因为其消息计数器尚未增加。


1

在您的问题中,您做出以下假设:

谁拥有那些占主导地位的比特,谁就会被传输。

假设这两个消息是在完全相同的时间发送的,这是更普遍问题的一种特殊情况。Martin的有效答案涵盖了这个特定问题,但是忽略了(更一般的)两个节点在不同时间进行传输的情况。

在这种情况下,将在总线上流通两条具有相同ID但有效载荷不同的消息,并且接收者的逻辑是区分这两条消息并确定是否是他们需要接收的内容。如果他们无法区分这两个消息,则它们可能会误解数据并导致更严重的问题,而不仅仅是错误帧。

例如,说一条消息包含温度传感器的读数,另一条消息包含执行器在同一字节上的目标位置(应该永远不要发生),您可能会让执行器在不知道的情况下将其作为目标。


是的,应该实现一种逻辑来区分两个消息。但是我的问题是,如果仲裁是根据ID进行的,那么如果消息ID相同且数据不同,将会发生什么。
斯旺德

@Swanand仅基于同步传播的假设吗?只要注意这是一个
极端的

0

如果消息数据字段不同,则由于错误的CRC,您(希望!)将在总线上得到一个错误帧。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.