CAN 总线:差分、仲裁与错误帧撑起的高可靠车载网络
更新时间:2026-09-12。本文是「集成电路大类 · 芯片设计」**进阶层(intermediate)**数字逻辑第九十七篇。UART/SPI/I2C解决板内短距通信,而发动机舱里电机点火、长线束、强电磁干扰要求一种「线搭在一起还能仲裁、出错能自动隔离」的总线——这就是 CAN。理解它也为车载以太网、FlexRay 等更高层网络打基础。
本文要回答的问题
- 为什么用 CANH/CANL 两根差分线,显性 0 和隐性 1 在电平上长什么样?
- CAN 没有主设备、没有片选,多个节点同时说话怎么不撞坏数据?
- 为什么帧里没有目标地址,只有一个 ID?ID 越小越优先?
- 位时序的采样点、SJW、四段和终端 120Ω 电阻各管什么?
- 一个节点持续出错,总线怎么自动把它隔离(bus-off)又允许恢复?
一、物理层:差分、线与、终端电阻
CAN 只用一对双绞线 CANH/CANL 差分传输(加地),抗共模干扰:
- 显性 dominant = 逻辑 0:发送器把 CANH 拉高(≈3.5V)、CANL 拉低(≈1.5V),差分约 +2V;
- 隐性 recessive = 逻辑 1:两线都回到偏置中点 ≈2.5V,差分≈0;
- 总线是线与:只要有一个节点发显性,全总线就是显性——这正是仲裁能「显性覆盖隐性」的物理基础;
- 总线两端各并 120Ω 终端电阻(匹配双绞线特性阻抗、吸收反射),不能每个节点都加;
- 高速 ISO 11898-2 可达 1Mbps(经典 CAN,CAN FD 数据段更高),低速容错 CAN 可到 125kbps 但允许单线故障继续工作。
二、帧结构:ID 标识「是什么消息」而非「发给谁」
标准数据帧:SOF(1 个显性起始)→ 仲裁段(11 位 ID + RTR)→ 控制段(IDE/r1/DLC 长度)→ 数据段(0~8 字节,CAN FD 最多 64B)→ CRC 段(15 位 CRC +界定)→ ACK 槽+界定 → EOF(7 隐性)。没有源/目的地址:ID 表示消息内容/优先级,所有节点收到后用验收滤波器决定是否接收(发布/订阅式)。连续 5 个同电平位后自动插入一个反相的位填充位(SOF~CRC 段),保证有沿可同步、也防伪造长显性。
三、非破坏性逐位仲裁:边发边听
CAN 是多主、节点随时可在总线空闲时发送,靠仲裁段解决冲突且不破坏任何帧。机制是「线与 + 边发边回读」:
- 多个节点从 SOF 后逐位输出 ID,并同时采样总线;
- 谁输出隐性 1却采样到显性 0,说明有人在发更低(更优先)的 ID,立即退出仲裁转为接收,不再参与本位之后的输出;
- 坚持到仲裁段结束的唯一节点赢得总线、继续发数据,落选者等本次帧结束后自动重发;
- 因为仲裁发生在 ID 段、且显性优先,ID 数值越小优先级越高;整个过程胜出者的位流没被打断,数据无损,不需要冲突后的整包重传(这就是「非破坏性仲裁」)。
要保证仲裁成立,仲裁段信号必须在一个位时间内传遍全网(这也是经典 CAN 速率受总线长度限制、CAN FD 仲裁段保持低速而数据段提速的原因)。
四、位时序与同步
一个标称位时间分四段:同步段、传播段、相位缓冲段 1、2,由位定时寄存器(如 BRP 分频、TSEG、SJW)设定;节点多数时间在位时间的一个采样点(常 75%~87.5% 处)读总线。各节点晶振有误差,靠每帧 SOF 和填充位的下降沿做硬/再同步,并用 **SJW(同步跳转宽度)**补偿相位差——所以 CAN 能用精度一般的晶振。设计要按总线长度算位率、采样点和振荡器容限。
五、错误检测、错误帧与 bus-off
CAN 把可靠性做进硬件,定义 5 类错误:位错误(发的和回读的不一致,仲裁除外)、填充错误、CRC 错误、格式错误、ACK 错误(发送者在 ACK 槽没等到任何接收者拉显性)。
- 检出错误的节点立即发错误标志(主动错误发 6 个连续显性,破坏位填充让全网都察觉)使当前帧作废,随后自动重发;
- 每个节点维护 TEC/REC 发送/接收错误计数:正常时接近 0;持续出错计数增加,节点从主动错误→被动错误(只能发隐性错误标志、少打扰总线)→计数过阈值进入 bus-off(完全脱离总线,不再干扰),之后在监测到规定数目的连续空闲位后可自动恢复,实现对故障节点的渐进隔离与自愈;
- CRC 覆盖帧内容、ACK 槽由任一正确接收者拉显性应答(哪怕没有任何节点想要该 ID,只要物理上正确收到就会 ACK)。
与板内 I2C 相比,CAN 是差分、多主、非破坏性优先级仲裁、强错误隔离;CAN FD 在保仲裁兼容前提下把数据段提到更高速率、数据扩到 64 字节;更高带宽场景由车载以太网/FlexRay 补充,但 CAN(及 CAN FD/CAN XL)因成本和鲁棒性仍是车身与工业主干。
与现有篇目的衔接
总结
一句话总结:CAN 是为汽车强干扰环境设计的多主差分异步串行总线,物理层用 CANH/CANL 双绞线,显性逻辑 0 把两线拉开约 2V、隐性逻辑 1 使两线同处约 2.5V,总线天然线与并在两端各接 120Ω 终端电阻吸收反射;帧由 SOF、仲裁段、控制段、0~8 字节数据(CAN FD 提速并扩到 64 字节)、CRC、ACK 和 EOF 组成,不含目标地址而是用 ID 表示消息内容和优先级、各节点靠验收滤波决定是否接收,并用连续五同电平后插反相位的位填充保证可同步;多节点同时发送时在仲裁段边发边回读,谁发隐性却读到显性就知道有更低 ID 在竞争而主动退出,ID 越小优先级越高、胜出者位流不被打断故为非破坏性仲裁、落选者帧后自动重发;位时间分四段并在 75%~87% 的采样点读值,靠帧头和填充沿做再同步、用 SJW 容忍晶振误差;硬件检测位、填充、CRC、格式、ACK 五类错误,发现即发错误标志作废并自动重发,同时用 TEC/REC 计数把持续故障节点从主动错误降为被动错误再到 bus-off 彻底脱离总线、满足条件后自愈,从而既鲁棒又不会让一个坏节点拖垮全网。