1. CAN协议基础:从起源到物理层

大家好,我是你们这门课的老朋友。做嵌入式通信这么多年,CAN总线是我打交道最多的协议之一。今天咱们就从根上聊聊——CAN到底是怎么来的,它跟RS485比有什么底气,以及物理层那些“看得见摸得着”的细节。

1.1 CAN总线的起源——为什么会有它?

上世纪80年代,汽车里的电子设备越来越多。空调、ABS、发动机控制、车窗……每个模块都自己拉一堆线。你想想看,一辆车光线束就几十公斤,又重又容易出故障。

1986年,德国Bosch公司推出了CAN(Controller Area Network)总线。初衷很简单:用两根线把车上所有控制器串起来,大家共用一条“电话线”通信。我记得第一次看到CAN的原始论文时,最打动我的是它的实时性和错误处理机制——这在当时是革命性的。

核心定位: CAN不是追求高带宽的总线,它追求的是“在恶劣环境下,消息必须可靠到达”。

后来CAN被ISO标准化为ISO 11898,从汽车扩展到工业自动化、医疗设备、机器人、航空电子……我做过一个工程机械项目,挖掘机里全是CAN,振动、高温、电磁干扰,RS485根本扛不住,CAN却稳如老狗。

1.2 CAN vs RS485——到底差在哪?

很多初学者会问:CAN和RS485不都是差分信号吗?为什么CAN更“高级”?

我直接给你一张对比表,看完就明白。

对比项 CAN RS485
通信方式 多主总线,任意节点可主动发 半双工,需主站轮询
仲裁机制 非破坏性逐位仲裁(硬件实现) 无,靠软件协议避免冲突
错误处理 5种错误检测 + 自动重发 通常只靠CRC,无统一错误恢复
实时性 确定性的,消息优先级固定 不确定,取决于主站调度
物理层 CAN-H / CAN-L,显性/隐性电平 A / B 差分对,无显隐性概念
典型速率 125kbps ~ 1Mbps(CAN 2.0) 最高10Mbps,但距离短
节点数 理论2032,实际110左右 32~256(取决于驱动芯片)

我的经验: 如果你做的是“一问一答”式的简单传感器采集,RS485成本更低。但一旦涉及多个控制器同时发数据、要求毫秒级响应、或者环境干扰大——直接上CAN,别犹豫。我曾经在一个项目中用RS485做多节点实时控制,结果总线冲突导致系统偶尔死锁,换成CAN后一次搞定。

1.3 CAN物理层特性——差分信号与显性/隐性电平

物理层是CAN的“地基”。你写再多软件,物理层没搞对,通信就是玄学。

1.3.1 差分信号——抗干扰的底气

CAN用两根线:CAN_H(高)和CAN_L(低)。信号不是对地测量的,而是看两根线之间的电压差。

  • 差分的好处: 外部电磁干扰同时作用在两根线上,差值基本不变。说白了,共模噪声被抵消了。
  • 典型电平: 总线空闲时,CAN_H和CAN_L都是2.5V,差值为0V。

注意: 千万不要把CAN_H和CAN_L接反!虽然有些收发器有极性自适应,但绝大多数没有。接反了整条总线都通不了。我见过不止一个新手在调试台上把线序搞反,查了半天以为是软件bug。

1.3.2 显性电平 vs 隐性电平——CAN的“投票”机制

这是CAN最独特的地方。总线上的电平只有两种状态:

  • 隐性(Recessive): 差压 ≈ 0V。表示逻辑“1”。所有节点都“不发言”时,总线处于隐性。
  • 显性(Dominant): 差压 ≈ 2V(CAN_H=3.5V,CAN_L=1.5V)。表示逻辑“0”。

关键规则: 显性电平会“覆盖”隐性电平。只要有一个节点输出显性,整条总线就是显性。

为什么会这样?因为CAN的收发器是开漏/开集电极结构,显性靠驱动管拉电流,隐性靠上拉电阻回弹。你想想看,这就像一群人开会——只要有人举手(显性),就算其他人都不举手(隐性),也算有人举手。

这个特性直接支撑了CAN的非破坏性逐位仲裁。多个节点同时发数据时,谁先发“0”(显性),谁就赢得总线。后面我会专门讲仲裁,这里先记住物理基础。

1.3.3 总线终端电阻——为什么必须加?

CAN总线两端各需要一只120Ω电阻。原因很简单:防止信号反射。

高速数字信号在线上传输,遇到阻抗不连续的地方就会反射,反射波叠加到原信号上,波形就畸变了。120Ω是CAN总线特征阻抗的典型值,匹配了就没反射。

经验值: 速率越高,终端电阻越重要。1Mbps时,不加终端电阻,总线长度超过几米就出错。125kbps时,不加也能跑几十米,但我不建议你省这个电阻——省出来的成本,不够你查一次bug的时间。

我曾经在一个项目中,现场总线长度约50米,速率500kbps。客户说“之前没加电阻也能跑啊”。结果一上电,偶尔丢帧,查了三天。最后加上120Ω电阻,问题消失。嗯,有些坑你踩过一次就记住了。

1.4 本章知识结构图

下面这张图帮你把CAN物理层的核心逻辑串起来:

CAN物理层知识结构 CAN物理层核心知识体系 CAN物理层 差分信号 CAN_H / CAN_L 电压差 抗共模干扰能力强 显性 / 隐性电平 显性=逻辑0 隐性=逻辑1 显性覆盖隐性 → 逐位仲裁 终端电阻 两端各120Ω,防反射 高速时必加,否则丢帧

1.5 小结与避坑

这一章我们聊了CAN的出身、它跟RS485的差异、以及物理层的三个核心点:差分信号、显性/隐性电平、终端电阻。

最后给你几个我踩过的坑:

  • 终端电阻别省: 省了就是给自己挖坑,尤其是高速长距离。
  • CAN_H/CAN_L别接反: 接反了整条总线沉默,查错查到你怀疑人生。
  • 共模电压范围: CAN收发器通常支持-2V~+7V共模,但现场接地不好时可能超出。我遇到过电机启动瞬间共模电压跳变导致通信中断,后来加了共模扼流圈才解决。
  • 线缆选择: 用双绞线,绞距越密越好。普通平行线在1Mbps下超过10米就不可靠。