通讯协议-CAN总线
CAN(Controller Area Network,控制器局域网)是一种面向消息、支持多节点、具有仲裁与错误处理能力的串行总线。它广泛用于汽车、工业控制、机器人和分布式嵌入式系统。
CAN 控制器负责帧、仲裁、应答和错误处理;CAN 收发器负责将控制器逻辑信号转换为差分总线电平。MCU 的 CAN 引脚通常不能直接连接 CANH/CANL。
物理连接
高速 CAN 总线通常采用一条线性主干,两端各放置一个终端电阻:
120 Ω 120 Ω
CANH/CANL ── 节点 A ───── 节点 B ───── 节点 C ── CANH/CANL
| 项目 | 说明 |
|---|---|
| CANH、CANL | 差分信号线 |
| 收发器 | 连接 CAN 控制器与物理总线 |
| 终端电阻 | 通常仅放在总线物理两端,用于抑制反射 |
| 支线 | 应尽量短,长度限制与通信速率相关 |
| 参考地 | 工程中通常仍需考虑节点间地电位和共模范围 |
断电后测量 CANH 与 CANL 之间的等效电阻,两个 120 Ω 终端并联时约为 60 Ω。实际值会受其他电路影响,测量前应确认系统状态。
显性与隐性位
CAN 使用“显性”和“隐性”表示总线逻辑状态:
| 状态 | 总线行为 | 仲裁意义 |
|---|---|---|
| 显性位 | 任一节点发送显性,总线即呈显性 | 优先级更高 |
| 隐性位 | 所有发送节点都发送隐性,总线才呈隐性 | 可被显性覆盖 |
发送节点会同时监听总线。如果它发送隐性位却读到显性位,说明有更高优先级的消息正在发送,该节点停止竞争并等待后续重发。这种逐位仲裁不会破坏获胜报文。
消息标识符与优先级
CAN 是面向消息的广播总线,帧中的标识符用于表示消息含义和仲裁优先级,而不是直接表示目标节点地址。
| 帧格式 | 标识符长度 | 说明 |
|---|---|---|
| 标准帧 | 11 bit | 较短,仲裁开销较小 |
| 扩展帧 | 29 bit | 可提供更大的标识符空间 |
数值更小的标识符在仲裁中通常具有更高优先级。标识符分配应同时考虑消息语义、实时性、总线负载和故障影响,不能只按节点编号随意分配。
Classical CAN 数据帧
经典 CAN 数据帧包含以下主要区域:
| 区域 | 作用 |
|---|---|
| SOF | 帧起始 |
| 仲裁段 | 标识符及帧类型相关控制位 |
| 控制段 | 数据长度等信息 |
| 数据段 | 0 至 8 byte 有效载荷 |
| CRC 段 | 检测帧传输错误 |
| ACK 段 | 其他正确接收帧的节点发送应答 |
| EOF | 帧结束 |
ACK 只表示至少一个节点在链路层正确接收了该帧,不代表应用层已经处理,也不代表特定目标节点已收到。需要业务确认时,应在上层协议中设计响应、超时和重试。
CAN FD
CAN FD(Flexible Data-rate)扩展了经典 CAN:
| 特性 | Classical CAN | CAN FD |
|---|---|---|
| 单帧有效载荷 | 最大 8 byte | 最大 64 byte |
| 数据阶段速率 | 与仲裁阶段相同 | 可切换到更高数据速率 |
| CRC 与控制字段 | 经典格式 | 针对更长数据进行了扩展 |
CAN FD 节点、控制器、收发器和分析工具需要相互兼容。经典 CAN 与 CAN FD 的混合网络行为应在系统设计阶段明确验证。
位时序
CAN 节点必须配置一致的标称位速率,并通过位时序参数确定采样点和同步裕量。常见参数概念包括:
| 参数 | 作用 |
|---|---|
| 时钟源与预分频 | 决定时间量子长度 |
| Time Segment 1 | 采样点之前的时间段 |
| Time Segment 2 | 采样点之后的时间段 |
| SJW | 重同步允许的调整范围 |
| 采样点 | 节点读取总线逻辑状态的时刻 |
位时序不能只靠“波特率相同”判断正确。高负载、长总线或多种晶振误差组合下,采样点与 SJW 配置同样重要。具体参数应使用芯片厂商工具或经过验证的计算方法确定。
错误检测与故障隔离
CAN 通过多种机制检测错误,包括位监测、位填充检查、帧格式检查、CRC 和 ACK 检查。节点维护发送与接收错误计数,并根据错误程度切换状态:
| 状态 | 含义 |
|---|---|
| Error Active | 节点正常参与通信,并可发送主动错误标志 |
| Error Passive | 错误较多,节点的错误处理行为受到限制 |
| Bus Off | 发送错误严重,节点停止参与总线通信 |
Bus Off 后是否自动恢复、等待多久恢复,以及恢复前是否需要应用层介入,应按产品安全要求和控制器能力设计。
上层协议
CAN 定义链路层通信,但不规定信号缩放、节点管理、设备配置或大数据分包。常见上层协议包括 CANopen、J1939、ISO-TP,以及项目自定义协议。
自定义协议至少应明确:
| 项目 | 需要定义的内容 |
|---|---|
| 标识符规划 | 消息语义、优先级、发送方与接收方关系 |
| 数据布局 | 字节序、位域、缩放、偏移和无效值 |
| 周期与超时 | 周期消息频率、超时判定和故障降级 |
| 计数器与校验 | 是否增加滚动计数器或应用层 CRC |
| 多帧传输 | 大于单帧载荷时的分片、流控和重组 |
| 版本兼容 | 新旧节点如何识别与兼容 |
总线负载
总线负载不仅由有效载荷决定,还包含仲裁、控制、CRC、ACK、帧间隔和位填充开销。周期消息设计时应留出突发报文、错误重发和诊断通信的余量。
高优先级消息持续占用总线时,低优先级消息可能长时间无法发送。应通过负载分析和最坏响应时间分析验证实时性。
常见问题与排查
| 现象 | 常见原因 | 排查方法 |
|---|---|---|
| 所有节点都无法通信 | 无终端、位速率错误、CANH/CANL 接反 | 断电测终端电阻,检查位时序和接线 |
| 单节点无法发送 | 收发器待机、控制器未启动、Bus Off | 检查使能脚、状态寄存器与错误计数 |
| 发送后持续重试 | 没有其他节点 ACK、位时序不匹配 | 接入正常节点或分析仪,检查 ACK 槽 |
| 低负载正常,高负载异常 | 总线负载过高、优先级规划不合理 | 统计负载与各消息延迟 |
| 偶发错误帧 | 终端、支线、接地、干扰或采样点问题 | 示波器观察差分波形并读取错误计数 |
| 某些帧收不到 | 过滤器配置错误或 ID 类型不一致 | 核对标准/扩展帧和接收过滤器 |
| 节点进入 Bus Off | 发送错误持续累积 | 先定位物理层或位时序问题,再设计恢复 |
调试步骤
- 确认 MCU、CAN 控制器和收发器连接正确,收发器已退出待机。
- 断电测量 CANH 与 CANL 间等效电阻,检查终端位置。
- 确认所有节点的经典 CAN/CAN FD 模式、位速率和位时序兼容。
- 使用 CAN 分析仪查看帧、错误帧、总线负载和 ACK。
- 读取控制器的发送/接收错误计数和 Bus Off 状态。
- 用示波器检查 CANH、CANL 和差分波形,关注反射、共模和干扰。
- 最后检查接收过滤器、标识符规划和上层数据格式。
适用场景
CAN 适合需要多节点、优先级仲裁、故障检测和较强抗干扰能力的分布式控制系统。对极高带宽、超长距离或复杂网络管理需求,应结合实时性、拓扑和成本评估其他总线或网络技术。