1. CAN协议概述:从起源到物理层
各位同学,咱们今天正式开讲CAN总线。说实话,每次我带新人做嵌入式项目,第一个要问的就是——你选RS485还是CAN?很多人答不上来。这很正常,因为这两者表面看都是差分通信,但骨子里完全是两套思路。
我个人习惯把CAN比作「汽车工业的脊梁」。为什么这么说?因为从发动机到ABS,从车窗到门锁,一辆现代汽车里跑着几十条CAN总线。没有它,车就是个铁壳子。
1.1 CAN总线的起源
故事要从1980年代讲起。那时候汽车电子开始爆发,ECU越来越多,线束越来越重。我记得有个数据:一辆豪华车的线束总长能超过2公里,重量接近50公斤。这哪是造车,简直是织毛衣。
1983年,德国Bosch公司坐不住了。他们开始研发一种新的串行通信协议,目标很明确:
- 多主通信——任何节点都能主动发数据
- 实时性强——优先级高的报文不能等
- 可靠性高——抗干扰、能纠错
- 线束少——两根线搞定所有节点
1986年,CAN(Controller Area Network)正式发布。1993年成为国际标准ISO 11898。到今天,CAN已经统治汽车和工业控制领域超过30年。
核心认知:CAN不是最快的总线,但它是最「稳」的总线。在可靠性面前,速度可以妥协。
1.2 CAN vs RS485:一场硬碰硬的对比
很多工程师问我:RS485便宜又成熟,为什么还要用CAN?
嗯,这个问题我当年也纠结过。有一次做工业现场数据采集,我选了RS485,结果两个节点同时发数据,直接撞车,整个网络瘫痪。从那以后,我对CAN的「总线仲裁」能力佩服得五体投地。
咱们直接看对比表:
| 对比项 | CAN总线 | RS485 |
|---|---|---|
| 通信方式 | 多主,任意节点可主动发 | 单主,需主机轮询 |
| 冲突处理 | 硬件总线仲裁,无损 | 无仲裁,冲突即丢包 |
| 最大节点数 | 标准110个(实际建议40-60) | 标准32个(加中继可扩展) |
| 最高速率 | 1 Mbps(40米内) | 10 Mbps(短距离) |
| 最大距离 | 10 km(5 kbps时) | 1.2 km(100 kbps时) |
| 错误处理 | 5种错误检测+自动重发 | 无硬件错误处理 |
| 硬件成本 | 稍高(需CAN控制器+收发器) | 低(UART+收发器) |
| 典型应用 | 汽车、工业控制、医疗 | 工业仪表、楼宇自动化 |
我的建议:如果系统节点超过10个,或者对实时性有硬要求,直接上CAN。RS485在简单点对点场景下性价比更高,但别指望它做复杂网络。
1.3 CAN物理层特性:差分信号与电平
好了,咱们进入最核心的部分。CAN物理层用的是差分信号,两根线分别叫CAN_H和CAN_L。你想想看,为什么不用单端信号?
原因很简单:汽车和工厂里电磁干扰太严重了。单端信号受干扰后电平会飘,但差分信号看的是两根线的电压差,干扰同时作用在两根线上,差值不变。这就是CAN抗干扰的底气。
显性电平 vs 隐性电平
CAN总线只有两种逻辑状态:
- 隐性电平(Recessive):CAN_H和CAN_L都是2.5V,差分电压≈0V,逻辑值为1
- 显性电平(Dominant):CAN_H=3.5V,CAN_L=1.5V,差分电压≈2V,逻辑值为0
这里有个关键点:显性电平会「覆盖」隐性电平。也就是说,只要有一个节点拉显性,总线就是显性。这就是CAN总线仲裁的物理基础——谁先拉低,谁就赢。
我曾经踩过的坑:有一次调试CAN总线,发现通信时断时续。查了两天,最后发现是CAN_H和CAN_L接反了。差分信号极性反了,收发器还能工作,但抗干扰能力大幅下降。记住:CAN_H接CAN_H,CAN_L接CAN_L,别搞混!
物理层关键参数
| 参数 | ISO 11898-2标准值 | 说明 |
|---|---|---|
| 隐性电平CAN_H | 2.5V | 总线空闲或发送1时 |
| 隐性电平CAN_L | 2.5V | 与CAN_H等电位 |
| 显性电平CAN_H | 3.5V | 发送0时拉高 |
| 显性电平CAN_L | 1.5V | 发送0时拉低 |
| 差分电压(显性) | 2.0V(典型) | 接收器阈值通常1.2V |
| 终端电阻 | 120Ω(两端各一个) | 消除信号反射 |
| 共模电压范围 | -2V ~ +7V | 抗共模干扰能力 |
实战经验:终端电阻一定要加在总线两端,不是每个节点都加。我见过有人每个节点焊120Ω,结果总线负载太重,信号都畸变了。记住:两端各一个120Ω,中间节点不加。
1.4 CAN物理层知识结构图
下面这张图把CAN物理层的核心要素串起来了,方便你建立整体认知:
1.5 为什么CAN能「无损仲裁」?
这个问题我经常被问到。说白了,就是利用了「线与」特性。
当多个节点同时发送数据时,每个节点都会监听总线电平。如果自己发的是隐性(1),但总线上是显性(0),说明有更高优先级的节点在发数据。这时候,低优先级节点自动退出发送,转为接收模式。
整个过程由硬件完成,不丢数据,不浪费带宽。这就是CAN和RS485最本质的区别。
一句话总结:CAN的物理层设计,让总线仲裁变成了「谁先拉低谁赢」的硬件游戏。优先级高的报文永远不用等。
1.6 关于终端电阻的补充
嗯,这里再啰嗦一句。终端电阻的作用是吸收信号反射,防止波形畸变。但很多人不知道:
- 短距离低速(<1米,<50kbps):不加终端电阻也能工作,但不推荐
- 标准应用:两端各一个120Ω
- 长距离高速:必须精确匹配,否则信号反射会导致误码
我曾经在一个项目中偷懒没加终端电阻,结果总线长度超过10米后,通信完全乱套。加了电阻,问题立刻消失。所以,别省那两个电阻的钱。
好了,CAN协议概述就讲到这里。物理层是CAN的根基,理解差分信号和显性/隐性电平,后面讲数据链路层和仲裁机制时你会觉得豁然开朗。