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物理层的核心逻辑串起来:
1.5 小结与避坑
这一章我们聊了CAN的出身、它跟RS485的差异、以及物理层的三个核心点:差分信号、显性/隐性电平、终端电阻。
最后给你几个我踩过的坑:
- 终端电阻别省: 省了就是给自己挖坑,尤其是高速长距离。
- CAN_H/CAN_L别接反: 接反了整条总线沉默,查错查到你怀疑人生。
- 共模电压范围: CAN收发器通常支持-2V~+7V共模,但现场接地不好时可能超出。我遇到过电机启动瞬间共模电压跳变导致通信中断,后来加了共模扼流圈才解决。
- 线缆选择: 用双绞线,绞距越密越好。普通平行线在1Mbps下超过10米就不可靠。