一、CAN总线基础:从起源到物理层
1.1 CAN协议是怎么来的?
CAN总线,全称Controller Area Network。上世纪80年代,汽车电子开始爆发。车里的ECU越来越多,线束越来越重,故障率也越来越高。
我记得有个老工程师跟我讲过,当年一辆豪华车的线束总长能超过2公里。你想想看,这得多重?多难查线?
1983年,德国Bosch公司开始研发一种新的串行通信协议。目标很明确:
- 减少线束数量
- 支持多主通信
- 实时性好
- 抗干扰能力强
1986年,CAN协议正式发布。后来ISO把它标准化为ISO 11898。说实话,这个协议的设计思路非常巧妙,30多年过去了,在工业、汽车、医疗、机器人领域依然活跃。
1.2 CAN vs RS485:到底差在哪?
很多初学者会问:CAN和RS485都是差分信号,能不能互换?
我的回答是:不能。虽然物理层看着像,但协议层完全是两码事。
我直接给你列个对比表,一目了然:
| 对比项 | CAN总线 | RS485 |
|---|---|---|
| 通信方式 | 多主,任意节点可主动发 | 一主多从,主机轮询 |
| 冲突处理 | 硬件仲裁,无损传输 | 无仲裁,需软件避免冲突 |
| 错误处理 | 5种错误检测机制,自动重发 | 无标准错误处理 |
| 实时性 | 高,优先级保证 | 低,依赖主机调度 |
| 最大节点数 | 标准110个(实际建议40以内) | 标准32个(加中继可扩展) |
| 典型速率 | 125kbps ~ 1Mbps | 最高10Mbps(短距离) |
| 成本 | 略高(需要CAN控制器) | 低(UART+收发器即可) |
我在项目里遇到过有人用RS485做多主通信,结果数据碰撞得一塌糊涂。后来换成CAN,硬件自动仲裁,问题直接解决。说白了,CAN的仲裁机制是它最值钱的地方。
1.3 物理层特性:差分信号
CAN物理层用的是差分信号。两根线:CAN_H和CAN_L。
为什么用差分?因为抗共模干扰能力强。工业现场电机启停、变频器干扰,单端信号很容易被拉偏。差分信号看的是两根线的电压差,干扰同时作用在两根线上,差值不变。
CAN总线的电平逻辑是这样的:
- 显性电平(Dominant): CAN_H ≈ 3.5V,CAN_L ≈ 1.5V,差分电压约2V,逻辑0
- 隐性电平(Recessive): CAN_H ≈ 2.5V,CAN_L ≈ 2.5V,差分电压约0V,逻辑1
这里有个关键点:显性电平会覆盖隐性电平。仲裁就是靠这个原理实现的——谁先发0,谁就赢得总线。
1.4 终端电阻:为什么必须加?
终端电阻是CAN总线里最容易出问题的地方。我见过太多因为终端电阻没加或者加错导致通信失败的案例。
终端电阻的作用有两个:
- 阻抗匹配: 防止信号反射。CAN总线特性阻抗约120Ω,终端电阻匹配后信号不会在末端反弹。
- 提供偏置: 保证总线在空闲时处于隐性电平(2.5V)。
标准做法:总线两端各加一个120Ω电阻。注意是两端,不是每个节点都加。
我曾经遇到一个项目,现场通信时好时坏。查了两天,最后发现有人在中间节点也加了120Ω电阻,等效电阻变成60Ω,信号反射得一塌糊涂。去掉中间那个,问题解决。
1.5 知识结构图
下面这张图帮你理清本章的核心脉络:
1.6 避坑指南
最后分享几个我踩过的坑:
我曾经在一个项目中,终端电阻加在了总线中间节点上。结果信号反射严重,125kbps都跑不稳。记住:终端电阻只在总线两端。
这个错误很常见。接反了不会烧设备,但通信完全不通。用万用表量一下CAN_H对地电压,显性时应该是3.5V左右,如果量出来是1.5V,那就是接反了。
CAN是差分信号,理论上可以不共地。但实际项目中,建议所有节点共地。不共地的话,节点间电位差可能超过收发器的共模范围,导致通信异常。
嗯,这一章就到这里。CAN的基础打牢了,后面讲协议帧、仲裁、错误处理的时候,你会理解得更深。