2. CAN总线基础

在无人机飞控、电调、云台、电池管理、导航模块之间,CAN总线之所以能成为高可靠数据链路的首选,并不是因为它“线少”,而是因为它在协议层就把多节点共享、冲突仲裁、错误检测和故障隔离做成了内建能力。理解CAN,不能只停留在“两根线差分传输”的层面,必须从它诞生的工程背景、帧结构、非破坏性仲裁、错误状态机以及位定时参数这几个核心机制入手。

一、CAN协议的起源与工程定位

CAN(Controller Area Network)最早由Bosch在20世纪80年代为汽车电子开发,目标是让车内多个ECU在无需主机轮询的情况下,通过一对差分线可靠地交换短报文。它后来成为ISO 11898标准,并扩展到工业控制、医疗设备和无人机领域。对无人机而言,CAN的价值在于:飞控、电调、电池、GPS/RTK、避障雷达等节点可以挂接在同一条总线上,以广播方式发布状态,接收方按标识符过滤,不需要为每个节点单独布线。

CAN属于多主异步串行总线,节点没有固定主从关系,任何节点在总线空闲时都可以发起发送。它采用差分信号CAN_H/CAN_L,抗共模干扰能力强;报文短小,最大数据场为8字节(经典CAN),适合传输控制指令、状态量和故障码。与UART、I2C、SPI相比,CAN更适合长距离、多节点、强干扰环境,但代价是协议复杂度和位定时配置要求更高。

二、CAN帧格式:数据帧是核心载体

经典CAN 2.0A/B中,数据帧是使用最频繁的帧型。标准帧使用11位标识符,扩展帧使用29位标识符。一个标准数据帧依次包括:帧起始SOF、仲裁场(11位ID + RTR)、控制场(IDE、r0、DLC)、数据场(0~8字节)、CRC场、ACK场和帧结束EOF。标识符不仅表示“这是谁发的”,更决定报文优先级;RTR区分数据帧与远程帧;DLC表示数据长度;CRC用于校验传输错误;ACK由正确接收的节点拉低确认。

在无人机中,飞控发送姿态控制指令时通常使用高优先级ID,电池电压、温度等低频状态量使用较低优先级ID。这样当总线繁忙时,关键控制报文能优先获得总线使用权,而不是被大量状态报文阻塞。

CAN 2.0A 标准数据帧结构 标识符决定优先级,DLC决定数据长度,CRC与ACK完成可靠确认 SOF 1位 仲裁场 11位ID + RTR 控制场 IDE + r0 + DLC 数据场 0 ~ 8 字节 CRC场 15位 + 界定 ACK场 2位 位流方向:从左到右,逐位发送;显性位覆盖隐性位,实现非破坏性仲裁 高优先级报文 ID = 0x080(飞控控制指令) ID数值越小,优先级越高 低优先级报文 ID = 0x3A0(电池状态) 总线忙时自动退让并重试 接收过滤 节点按ID掩码接收所需报文 无需主机轮询

三、仲裁机制:非破坏性冲突解决

CAN最精妙的设计之一是“非破坏性仲裁”。总线上显性位(逻辑0)会覆盖隐性位(逻辑1)。当多个节点同时发送时,每个节点一边发送一边回读总线电平;如果某节点发送隐性位却读到显性位,说明有更高优先级报文正在竞争,该节点立即退出仲裁,转为接收状态,而获胜节点继续发送,报文内容不被破坏。

这意味着CAN不会像以太网早期CSMA/CD那样发生碰撞后重传整帧,而是逐位裁决,优先级高的报文几乎无延迟地获得总线。对无人机来说,姿态控制、电机转速指令等安全关键报文应分配更小的ID数值,从而在总线拥塞时优先传输。需要注意的是,ID不仅用于过滤,也直接决定优先级,因此ID分配必须纳入系统通信矩阵设计,不能随意分配。

四、错误处理:错误计数与节点状态机

