Skip to main content

通讯协议-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 CANCAN 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发送错误持续累积先定位物理层或位时序问题,再设计恢复

调试步骤

  1. 确认 MCU、CAN 控制器和收发器连接正确,收发器已退出待机。
  2. 断电测量 CANH 与 CANL 间等效电阻,检查终端位置。
  3. 确认所有节点的经典 CAN/CAN FD 模式、位速率和位时序兼容。
  4. 使用 CAN 分析仪查看帧、错误帧、总线负载和 ACK。
  5. 读取控制器的发送/接收错误计数和 Bus Off 状态。
  6. 用示波器检查 CANH、CANL 和差分波形,关注反射、共模和干扰。
  7. 最后检查接收过滤器、标识符规划和上层数据格式。

适用场景

CAN 适合需要多节点、优先级仲裁、故障检测和较强抗干扰能力的分布式控制系统。对极高带宽、超长距离或复杂网络管理需求,应结合实时性、拓扑和成本评估其他总线或网络技术。

相关文档