2. CAN总线基础

CAN(Controller Area Network,控制器局域网)最早由德国博世公司在20世纪80年代为汽车电子系统提出,目标是让车内多个电子控制单元(ECU)通过一根共享总线交换数据,同时减少传统点对点线束的数量与重量。1993年,ISO 11898 标准对 CAN 的物理层与数据链路层进行了规范化,使其从汽车领域扩展到工业控制、医疗设备、电梯、储能与机器人等场景。理解 CAN 的硬件与驱动设计,必须先掌握其协议起源背后的设计动机:多主、广播、差分、抗干扰、优先级仲裁。

一、总线拓扑:一条主干,多个节点

CAN 总线采用线性总线拓扑,所有节点并联在一条双绞线主干上,两端各接一个终端电阻(通常为 120Ω)。节点通过 CAN 收发器连接到 CAN_H 与 CAN_L 两根信号线,形成差分传输。与星型或环型拓扑不同,CAN 总线要求主干尽量短、分支尽量短,否则信号反射会破坏差分波形,导致位错误或通信失败。

典型拓扑中,每个节点包含三部分:MCU 内的 CAN 控制器、CAN 收发器、以及总线接口。CAN 控制器负责协议帧的组装、CRC 校验、位填充与仲裁;收发器负责把控制器的逻辑 TX/RX 信号转换为差分总线电平,并提供总线故障保护。终端电阻的作用是吸收信号反射,使差分电压快速稳定,因此不能随意省略或只在一端安装。

在实验室搭建 CAN 网络时,若只有两个节点,也必须在总线两端各接一个 120Ω 电阻;若使用 CAN 分析仪,分析仪内部通常已集成可切换终端电阻,需确认是否重复接入。

二、差分信号:用两根线表达一位

CAN 总线不使用单端对地电压判断逻辑,而是使用 CAN_H 与 CAN_L 之间的电压差。这样做的核心优势是共模干扰抑制:当电机、继电器或电源噪声同时耦合到两根线上时,电压差基本不变,接收器仍能正确识别。ISO 11898 高速 CAN 中,显性位(Dominant)对应差分电压约 2V,隐性位(Recessive)对应差分电压约 0V。

具体电平关系如下表所示:

总线状态 CAN_H 典型电压 CAN_L 典型电压 差分电压 Vdiff 逻辑含义
显性 Dominant 约 3.5V 约 1.5V 约 2.0V 逻辑 0
隐性 Recessive 约 2.5V 约 2.5V 约 0V 逻辑 1

显性电平之所以称为“显性”,是因为它具有“覆盖”隐性电平的能力:只要总线上有一个节点发送显性位,总线就呈现显性;只有所有节点都发送隐性位时,总线才呈现隐性。这一物理特性直接支撑了 CAN 的非破坏性仲裁机制。

三、仲裁机制:ID 越小,优先级越高

CAN 采用基于报文标识符(Identifier,ID)的逐位仲裁。当多个节点同时开始发送时,它们先发送帧起始位,然后逐位发送 ID。每个节点在发送每一位的同时也会回读总线电平:如果自己发送隐性(1),但总线上出现显性(0),说明有更高优先级节点正在发送,该节点立即退出发送,转为接收状态,且不会破坏已获胜节点的数据。

因此,CAN 的仲裁是“非破坏性”的:获胜节点继续发送,失败节点自动等待下一次总线空闲。标准帧 ID 为 11 位,扩展帧 ID 为 29 位。ID 数值越小,优先级越高。例如 ID=0x100 的报文优先级高于 ID=0x200。设计时,安全关键报文(如刹车、碰撞)应分配更小的 ID,非关键报文(如车窗、灯光)分配较大的 ID。

仲裁示例(标准帧 ID 11 位):
节点A 发送 ID = 0x123 = 001 0010 0011
节点B 发送 ID = 0x121 = 001 0010 0001

逐位比较到第 10 位时:
节点A 发送 1(隐性),节点B 发送 0(显性)
总线呈现显性 0,节点A 退出仲裁
节点B 获胜并继续发送完整帧

四、多主通信特点:没有主从,只有优先级

CAN 网络没有传统意义上的主站和从站。任何节点都可以在总线空闲时主动发送报文,因此称为多主通信。每个节点通过监听总线空闲间隔(Intermission)来判断是否可以开始发送。总线空闲时,所有节点都有机会竞争;一旦发生冲突,仲裁机制自动决定谁先发送。

多主通信带来几个重要设计特点:

  • 广播式通信:报文没有源地址和目的地址,所有节点都能收到,接收节点根据 ID 和验收滤波器决定是否处理。
  • 优先级驱动:高优先级报文可抢占低优先级报文的发送机会,但不会中断正在发送的低优先级报文,只会在下一次仲裁时优先。
  • 错误检测与封闭:CAN 节点具备错误检测、错误计数和总线关闭(Bus Off)机制,故障节点会逐步退出总线,避免影响全网。
  • 位填充:发送器在连续 5 个相同位后插入一个相反位,接收器自动去除,以保证位同步和边沿密度。
常见误区:认为“CAN 总线空闲时任何节点都能立即发送,所以不会冲突”。实际上,多个节点可能同时开始发送,冲突由仲裁解决;若低优先级报文长期被高优先级报文压制,可能出现“优先级反转”式的延迟,需要在系统设计时评估总线负载与最坏响应时间。

五、案例与复盘:从波形看仲裁

假设总线上有两个节点同时发送:节点 A 发送 ID=0x100,节点 B 发送 ID=0x200。用示波器观察 CAN_H 与 CAN_L 的差分波形,可以看到仲裁阶段总线电平由两个节点共同驱动,显性位覆盖隐性位。最终节点 A 获胜,节点 B 在仲裁丢失后停止发送,总线继续传输节点 A 的完整数据帧。若此时节点 B 的驱动配置错误,例如把 TX 引脚配置为开漏但没有正确上拉,可能导致总线电平异常,仲裁失败甚至总线锁死。

复盘要点:第一,终端电阻必须两端各一个,且阻值匹配双绞线特性阻抗;第二,CAN_H 与 CAN_L 不能接反,否则差分极性错误;第三,多个节点同时上电时,总线空闲判断和初始化时序要一致;第四,ID 分配要符合优先级策略,避免高负载下关键报文被延迟。

CAN总线拓扑、差分电平与仲裁机制 CAN_H CAN_L 120Ω 120Ω 节点1 MCU + CAN控制器 收发器 节点2 MCU + CAN控制器 收发器 节点3 MCU + CAN控制器 收发器 差分电平 显性 0:Vdiff≈2V 隐性 1:Vdiff≈0V 逐位仲裁:显性覆盖隐性 节点A ID=0x100 节点B ID=0x200 A 获胜 B 退出 ID 越小,优先级越高;仲裁非破坏性

总结来看,CAN 总线的基础可以归纳为一条主线:差分物理层提供抗干扰能力,显性/隐性电平提供仲裁基础,多主广播提供灵活通信,ID 优先级提供确定性调度。在后续节点硬件与驱动设计中,收发器选型、终端电阻、共模电感、TVS 防护、位定时与采样点配置,都必须围绕这些基础特性展开。