20251114 - CAN 的“位时序(Bit Timing)” 与 “CAN 报文(Frame)” 的关系是什么?
“线与(wired-AND)在 CAN 总线优先级仲裁机制中的应用”
🟦 一、什么是“线与(wired-AND)”
在 CAN 总线中,信号是差分形式,但逻辑上可以理解为:
- dominant(显性) = 0
- recessive(隐性) = 1
总线上的多个节点是 “线与” 关系(wired-AND):
只要有一个节点发送 dominant(0),总线就呈现 dominant(0);
只有所有节点都发送 recessive(1),总线才是 recessive(1)。
逻辑就像:
总线 = 节点1 AND 节点2 AND 节点3 AND ...
也就是:0 优先于 1。
这就是 CAN 能实现“无冲突、无中心仲裁”的基础。
🟦 二、线与结构如何实现优先级仲裁?
CAN 的 ID 越 小,优先级越 高,原因正是:
仲裁位是显性=0、更高优先级。
我们来看一个实际例子。
假设有三个节点同时发报文:
| 节点 | 想发送的 ID(二进制) | 优先级 |
|---|---|---|
| A | 0010 0001 | 高 |
| B | 0100 0010 | 中 |
| C | 0110 0100 | 低 |
三者从最高位开始发送:
▶ 步骤 1
第一位:
A: 0
B: 0
C: 0
总线 = 0(显性)
三者都继续
▶ 步骤 2
第二位:
A: 0
B: 1
C: 1
总线 = 0(因为A发显性)
这时,B 和 C 发现:
- 自己发送的是 1(隐性)
- 但是总线读到 0(显性)
说明 有更高优先级节点存在(优先级更高 ID 更小)。
于是 B、C 自动停止发送,进入“被仲裁”状态,只剩 A 继续。
🟦 三、为什么 CAN 无冲突?因为 wire-AND + “边发边读”
CAN 在仲裁阶段使用:
✔ 边发送边监听(bit monitoring)
✔ 显性压倒隐性(wire-AND)
因此:
- 不会出现两个节点“撞车冲突”
- 低优先级节点发现压不过 0,就乖乖停
- 高优先级节点完全不会受到干扰,继续无损发送
这就是 无冲突总线(collision-free bus) 的关键。
🟦 四、总结一句话(最关键)
CAN 通过 wire-AND(显性 0 优先)实现多节点同时竞争时的无冲突仲裁,ID 越小、显性位越多的报文优先级越高。
浙公网安备 33010602011771号