导读
入门三篇讲完了“测什么、怎么连、分几域”,还顺手看了工具链。从这篇起正式进入协议深水区——阶段二 · CAN/LIN 总线。本篇全部依据《车载通信协议入门培训》课件整理,把 CAN 的物理层、帧结构、最精髓的“非破坏性仲裁”,以及课件里讲得很透的错误帧、错误状态机、过载帧、报文发送类型、波特率与采样点一次讲清。吃透这篇,CAN 测试就有了 root。
一、CAN 是什么,为什么非它不可
CAN(Controller Area Network)是 1986 年博世为汽车发明的串行通信协议,后来被 standardized 为ISO 11898。它的几个关键标签:
- 多主(Multi-Master):总线上任何节点都能主动发,没有“主机”;
- 差分(Differential):用一对双绞线传信号,抗干扰极强;
- 广播 + 报文滤波:发的是“ID + 数据”,谁关心谁收;
- 强错误检测与容错:有错误帧、自动重发、错误计数器与离线(Bus-Off)保护。
对比一下你熟悉的:UART 是点对点、I2C/SPI 有主从且距离短,而 CAN 专为复杂电磁环境里多节点可靠通信而生——这正是车载场景的刚需。课件里一句话点得很准:“现代汽车是一个高度集成的电子系统,发展到今天,CAN 总线依然是网络通信的基石。一辆中高端汽车通常包含多条 CAN 总线,连接超过 50 个 ECU。”
回顾:前面“五大域”里动力域、底盘域、车身域都跑 CAN/CAN FD,所以它必须第一个吃透。
二、物理层:差分信号与终端电阻(重点)
CAN 用一对双绞线CAN_H / CAN_L传输,只有两种电平状态:
| 状态 | 逻辑值 | CAN_H | CAN_L | 说明 |
|---|---|---|---|---|
| 隐性 Recessive | 1 | ≈ 2.5 V | ≈ 2.5 V | 总线释放,靠终端电阻上拉 |
| 显性 Dominant | 0 | ≈ 3.5 V | ≈ 1.5 V | 节点主动驱动,覆盖隐性 |
2.1 线与逻辑(Wired-AND)
这是 CAN 最反直觉也最关键的一点:显性(0)可以覆盖隐性(1)。
- 只要任意一个节点驱动总线为“显性 0”,整条总线就是 0;
- 只有所有节点都发隐性 1时,总线才是 1。
这叫“线与”——像多个开关并联接地,一个按下就导通。靠它才能实现后面的“非破坏性仲裁”。
2.2 终端电阻的作用
课件专门强调:终端电阻的作用是“匹配阻抗,消除信号反射”。总线两端各接一个120 Ω 终端电阻,当信号到达线缆末端时,阻抗匹配让能量被吸收而不是反射回来叠加,避免波形振铃导致误采样。不接或只接一端,高速通信时反射会让眼图闭合、误码率飙升。
- 经典 CAN 最高1 Mbps(约 40 m 内);速率越高,允许的总线距离越短;
- 差分传输让共模干扰(如电机点火噪声)被两端相减抵消,抗干扰能力是单端信号比不了的。
三、数据帧结构(重点)
CAN 有标准帧(11 位 ID)和扩展帧(29 位 ID)。标准帧结构紧凑,是最基础、应用最广泛的格式;扩展帧的仲裁场含基本 ID + 扩展 ID,共 29 位,能支持海量节点与复杂报文类型,是构建大型 CAN 网络的基础。入门以标准数据帧为主:
| 段 | 作用 |
|---|---|
| SOF 帧起始 | 1 个显性位,标志一帧开始 |
| 仲裁段 | 11 位 ID + RTR(远程帧标志),ID 决定优先级 |
| 控制段 | IDE(标准/扩展)+ DLC(数据长度 0~8 字节) |
| 数据段 | 0~8 字节有效数据(CAN FD 可到 64 字节) |
| CRC 段 | 15 位校验 + 界定符,保证数据完整 |
| ACK 段 | 接收节点回确认 |
| EOF 帧结束 | 7 个隐性位 |
位填充(Bit Stuffing)
发送方在连续 5 个相同位之后,强制插入 1 个相反位。接收方收到后自动剔除。目的:保证总线上有足够的跳变沿,让所有节点能持续同步、也能检测“填充错误”。
测试视角:DLC 是否越界、实际数据字节数是否与 DBC 定义一致、CRC 是否正确、位填充是否合规——这些都是 CAN 一致性测试的高频检查点。
四、非破坏性仲裁(核心)
多主同时想发怎么办?CAN 用非破坏性仲裁优雅解决:
- 所有节点同时发,仲裁段从 ID 最高位开始比;
- 发“隐性 1”却读到“显性 0”的节点,立刻知道自己优先级低,主动退出发送(不发送剩余位);
- 最高优先级(ID 最小)的节点无损赢得总线,帧不被破坏;
- 退出的节点等总线空闲后自动重发。
因为靠“线与逻辑”,高优先级节点全程不知道有人在让,它的帧一个位都没被破坏——所以叫“非破坏性”。
对比以太网 CSMA/CD:冲突后双方都停、都重发,是“破坏性”的,浪费带宽。CAN 在 arbitration 阶段就分出了胜负,更高效、更确定。
测试视角:仲裁失败节点的退让行为是否合理?两个节点配了相同 ID会怎样?优先级反转(低 ID 一直霸占总线、高 ID 饿死)如何验证?——这些都是 CAN 测试工程师的看家题。
五、错误检测与错误帧(重点)
CAN 的可靠性不是靠“祈祷”,而是靠一套硬件级本能反应。课件把这部分讲得很透,这里完整梳理。
5.1 五种错误
只要节点检测到以下任意一种错误,底层 CAN 控制器就会自动且立即发送错误帧,完全由芯片状态机完成,属于硬件级“本能反应”:
| 错误类型 | 触发场景(课件案例) |
|---|---|
| 位错误 (Bit Error) | 节点发送的同时回读总线,发出与读回的电平不一致(仲裁段和 ACK 段例外,不判定位错误) |
| 填充错误 (Stuff Error) | 连续 5 个相同位后未插入相反位,或错误插入了相反位 |
| CRC 错误 (CRC Error) | 接收方自算 CRC 与发送方附带的 CRC 不一致 |
| 格式错误 (Form Error) | 帧中固定必须为隐性位的保留位被检测为显性 |
| ACK 错误 (ACK Error) | 发送方在 ACK 槽没读到显性位,说明没人确认 |
5.2 错误帧长什么样
错误帧 =错误标志 + 错误界定符:
- 主动错误标志:6 个连续的显性位“000000”;
- 被动错误标志:6 个连续的隐性位“111111”;
- 之后是 8 个连续的隐性位(错误界定符),用于隔离。
注意:错误帧主体就是“6 个连续显/隐性位 + 8 个连续隐性位”,它本身会违反位填充规则——但协议规定错误帧豁免填充检查,所以不会自己触发填充错误。
5.3 双 8 位错误计数器:TEC 与 REC
CAN 用两个计数器实现“精准识别与网络防护”:
- TEC(Transmit Error Counter)发送错误计数:记录发送侧错误(位错误、填充错误等),随发送失败累加;
- REC(Receive Error Counter)接收错误计数:统计接收侧异常(格式错误、ACK 错误等)。
核心思想:惩罚错误,奖励正确。
| 场景 | TEC | REC |
|---|---|---|
| 发送节点检测到错误 | +8(重罚,因影响全网) | — |
| 接收节点检测到错误 | — | +1(轻罚) |
| 严重位错误 | — | +8 |
| 正常发送/接收一帧且无错 | −1(最小 0) | 若 1<REC≤127 则 −1;REC 为 0 或 >127 不变化 |
5.4 错误状态机:主动 → 被动 → Bus-Off
节点依据 TEC/REC 数值进入三级状态,构成分布式容错体系:
- 主动错误状态 (Error Active):TEC < 128 且 REC < 128,健康态。检测到错误会主动发“主动错误标志”,正常参与通信。
- 被动错误状态 (Error Passive):TEC ≥ 128或REC ≥ 128,亚健态。只能发“被动错误标志”,且发送后需等待额外延时,避免干扰总线。
- 总线关闭 (Bus-Off):TEC > 255时触发,节点被逻辑“踢出”网络,不能收发任何报文,需复位或计数器清零才能恢复。
Bus-Off 智能恢复:硬件内置机制,检测到128 次连续的 11 个隐性位后,自动清零错误计数器,恢复至主动错误状态,确保网络自愈。软件也可实施快恢复 / 延迟慢恢复策略,防止故障节点反复震荡。
测试视角:故意注入位错误 / 填充错误,观察节点是否按 TEC/REC 规则迁移状态;强制触发 Bus-Off,验证快/慢恢复策略是否符合需求——这是动力域、底盘域 CAN 测试的硬指标。
六、过载帧与报文发送类型
6.1 过载帧
过载帧用于处理节点“来不及处理”的过载状态。它的标志同样是连续 6 个显性位——课件特意留了个思考题:“为什么过载帧连续 6 个位的显性电平不会报错?”答案是:过载帧标志本身就被协议定义为 6 个显性位,属于豁免帧,不参与填充错误判定(和错误帧同理)。
6.2 报文发送类型
整车 CAN 报文按触发方式分为四类,测试时要分别验证:
- 固定周期型:按固定周期发送(如车速 10 ms 一帧);
- 事件周期型:有事件才发,但限定最大周期(事件型的上限兜底);
- 使能周期型:需先被使能,再按周期发送;
- 事件型:仅事件触发时发送,无周期。
七、波特率与采样点
- 波特率:单位是比特每秒(bps),决定每位持续多长时间;仲裁段靠它竞争总线控制权。
- 采样点:在一个比特时间内进行信号采样的位置。课件给的例子“波特率 5 Mbps、采样点 75%”含义是:数据以每秒 500 万比特传输,在每个比特时间的 75% 处采样判定该位是 0 还是 1。
实战经验:采样点通常设在比特时间的70%~80%(常见 75%)。同一总线上的节点采样点必须一致,否则一位还没采到就被下一位冲掉,会大面积丢帧、错帧。这也是为什么 CAN 一致性测试必测“采样点”。
八、CAN 应用场景
现代汽车是高度集成的电子系统,CAN 至今仍是网络基石。一辆中高端车通常包含多条 CAN 总线(动力 CAN、底盘 CAN、车身 CAN 等),连接超过 50 个 ECU。其高可靠性、实时性和多主特性,使其在动力总成、底盘控制、车身电子等对安全性和确定性要求极高的领域,依然是不可替代的通信骨干。