4. CAN基础
CAN(Controller Area Network)是现场总线中应用最广的串行通信协议之一,最初由 Bosch 为汽车电子设计,如今已扩展到工业控制、电力监控、电梯、医疗设备等领域。理解 CAN 的关键,不是记住“它很快”,而是理解它如何用差分信号、非破坏性仲裁、位定时同步和多重错误检测在强干扰环境中实现可靠通信。本节围绕帧格式、仲裁、位定时、错误界定和 CAN FD 五个核心点展开。
一、CAN 2.0A/B 帧格式:显性位与隐性位构成的消息结构
CAN 总线采用差分信号传输,逻辑上分为显性位(Dominant,逻辑0)和隐性位(Recessive,逻辑1)。当多个节点同时发送时,显性位会覆盖隐性位,这一“线与”特性是仲裁和错误检测的基础。CAN 2.0A 使用 11 位标识符的标准帧,CAN 2.0B 同时支持 11 位标准帧和 29 位扩展帧。
一帧标准数据帧由以下字段组成:
- SOF(帧起始):1 位显性位,用于硬同步。
- 仲裁场:11 位标识符 + RTR 位,决定优先级和帧类型。
- 控制场:IDE、r0 和 4 位 DLC,DLC 表示数据长度(0~8 字节)。
- 数据场:0~8 字节有效数据。
- CRC 场:15 位 CRC 序列 + 1 位 CRC 界定符,用于校验。
- ACK 场:ACK 槽 + ACK 界定符,接收节点正确接收后拉低 ACK 槽。
- EOF(帧结束):7 位隐性位。
扩展帧在仲裁场中增加 SRR、IDE 和 18 位扩展标识符,使标识符达到 29 位。标准帧与扩展帧可在同一总线上共存,但标识符位数不同,仲裁时需注意优先级设计。
二、仲裁机制:非破坏性逐位仲裁
CAN 最精妙的设计是非破坏性逐位仲裁。当多个节点同时发送时,每个节点在发送每一位的同时回读总线电平。若某节点发送隐性位而总线上是显性位,说明有更高优先级节点正在发送,该节点立即退出仲裁,转为接收状态,且不会破坏已获胜节点的报文。
仲裁从 SOF 后的标识符第一位开始,逐位比较。标识符数值越小,显性位越多,优先级越高。例如标识符 0x100 比 0x200 优先级高。RTR 位也参与仲裁:数据帧的 RTR 为显性,远程帧为隐性,因此同标识符下数据帧优先于远程帧。
仲裁要点:显性位覆盖隐性位;标识符越小优先级越高;仲裁失败节点自动转为接收,不重发已发送位;仲裁过程不丢失报文,因此称为“非破坏性”。
三、位定时与同步:保证采样点一致
CAN 是异步串行通信,没有独立时钟线,因此每个节点必须通过位定时和同步机制,在正确的位置采样总线电平。一个位时间被划分为四个段:
- 同步段(Sync_Seg):固定 1 个时间份额,用于同步总线跳变沿。
- 传播段(Prop_Seg):补偿总线传播延迟和收发器延迟。
- 相位缓冲段 1(Phase_Seg1):可被延长,用于重同步。
- 相位缓冲段 2(Phase_Seg2):可被缩短,用于重同步。
采样点位于 Phase_Seg1 与 Phase_Seg2 之间。同步分为硬同步和重同步:硬同步发生在帧起始的隐性到显性跳变,强制将位时间对齐到 Sync_Seg;重同步发生在帧内跳变沿,根据相位误差调整 Phase_Seg1 或 Phase_Seg2,调整量受 SJW(同步跳转宽度)限制。
位时间 = Sync_Seg + Prop_Seg + Phase_Seg1 + Phase_Seg2
采样点 = Sync_Seg + Prop_Seg + Phase_Seg1
SJW ≤ min(Phase_Seg1, Phase_Seg2)
典型采样点位置:75% ~ 87.5%(视波特率和总线长度而定)
位定时参数必须与波特率匹配。例如 500 kbps 时,位时间为 2 μs,若时钟为 16 MHz,则一个时间份额为 125 ns,位时间可配置为 16 个时间份额。采样点设置不当会导致高波特率下误码率上升。
四、错误检测与故障界定:五类错误与三种状态
CAN 提供五种错误检测机制:
- 位错误:发送节点回读电平与发送电平不一致(仲裁场和 ACK 槽除外)。
- 填充错误:在需要位填充的字段中,连续 6 个相同电平未插入相反位。
- CRC 错误:接收节点计算的 CRC 与帧中 CRC 不一致。
- 格式错误:固定格式字段出现非法电平。
- ACK 错误:发送节点在 ACK 槽未检测到显性位。
节点内部维护两个计数器:TEC(发送错误计数器)和REC(接收错误计数器)。根据计数值,节点处于三种故障状态:
| 状态 | 进入条件 | 行为 |
|---|---|---|
| 错误主动(Error Active) | TEC 和 REC 均 ≤ 127 | 正常通信,检测到错误时发送主动错误帧 |
| 错误被动(Error Passive) | TEC 或 REC > 127 | 仍可通信,但发送被动错误帧,不主动干扰总线 |
| 总线关闭(Bus Off) | TEC > 255 | 节点脱离总线,停止发送和接收,需恢复或复位 |
常见误区:错误被动不等于节点损坏,而是节点自身错误率偏高,应检查终端电阻、屏蔽接地、波特率匹配和线缆长度。总线关闭后,若软件未做恢复处理,节点将永久离线。
五、CAN FD 简介:更高数据段速率与更长数据场
CAN FD(Flexible Data-rate)在兼容 CAN 2.0 仲裁机制的基础上,引入两项关键改进:可变数据速率和更长数据场。仲裁段仍使用标准波特率,保证与经典 CAN 兼容;数据段切换到更高波特率,最高可达 5 Mbps 甚至更高。数据场从 8 字节扩展到 64 字节,减少协议开销,提高有效吞吐率。
CAN FD 帧中新增 FDF、BRS、ESI 等控制位:FDF 区分经典帧与 FD 帧,BRS 切换数据段速率,ESI 指示发送节点错误状态。CRC 长度也根据数据长度扩展,增强长帧校验能力。需要注意的是,CAN FD 节点与经典 CAN 节点不能直接混跑同一总线,除非使用兼容控制器或网关进行转换。
六、工程案例与复盘
某工业现场使用 CAN 总线连接 12 个节点,波特率 500 kbps,线缆约 80 米。调试时发现偶发通信中断,节点频繁进入错误被动状态。排查后发现:终端电阻仅在一端安装,另一端缺失,导致信号反射严重;同时采样点设置为 62.5%,低于推荐值。整改措施是两端各加 120 Ω 终端电阻,并将采样点调整到 80%,同时检查屏蔽层单点接地。整改后 TEC/REC 稳定在低位,通信恢复正常。
这个案例说明:CAN 的可靠性建立在物理层、位定时和错误管理三者协同之上。只关注协议帧格式而忽略终端匹配和采样点,往往会在现场付出代价。对于 CAN FD 升级,还需评估收发器、控制器和线缆是否支持更高数据段速率,避免“协议支持但物理层跟不上”的尴尬。
学习建议:用示波器观察 CAN_H 与 CAN_L 的差分波形,结合仲裁场和 ACK 槽理解显性/隐性电平;用 CAN 分析仪抓取错误帧,观察 TEC/REC 变化,比单纯背协议字段更有效。