CAN总线空闲检测

CAN bus idle detection

对于CAN,帧在遇到SOF (0) 时开始。但是假设我们的系统刚刚加入 CAN 总线。它如何能够检测到新 CAN 帧的开始?

EOF 由 7 个隐性位加上 3 个 IFS(帧间间隔)位组成。所以我们可以等待 10 个连续的 1,然后如果之后切换到 0,我们可以认为这是一个开始新框架。

但是,如果之前只连接了一个节点呢?然后如果我们看到 ACK 位是 1,ACK 分隔符位是 1,7 个 EOF 帧位是 1。所以在三个 IFS 位之前我们只得到一个 10 位(隐性)。如果我们的节点在IFS位周期开始发送数据,系统会发生什么?

抱歉,我的假设有误。如果我们看到 CAN 帧结构,那么节点需要监视总线,如果检测到 11 个连续位为“1”,则只有节点会认为总线空闲。

上面语句的解释。

一个 ACK_DELIMETER 位,七个 EOF 位和三个 IFS 位。

因此,现在如果我们假设只有一个节点连接到系统,并且下一个节点在第一个节点传输 CAN 帧的数据部分时连接。

然后第二个节点会检测,CRC-DELIMETER中的一个,ACK_SLT,ACK_DELIMETER,七个EOF位,三个IFS位。如果节点 2 有数据要发送,那么它会在 IFS 时间的两位发送它,考虑到此时总线处于空闲状态(因为 11 位的 1 值来了)。

但是根据 Bosch 的 CAN 2.0 协议规范,如果节点检测到 1 中的 0 位和 IFS 时间的两位,则它会发送开始过载标志。所以在这里节点 1 将开始发送过载标志,并且从下一次开始通信将正常工作。

如果 1 也作为 CRC 的最后一位,则会发生同样的事情,那么第二个节点可能会在 IFS 时间的第 1 个位开始发送帧,而节点 1 将开始发送过载帧规范的一部分。

如果您认为这不是这样做的方式,请随时分享评论。