如何检查 CAN 总线是否空闲

电器工程 能够
2022-01-12 23:52:24

我读了很多关于 CAN 总线仲裁的东西,但它没有回答我的问题。

如果一个节点已经在总线上传输数据并且在另一个节点之间想要启动数据传输,那么“另一个节点”如何知道总线繁忙?

所有文件(我读过的)都假设两个节点同时开始传输,然后一个具有第一个显性位的节点将获得总线,但没有人解释我想知道的条件。

4个回答

简短的回答是节点必须在尝试传输之前监控 CAN 线路空闲一段时间。因此,如果另一个节点正在传输,它必须保持安静,直到另一个节点完成。

CAN 总线基于差分信号。当总线空闲时,两条线 CAN-High (CAN+) 和 CAN-Low (CAN-) 处于相同的电位。为了发送比特,CAN 发送器在线路上施加大约 2 伏的差分电压。

CAN 发送器首先查看总线是否空闲,如果空闲,则开始发送。仲裁的工作原理是发送器在发送时监视总线。如上所述,通过将两条线保持在相同电位或不同电位来完成传输。因此,如果发送器通过将线路保持在相同的电位(原文如此)来传输一点,但它看到两条传输线具有差分电位,这意味着其他一些节点正在传输并且第一个发送器已经失去了仲裁。然后它必须停止传输。

当一个节点第一次开始发送时,发送的比特是相同的,直到发送节点的地址明显不同。如果两个节点一起开始传输,它们将同步传输,直到到达地址部分。当地址不同时,一个节点会注意到线路上的电位差,即使它没有在线路上放置一个。然后它知道它已经输了,必须再试一次。获胜节点在不知道其他节点也在尝试的情况下继续传输。当然,这个逻辑也扩展到两个以上的节点。

我希望这有帮助。

我知道解决它的两种方法:

首先,CAN 控制器将始终监控总线;当它检测到总线上的消息时,它开始接收过程。现在它处于接收状态,当请求发送时它知道总线正在使用中。

其次,通过位填充,CAN 收发器在超过 5 个周期内不会有相同的位(除非检测到总线错误,在这种情况下,您将看到多达 12 个连续的显性位)。例外情况是当总线上没有传输任何内容时,总是读取被动位。刚刚启动的控制器可以在宣布“可能空闲”之前监听总线五个周期。

我不保证这些是实际过程,但根据我对 CAN 的(有限)知识,这些是可行的。

正如 CoderTao 所说 - CAN 控制器不断监控总线,因此它知道何时传输已经在进行中。因此,唯一可能发生冲突的时间是两个节点开始“同时”传输 - 在彼此的一个比特时间内(+少量额外的总线传播时间)。因此,这些是您在文档中找到的唯一案例 :)

节点地址决定优先级,低地址为高优先级。传输从节点广播其地址开始。在它传输的同时,它在监听。假设节点 3 和节点 2 同时传输。作为地址的最后一位,节点 3 广播 1,节点 2 广播 0。因为 0,数据线被拉低到 0 状态。节点 3 看到它广播的不是 1,而是 0 并停止传输。

CAN首先用于汽车和卡车。一些传感器需要比其他传感器具有更高的优先级。例如,防滑制动需要比低挡风玻璃清洗液具有更高的优先级。