CAN节点内部维护发送错误计数器TEC和接收错误计数器REC。节点根据计数值在错误主动、错误被动和总线关闭三种状态之间迁移。错误主动节点检测到错误时会发送错误帧,主动破坏当前报文,通知全网;错误被动节点仍可通信,但不再主动发送错误帧;当TEC超过255时,节点进入总线关闭状态,自动脱离总线,避免故障节点持续干扰。

常见错误类型包括位错误、填充错误、CRC错误、格式错误和ACK错误。位填充规则要求发送方在连续5个相同位后插入1个相反位,接收方自动去除,以保证位同步。若接收节点未正确接收,ACK槽不会被拉低,发送方会检测到ACK错误并重传。对无人机而言,总线关闭后的恢复策略非常关键,通常需要软件介入或自动恢复机制,避免飞控与电调通信永久中断。

错误类型 检测方 典型原因 处理方式
位错误 发送方 回读电平与发送不一致 发送错误帧,TEC增加
填充错误 接收方 连续6个相同位 发送错误帧,REC增加
CRC错误 接收方 数据被干扰或位定时偏差 丢弃报文,请求重传
ACK错误 发送方 无节点正确接收 重传,TEC增加
格式错误 接收方 固定格式位出现非法电平 发送错误帧

五、位定时基础:采样点与同步

CAN是异步总线,没有独立时钟线,因此每个节点必须依靠位定时参数对位流进行采样。一个位时间通常被划分为同步段、传播段、相位缓冲段1和相位缓冲段2。采样点位于相位缓冲段1结束处,通常建议设置在位时间的75%~87.5%附近。若采样点过早,容易受传播延迟影响;过晚则抗相位误差能力下降。

位定时由波特率预分频器、TSEG1、TSEG2和SJW共同决定。SJW用于重同步时的相位缓冲调整。所有节点必须配置为相同波特率,否则会出现大量错误帧甚至无法通信。无人机中常见CAN波特率为1 Mbps、500 kbps和250 kbps;1 Mbps适合短距离高实时性链路,500 kbps在飞控与电调之间较常见,250 kbps则用于较长线束或较低速率外设。

以500 kbps、时钟48 MHz为例:
位时间 = 1 / 500000 = 2 μs = 2000 ns
时间份额Tq = 2000 / 16 = 125 ns
BRP = 48 MHz × 125 ns - 1 = 5
TSEG1 = 13 Tq,TSEG2 = 2 Tq,SJW = 1 Tq
采样点 = (1 + 13) / 16 = 87.5%
调试CAN时,若出现大量错误帧,优先检查三件事:所有节点波特率是否一致、采样点是否合理、终端电阻是否为120 Ω。很多“通信不稳定”并非协议问题,而是位定时或物理层匹配问题。

六、案例与误区复盘

某四旋翼无人机在加装RTK模块后,飞控与电调偶发通信中断。排查发现RTK节点默认波特率为250 kbps,而飞控与电调使用500 kbps,总线混挂后错误帧激增,电调进入错误被动状态。修正为统一500 kbps并调整采样点后,通信恢复稳定。这个案例说明,CAN总线不是“接上就能通”,所有节点的位定时和ID规划必须统一设计。

另一个常见误区是认为“ID越小越安全,所以所有关键报文都设成0x000”。实际上,多个节点若使用相同ID发送不同数据,会破坏仲裁和过滤逻辑,甚至导致接收方无法区分来源。正确做法是依据通信矩阵分配唯一ID,并按照实时性要求排序。此外,终端电阻不能每个节点都加,而应在总线两端各加一个120 Ω,中间节点不应再并联终端电阻,否则总线负载过重,信号幅值下降。

本节核心结论:CAN的可靠性来自协议内建的仲裁、错误检测和状态管理。掌握帧格式是理解通信内容的基础,理解非破坏性仲裁是设计优先级的前提,掌握错误计数与位定时则是保证无人机总线稳定运行的关键。对无人机接口设计而言,CAN不是简单的“两根线”,而是一套需要从ID分配、波特率、采样点、终端匹配到故障恢复统一规划的系统工程。