CAN/CAN FD总线
一、CAN/CAN FD”特点
- 实时性:通信延迟可低至微秒级,满足电机控制、步态调整的实时要求;
- 可靠性:自带错误检测( CRC 校验、位错误重发 ),即使在机器人运动的电磁干扰环境下也不易丢包;
- 多节点性:一条总线可连接 30 + 节点(CAN FD 支持更多),无需像串口那样 “一对一” 布线,简化机器人内部线路;
- 灵活性:支持 “广播”(一个节点发数据,所有节点可接收),比如 IMU 的姿态数据可同时发给主控和电机模块,无需重复传输。
二、掌握 CAN/CAN FD 的核心基础概念
| 术语 | 核心含义 |
|---|---|
| 总线(Bus) | 一条物理线路(通常是 “CAN_H”“CAN_L” 双绞线),连接机器人的所有 CAN 节点(电机、传感器、主控) |
| 节点(Node) | 每个需要通信的模块(每一个电机驱动器),每个节点有唯一的 “节点 ID”(用于识别发送 / 接收方) |
| 报文(Message) | 通信的基本单位,包含 “ID(标识报文类型,如‘电机 1 转速指令’)+ 数据(如 1000rpm 的数值)+ 校验位” |
| 波特率 | 通信速度,CAN 常用 250kbps/500kbps(低速,适合长距离),CAN FD 支持 1Mbps+(高速,适合短距离高带宽) |
| 显性 / 隐性位 | 总线仲裁机制(简单理解:多个节点同时发数据时,“显性位” 优先,避免冲突,比如紧急停车指令优先) |
(注:所有节点的 CAN_H 连在一起,CAN_L 连在一起,终端电阻接在总线最两端的节点上)
三、CAN 总线的物理层核心:时序与信号定义
CAN 总线的物理时序围绕 “总线电平、位时序、总线仲裁” 三大核心,这是解析 CAN 信号的基础。首先明确物理层的硬件前提:
- 总线拓扑:采用 “双绞线”(CAN_H、CAN_L 两根差分线),终端需接 120Ω 匹配电阻(减少信号反射);
- 电平标准:通过 CAN_H 与 CAN_L 的电压差判断总线状态(而非单根线的绝对电平,抗干扰能力远强于 I2C 的单端信号)。
1. 总线电平与时序:显性 / 隐性状态(可同时在系统存在 )
CAN 总线只有两种状态,其电平与时序是 “位传输” 的最小单元:
| 总线状态 | CAN_H 电压(典型值) | CAN_L 电压(典型值) | 差分电压(Vdiff) | 物理意义 |
|---|---|---|---|---|
| 显性(Dominant) | 3.5V | 1.5V | ≈2V | 表示 “0”,优先级高(多主竞争时,显性状态会覆盖隐性状态) |
| 隐性(Recessive) | 2.5V | 2.5V | ≈0V | 表示 “1”,优先级低 |
- 时序关键:一个 “位” 的传输时间由 “显性 / 隐性状态的持续时长” 决定,所有节点必须同步到总线的位时序(否则会出现位错误)。
2 位时序:解析 “一个位” 的时间构成
CAN 的 “位时序” 是物理层的核心,定义了 “一个位” 如何被分割为多个时间段,用于节点的同步、采样与错误检测。无论 CAN 2.0A/B(标准 / 扩展帧)还是 CAN FD(高速帧),位时序的基本结构一致,仅参数(如位速率)不同。将一个 “位” 划分为同步段(SS)、传播时间段(PTS)、相位缓冲段 1(PBS1)、相位缓冲段 2(PBS2) 。
一个完整的 “位” 由 4 个时间段组成,总时长 = 位速率的倒数(如 500kbps 的位时长 = 2μs):
| 时间段 | 作用 | 典型占比(以 500kbps 为例) |
|---|---|---|
| 同步段(SYNC_SEG) | 所有节点通过 “总线电平跳变” 实现同步(必须是 1 个时间量子 TQ) | 1TQ(如 0.25μs,TQ = 位时长 / 8) |
| 传播段(PROP_SEG) | 补偿总线传输延迟(含线缆延迟、节点输入延迟),可配置为 1~8TQ | 2TQ(0.5μs) |
| 相位缓冲段 1(PH1) | 用于调整采样点位置,可配置为 1~8TQ(出错时可延长) | 2TQ(0.5μs) |
| 相位缓冲段 2(PH2) | 补充 PH1 的调整,可配置为 1~8TQ(出错时可缩短) | 3TQ(0.75μs) |
- 关键概念:采样点(Sample Point)
采样点是节点读取总线电平(判断 “0” 或 “1”)的时刻,位置 = SYNC_SEG + PROP_SEG + PH1,通常位于 “位时长的 75% 左右”(如上例中,采样点在 1+2+2=5TQ 处,对应 1.25μs,占 2μs 位时长的 62.5%,符合 CAN 规范的 50%~90% 要求)。
采样点的准确性直接影响解析正确性 —— 若节点采样点偏移,可能将 “显性 0” 误读为 “隐性 1”,导致帧错误。
3. 总线仲裁时序:多主节点的 “非破坏性竞争”
CAN 是多主总线(所有节点均可主动发帧),当多个节点同时发帧时,通过 “仲裁段” 的时序竞争决定谁优先占用总线,核心是 “显性 0 压制隐性 1”,且竞争过程不破坏已传输的正确位(这是 CAN 高可靠的关键)。
仲裁时序逻辑(以标准帧为例):
- 所有节点在 “总线空闲”(隐性 1 持续≥11 位)后,同时开始发送 “帧起始”(1 位显性 0);
- 紧接着发送 “仲裁段”(标准帧为 11 位 ID,扩展帧为 29 位 ID):
- 每个节点逐位比较自己发送的位与总线上的位:
- 若自己发 “1”(隐性),但总线上是 “0”(显性)→ 说明有优先级更高的节点(发 0),立即停止发帧,切换为接收模式;
- 若自己发 “0”(显性),总线上也是 “0”→ 继续发下一位;
- 每个节点逐位比较自己发送的位与总线上的位:
- 当某节点发完所有仲裁位后,总线上仍无更高优先级的 “0”→ 赢得仲裁,独占总线发送后续数据。
- 时序示例:节点 A 发 ID=0x001(二进制
00000000001),节点 B 发 ID=0x002(00000000010):
第 10 位时,A 发 “0”、B 发 “0”→ 继续;第 11 位时,A 发 “1”、B 发 “0”→ 总线显 “0”,A 检测到不匹配,停止发送;B 继续发送,赢得仲裁。
二、CAN 帧结构与解析逻辑:从时序到数据
理解物理时序后,解析 CAN 的核心是 “按帧结构拆解位流”——CAN 帧分为 “数据帧、远程帧、错误帧、过载帧”,其中数据帧是最常用的(占 99% 以上场景),以下以 CAN 2.0B 扩展数据帧为例,拆解解析步骤。
1. CAN 扩展数据帧的结构(共 47~67 位)
| 字段 | 位数 | 作用 | 解析关键 |
|---|---|---|---|
| 帧起始(SOF) | 1 | 标志帧开始,固定为 “显性 0” | 检测到总线从隐性 1 跳变为显性 0,触发帧解析开始 |
| 仲裁段 | 29 | 29 位扩展 ID(含 1 位 IDE=1,区分标准 / 扩展帧) | 逐位解析 ID,判断帧的优先级(ID 越小,优先级越高) |
| 控制段 | 6 | 1 位 RTR(0 = 数据帧,1 = 远程帧)+ 4 位 DLC(数据长度,0~8 字节)+ 1 位保留位 | 解析 DLC,确定后续 “数据段” 的字节数(如 DLC=3,说明数据段有 3 字节) |
| 数据段 | 8×DLC | 实际传输的数据(0~8 字节,CAN FD 支持 0~64 字节) | 按字节顺序解析(如 DLC=2,位流对应 2 个 8 位字节,转换为十进制 / 十六进制) |
| CRC 段 | 15 | 循环冗余校验(检测帧传输错误) | 接收端计算数据段的 CRC 值,与接收到的 CRC 段对比,不一致则判定为 CRC 错误 |
| CRC 界定符 | 1 | 固定为 “隐性 1”(分隔 CRC 段与 ACK 段) | 若检测到显性 0,判定为格式错误 |
| ACK 段 | 2 | 1 位 ACK 槽(发送端发隐性 1,接收端正确则发显性 0)+ 1 位 ACK 界定符(隐性 1) | 若 ACK 槽为隐性 1,说明无节点正确接收,判定为 ACK 错误 |
| 帧结束(EOF) | 7 | 固定为 “隐性 1”(标志帧结束) | 若检测到显性 0,判定为格式错误 |
2. 解析流程:从物理信号到有效数据
以 “示波器捕获 CAN 总线信号” 或 “CAN 控制器(如 SJA1000)接收数据” 为例,解析步骤如下:
- 信号预处理:
差分接收器(如 TJA1050)将 CAN_H/CAN_L 的差分信号转换为单端数字信号(显性 0 / 隐性 1),滤除高频噪声; - 同步与位时序恢复:
接收节点通过 “SYNC_SEG” 的电平跳变,同步到总线的位时序(校准本地 TQ 时钟),确定采样点位置; - 帧起始检测:
连续检测到 “1 位显性 0”(SOF),且前一状态为 “总线空闲”(≥11 位隐性 1),开始接收后续字段; - 字段拆解与校验:
- 按帧结构逐字段解析(仲裁段→控制段→数据段→CRC 段→ACK 段→EOF);
- 每一步校验字段格式(如 CRC 值、ACK 响应、EOF 的 7 位隐性 1),若出错则触发 “错误帧”(发送显性 0 序列,通知所有节点);
- 数据提取与应用:
若帧无错误,从 “数据段” 中按 DLC 指定的长度提取字节数据(如 DLC=4,提取 4 字节数据,根据应用协议(如 CANopen、J1939)转换为实际含义,如 “转速 = 0x03E8 → 1000rpm”)。
三、CAN 与 I2C 的物理时序 / 解析差异(对比表)
为更清晰区分两者,下表总结核心差异:
| 对比维度 | CAN 总线 | I2C 总线 |
|---|---|---|
| 物理层信号 | 差分信号(CAN_H/CAN_L),抗干扰强 | 单端信号(SDA/SCL),抗干扰弱 |
| 位时序核心 | 位 = SYNC+PROP+PH1+PH2,依赖采样点同步 | 位 = 高电平 + 低电平,依赖 SCL 时钟边沿同步 |
| 主从关系 | 多主式(所有节点可主动发帧,仲裁竞争) | 主从式(仅主节点产生 SCL,从节点被动响应) |
| 帧结构 | 固定格式(SOF + 仲裁 + 控制 + 数据 + CRC+ACK+EOF) | 灵活格式(起始条件 + 从地址 + 读写位 + 数据 + 停止条件) |
| 解析关键 | 仲裁段竞争、CRC 校验、ACK 响应 | 从地址匹配、SCL 边沿采样 SDA 数据 |
| 典型应用场景 | 汽车、工业控制(高可靠、长距) | 板级外设(如传感器、EEPROM,低速短距) |
四、CAN对比CANfd
让我们用经典CAN和CAN FD来算一笔账:
-
经典CAN (最大8字节/帧):
-
发送指令: 如果要发送力矩指令(4字节float)+位置指令(4字节float),一帧刚好8字节,一个电机需要一帧。12个电机就需要12帧。
-
接收反馈: 位置(4字节)+速度(4字节)+力矩(4字节)就已经超了8字节,必须拆成2帧甚至3帧来发送。12个电机可能需要24-36帧。
-
问题: 在每个1ms的控制周期内,总线上要传输36+12=48帧数据。在1Mbps的经典CAN下,传输一帧(约100+ bit)大约需要0.1ms,48帧就需要近5ms!这远远超过了1ms的控制周期要求,系统根本无法实现实时控制。
-
-
CAN FD (最大64字节/帧, 数据段速率5Mbps):
-
发送指令: 可以用一帧数据广播给所有电机。帧ID标明是“指令帧”,数据域里按顺序包含电机1~12的所有指令数据(例如,每个电机4字节力矩,12个电机共48字节)。所有电机同时收到指令并执行。
-
接收反馈: 每个电机的反馈数据(如位置4字节+速度4字节+力矩4字节=12字节)可以轻松放在一帧里。12个电机各发一帧,共12帧。
-
优势: 现在,每个控制周期只需要 1(下行广播) + 12(上行反馈) = 13帧。在5Mbps的数据段速率下,传输一帧数据的时间大大缩短。13帧的总时间可以轻松控制在1ms以内,完美满足实时性要求。
-
2. 高级控制算法的需求
除了基本的力矩控制,现代机器人算法需要更多数据:
-
** whole-body control (全身控制)**: 需要所有关节的完整状态信息。
-
故障诊断与安全保障: 需要实时传输更详细的诊断数据(如温度、电压、错误码)。
这些都需要更大的数据吞吐量,CAN FD的64字节提供了巨大的灵活性,而经典CAN的8字节则捉襟见肘。
更多推荐


所有评论(0)