2. CAN总线基础

DroneCAN 建立在经典 CAN 2.0B 之上,飞控、电调、GPS、电源模块之间的所有节点状态、参数读写和固件升级,最终都要落到 CAN 总线的电气信号、帧结构和仲裁规则上。理解这一层,才能在设备开发中判断“为什么节点不响应”“为什么总线偶发错误”“为什么高负载下丢帧”。本章从物理层到拓扑逐层拆解 CAN 总线的工作机制。

一、物理层:差分信号与终端电阻

CAN 使用差分双绞线传输,两条信号线分别称为 CAN_H 和 CAN_L。总线呈现两种逻辑状态:显性位(Dominant,逻辑 0)和隐性位(Recessive,逻辑 1)。显性状态下 CAN_H 约 3.5V、CAN_L 约 1.5V,差分电压约 2V;隐性状态下两线均约 2.5V,差分电压接近 0V。差分传输使共模干扰在接收端被抵消,这是 CAN 在无人机强电磁环境中仍能可靠通信的根本原因。

总线两端必须各接一个 120Ω 终端电阻,用于吸收信号反射、维持阻抗匹配。若缺少终端电阻,边沿会出现振铃,采样点误判导致错误帧;若两端都接而中间节点又并接电阻,等效阻抗下降,差分幅值被拉低,同样会引发通信异常。工程上常用万用表在断电状态下测量 CAN_H 与 CAN_L 之间电阻,正常应约为 60Ω(两个 120Ω 并联)。

DroneCAN 设备通常采用 4 针连接器(VCC、CAN_H、CAN_L、GND)。GND 必须共地,否则差分参考电平漂移,长线通信时尤其明显。

二、帧格式:标准帧与扩展帧

CAN 2.0B 定义了标准帧(11 位标识符)和扩展帧(29 位标识符)。DroneCAN 使用扩展帧,因为其 29 位 ID 中编码了源节点 ID、目标节点 ID、消息类型和优先级等信息。一帧扩展数据帧的主要字段如下:

字段长度作用
SOF1 位帧起始,显性位,用于硬同步
标识符11+18 位标准/扩展 ID,决定优先级与寻址
RTR1 位远程帧标志,数据帧为显性
IDE1 位扩展帧标志
DLC4 位数据长度,0~8 字节
数据场0~8 字节实际载荷
CRC15 位循环冗余校验
ACK2 位接收节点应答槽
EOF7 位帧结束,全隐性

经典 CAN 单帧最多 8 字节,DroneCAN 通过多帧传输协议(如固件升级、大参数块)把长数据拆分到多个帧中,因此帧格式理解是解析 DroneCAN 报文的前提。

三、仲裁机制:非破坏性逐位仲裁

CAN 采用 CSMA/CR(载波侦听多路访问/冲突解决)机制。多个节点同时发送时,每个节点在发送每一位的同时回读总线电平:若某节点发送隐性位而总线上出现显性位,说明有更高优先级节点在发送,该节点立即退出仲裁转为接收,且不破坏已发送的数据。标识符数值越小,优先级越高,因为显性位(0)在仲裁中“胜出”。

这一机制使 CAN 具备确定性延迟:高优先级报文不会被低优先级报文阻塞,适合飞控中姿态控制、电池状态等实时性要求高的数据。但若低优先级节点长期被压制,会出现“优先级反转”式的饥饿现象,需要在 DroneCAN 消息设计中合理分配 ID。

CAN 总线拓扑与逐位仲裁 CAN_H / CAN_L 差分双绞线 120Ω 120Ω 飞控节点 ID=10 优先级高 电调节点 ID=20 GPS 节点 ID=30 仲裁:ID 越小越优先,显性位(0)覆盖隐性位(1),失败节点自动退让且不破坏数据 示例:ID=10 与 ID=20 同时发送,ID=10 胜出,ID=20 转接收

四、错误处理:五类错误与状态机

CAN 节点内置错误计数器(TEC 发送错误计数、REC 接收错误计数),并定义了五种错误类型:位错误、填充错误、CRC 错误、格式错误、应答错误。节点根据计数器进入三种状态:

  • 错误主动(Error Active):TEC 和 REC 均小于 128,可正常发送并发出主动错误帧。
  • 错误被动(Error Passive):任一计数器超过 127,仍可通信,但只能发被动错误帧,不再主动干扰总线。
  • 总线关闭(Bus Off):TEC 超过 255,节点自动脱离总线,停止收发,需软件或硬件复位恢复。

位填充规则要求发送方在连续 5 个相同电平后插入 1 个相反电平,接收方自动去除。若检测到连续 6 个相同电平,则判定为填充错误。这一机制保证接收端能持续从跳变中恢复位同步。

调试中若发现某节点频繁进入 Bus Off,优先检查:终端电阻是否缺失或过多、CAN_H/CAN_L 是否接反、波特率是否一致、地线是否共地。这些物理层问题占现场故障的大多数。

五、位定时与采样点

CAN 位时间被划分为四个段:同步段(Sync_Seg)、传播段(Prop_Seg)、相位缓冲段 1(Phase_Seg1)、相位缓冲段 2(Phase_Seg2)。采样点位于 Phase_Seg1 与 Phase_Seg2 之间。常用参数包括:

位时间 = Sync_Seg + Prop_Seg + Phase_Seg1 + Phase_Seg2
采样点 = (Sync_Seg + Prop_Seg + Phase_Seg1) / 位时间 × 100%
SJW(同步跳转宽度)决定一次重同步可调整的最大时间量

典型配置(1 Mbps,时钟 36 MHz):
  BRP = 4,Tq = 111 ns
  Sync_Seg = 1 Tq
  Prop_Seg = 2 Tq
  Phase_Seg1 = 4 Tq
  Phase_Seg2 = 2 Tq
  采样点 ≈ 77.8%

采样点通常建议设在 75%~87.5% 之间。采样点过早,信号尚未稳定;过晚,则留给 Phase_Seg2 的余量不足,重同步能力下降。DroneCAN 常用 1 Mbps,节点间必须使用一致的位定时参数,否则即使物理连接正常也无法通信。

六、总线拓扑与工程实践

CAN 是总线型拓扑,所有节点并联在同一对差分线上,不支持星形或环形分支。支线长度应尽量短,1 Mbps 下建议不超过 0.3 米,否则分支反射会恶化信号质量。总线总长度与波特率成反比:1 Mbps 约 40 米,500 kbps 约 100 米,125 kbps 可达 500 米。

一个典型的多旋翼 DroneCAN 总线场景:飞控作为主节点,电调、GPS、电源模块、空速计依次挂接,两端各一个 120Ω 终端电阻。上电后飞控通过动态节点分配协议为各节点分配 ID,随后按消息类型周期性收发。若某节点未出现在总线中,排查顺序应为:供电与共地 → 终端电阻 → 波特率 → 节点 ID 冲突 → 线序接反。

掌握物理层、帧格式、仲裁、错误处理和位定时这五个层面,才能在 DroneCAN 设备开发中快速定位通信故障,并为后续节点协议、动态 ID 分配和固件升级打下基础。