1. CAN总线基础:从起源到物理层
大家好,我是你们这门课的老朋友。做嵌入式这些年,我调试过的总线协议少说也有七八种,但要说最让我又爱又恨的,还得是CAN。爱它稳定可靠,恨它坑起来也真能让人抓狂。今天咱们就从根上聊聊,CAN到底是个什么东西。
1.1 CAN协议的起源——为什么会有它?
上世纪80年代,汽车里的电子设备越来越多。空调、ABS、发动机控制、车窗……每个模块都独立接线,线束又粗又重,故障率还高。我记得当时看过一张老款奔驰的线束图,密密麻麻跟蜘蛛网似的。
1983年,德国Bosch公司开始研发一种新的串行通信协议。1986年,CAN(Controller Area Network)正式发布。它的目标很明确:
- 减少线束——两根线搞定所有节点通信
- 高可靠性——汽车环境电磁干扰大,不能丢数据
- 实时性——刹车信号延迟几毫秒都可能出事故
说白了,CAN就是为“恶劣环境下的实时控制”而生的。后来它不光用在车上,工业自动化、医疗设备、机器人、无人机……到处都能看到它的身影。
核心认知:CAN不是通用通信协议,它是为“确定性实时控制”设计的。你拿它传大文件?那不合适。但你要控制电机、采集传感器、传输状态——CAN是首选。
1.2 CAN vs RS485——到底差在哪?
很多初学者会问:RS485也是差分信号,也能多节点通信,为什么不用它?
嗯,这个问题我当年也纠结过。后来在项目里两种都用过,才真正体会到区别。咱们直接看对比:
| 对比项 | CAN | RS485 |
|---|---|---|
| 通信方式 | 多主总线,任意节点可主动发 | 单主从,需主机轮询 |
| 冲突处理 | 硬件自动仲裁,无损传输 | 软件处理,冲突即丢包 |
| 错误检测 | CRC + 多种错误机制,硬件自动重发 | 通常只有奇偶校验或无 |
| 实时性 | 确定性的,优先级高的帧不等待 | 取决于主机轮询周期 |
| 最大节点数 | 标准110个(实际建议40-60) | 标准32个(加驱动可更多) |
| 典型速率 | 125kbps ~ 1Mbps | 最高10Mbps(但距离短) |
| 成本 | 控制器+收发器,稍贵 | 仅需收发器,便宜 |
看到区别了吗?RS485是“物理层”标准,它只规定了电平怎么传,上层协议你自己写。而CAN是完整的“物理层+数据链路层”,它连谁先发、发错了怎么办都帮你管好了。
我的建议:如果你做的是简单的传感器采集,节点少、速率要求不高,RS485够用还省钱。但如果你需要多个设备自主通信、对实时性有硬要求——老老实实用CAN,别自己造轮子。
1.3 CAN物理层特性——两根线里的门道
CAN物理层最核心的就两件事:差分信号和显性/隐性电平。搞懂这两个,你就理解了CAN为什么抗干扰那么强。
1.3.1 差分信号——为什么两根线比一根线强?
CAN总线用两根线:CAN_H(高线)和CAN_L(低线)。信号不是对地测量的,而是看两根线之间的电压差。
举个例子:
- 外界来了一个电磁干扰,同时作用在CAN_H和CAN_L上
- 两根线上的电压都升高了0.5V
- 但它们的差值不变——接收器读到的还是原始信号
这就是共模抑制。我在一个电机驱动项目里遇到过,电机启动瞬间地弹噪声能到±5V,但CAN通信纹丝不动。换成单端信号?早乱码了。
1.3.2 显性电平 vs 隐性电平——谁说了算?
CAN总线上只有两种状态:
| 状态 | CAN_H电压 | CAN_L电压 | 差分电压 | 逻辑值 |
|---|---|---|---|---|
| 隐性(Recessive) | 2.5V | 2.5V | ≈0V | 1(逻辑高) |
| 显性(Dominant) | 3.5V | 1.5V | ≈2V | 0(逻辑低) |
这里有个关键点:显性电平会“覆盖”隐性电平。如果一个节点发隐性,另一个节点发显性,总线上最终是显性。这就是CAN仲裁的物理基础——谁先拉低总线,谁就赢。
避坑指南:我曾经在一个项目里,终端电阻焊错了位置,导致CAN_H和CAN_L的偏置电压不对。隐性电平从2.5V漂到了2.8V,结果总线一直处于“弱显性”状态,所有节点都发不出数据。排查了两天才找到原因——记住,终端电阻必须接在总线两端,阻值120Ω,不能少。
1.4 知识结构总览
下面这张图把本章的核心知识点串起来了。我建议你保存下来,后面学仲裁、错误处理、位时序的时候,随时回来对照。
1.5 本章小结
这一章我们聊了三件事:
- CAN的起源——为了解决汽车线束过多和可靠性问题而生
- CAN与RS485的对比——CAN是完整协议栈,RS485只是物理层
- 物理层核心特性——差分信号抗干扰,显性/隐性电平决定仲裁基础