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 知识结构总览

下面这张图把本章的核心知识点串起来了。我建议你保存下来,后面学仲裁、错误处理、位时序的时候,随时回来对照。

CAN总线基础——知识结构图 CAN总线基础 1. 协议起源 2. CAN vs RS485 3. 物理层特性 1986年 Bosch 发布 目标:减少线束、高可靠、实时 应用:汽车 → 工业 → 医疗 CAN:多主 + 硬件仲裁 + CRC RS485:单主从 + 软件冲突处理 选型:实时性要求高 → CAN 差分信号:CAN_H / CAN_L 隐性:2.5V + 2.5V = 0V 显性:3.5V + 1.5V = 2V 核心要点 差分信号抗干扰 → 显性覆盖隐性 → 硬件仲裁 → 高可靠实时通信

1.5 本章小结

这一章我们聊了三件事:

  • CAN的起源——为了解决汽车线束过多和可靠性问题而生
  • CAN与RS485的对比——CAN是完整协议栈,RS485只是物理层
  • 物理层核心特性——差分信号抗干扰,显性/隐性电平决定仲裁基础