1. CAN总线基础:从起源到物理层,一个老工程师的实战笔记
大家好,我是老张。做嵌入式通信这块快二十年了,CAN总线是我打交道最多的协议之一。今天咱们聊聊CAN总线的基础,这些东西看着简单,但真要在项目里用好,还是有不少门道的。
1.1 CAN协议的起源——为什么会有CAN?
上世纪80年代,汽车里的电子设备越来越多。你想想看,发动机、ABS、气囊、仪表盘……每个模块都要互相通信。传统的点对点接线,线束又重又贵,还容易出故障。
1983年,德国博世公司开始研发一种新的串行通信协议。1986年,CAN(Controller Area Network)正式诞生。我最早接触CAN是在2005年做车载诊断设备时,那时候国内用CAN的还不多,资料也少,啃了不少英文文档。
CAN的设计目标很明确:
- 高可靠性——汽车环境电磁干扰大,通信不能掉链子
- 实时性——刹车信号延迟几毫秒可能就是事故
- 低成本——两根线搞定所有节点通信
说白了,CAN就是为工业现场和汽车这种恶劣环境量身定做的。
1.2 物理层特性——两根线里的大学问
CAN总线物理层用的是两根差分信号线:CAN_H(高)和CAN_L(低)。我见过不少新手,上来就问为什么不用单端信号?嗯,这里面的门道我慢慢说。
| 参数 | 典型值 | 说明 |
|---|---|---|
| 总线电平 | 显性:CAN_H≈3.5V,CAN_L≈1.5V 隐性:CAN_H≈2.5V,CAN_L≈2.5V |
显性位覆盖隐性位 |
| 传输速率 | 最高1Mbps(40米内) 常用125kbps~500kbps |
速率越高,距离越短 |
| 终端电阻 | 120Ω(两端各一个) | 消除信号反射 |
| 最大节点数 | 理论上110个(实际建议不超过30) | 受驱动能力限制 |
我在做充电桩项目时,遇到过一个问题:通信距离超过100米,速率设到500kbps,结果丢包严重。后来查资料才发现,CAN总线的速率和距离是成反比的。1Mbps下最多40米,降到250kbps就能跑200米左右。这个经验让我少走了很多弯路。
1.3 差分信号原理——为什么CAN这么抗干扰?
差分信号,说白了就是两根线传同一个信号,但相位相反。接收端看的是两根线的电压差,而不是对地电压。
为什么会这样设计?我举个例子:
- 假设CAN_H受到一个+1V的干扰
- CAN_L也会受到同样的+1V干扰(因为两根线绞在一起)
- 接收端计算:CAN_H - CAN_L = (3.5+1) - (1.5+1) = 2V
- 干扰被抵消了!
这就是差分信号的魅力。我曾经在工厂现场调试,旁边就是大功率变频器,普通RS485通信根本没法用,但CAN总线稳如老狗。嗯,从那以后我对差分信号就特别信任。
核心要点:差分信号共模抑制比(CMRR)高,能有效抵抗共模干扰。这也是CAN总线在工业环境中广泛应用的原因之一。
1.4 CAN总线拓扑结构——怎么连才靠谱?
CAN总线推荐的是直线型拓扑,也叫总线型。所有节点都挂在两根主干线上,两端各加一个120Ω终端电阻。
我见过最典型的错误拓扑:
- 星型拓扑——信号反射严重,通信不稳定
- 环型拓扑——一旦断线,整个网络瘫痪
- 树型拓扑——分支过长,阻抗不匹配
避坑指南:我曾经在一个充电桩项目中,客户非要搞星型连接,说方便布线。结果调试时发现,距离中心节点最远的那个桩总是丢帧。后来改成总线型,问题立刻解决。记住:CAN总线不是以太网,别玩花哨拓扑。
实际布线时要注意几点:
- 主干线尽量短,分支线(stub)不超过30cm
- 终端电阻必须加,而且要在物理两端
- CAN_H和CAN_L要双绞,绞距越密越好
- 屏蔽层单端接地,避免地环路
我的小技巧:做样机测试时,可以用示波器看CAN_H和CAN_L的波形。正常波形应该是:隐性时两根线都是2.5V,显性时CAN_H跳到3.5V,CAN_L降到1.5V。如果波形有毛刺或台阶,多半是终端电阻没加对,或者分支线太长。
1.5 总结——这些基础够用了吗?
说实话,CAN总线的基础知识远不止这些。但作为入门,理解协议起源、物理层特性、差分信号原理和拓扑结构,已经能应付大部分开发场景了。
我个人的习惯是:每接触一个新项目,先画好总线拓扑图,算好通信距离和速率,再动手做硬件设计。这一步省了,后面调试时哭都来不及。
下一章咱们聊聊CAN的数据链路层,包括帧格式、仲裁机制和错误处理。那些才是真正让CAN与众不同的地方。