第1章:CAN总线基础
1.1 CAN协议的起源——为什么会有这个东西?
说起CAN总线,得从上世纪80年代讲起。那时候汽车电子开始爆发,ECU越来越多,线束越来越重。我记得有个老工程师跟我吐槽过,说当时一辆豪华车的线束能绕地球...嗯,夸张了点,但确实有几十公斤重。
博世公司看不下去了。1983年,他们开始研发一种新的串行通信协议。目标很明确:用两根线代替一堆线。1986年,CAN协议正式发布。说白了,就是给汽车电子系统装了个「共享电话线」。
我在项目中遇到过最典型的场景:一个车门模块要跟BCM通信,传统做法是每个信号拉一根线。用了CAN之后,两根线搞定所有。你想想看,省了多少成本和重量。
核心要点:CAN(Controller Area Network)最初是为汽车设计的,现在工业自动化、医疗设备、机器人都在用。它的最大优势就是——用最少的线,传最多的数据。
1.2 物理层特性——两根线怎么传数据?
CAN总线的物理层,说白了就是一对双绞线。一根叫CAN_H(高电平线),一根叫CAN_L(低电平线)。
为什么用双绞线?我刚开始做CAN开发时也不理解。后来在EMC实验室待了一周才明白:双绞线能抵消电磁干扰。两根线绞在一起,外部干扰对两根线的影响几乎一样,差分接收器一减,干扰就没了。
物理层的关键参数,我列个表给你看:
| 参数 | 标准值 | 说明 |
|---|---|---|
| 总线电平 | 显性:CAN_H≈3.5V,CAN_L≈1.5V 隐性:CAN_H≈2.5V,CAN_L≈2.5V |
显性位覆盖隐性位 |
| 传输速率 | 最高1Mbps(CAN 2.0) 最高5Mbps(CAN FD) |
速率越高,总线长度越短 |
| 总线长度 | 1Mbps时约40m 125kbps时约500m |
跟速率成反比 |
| 终端电阻 | 120Ω(两端各一个) | 防止信号反射 |
注意:终端电阻必须加在总线两端。我曾经见过一个项目,工程师只在ECU内部焊了一个120Ω电阻,结果总线信号反射得一塌糊涂,通讯时好时坏。排查了三天才发现问题。
1.3 差分信号原理——为什么CAN这么抗干扰?
差分信号,是CAN总线最核心的物理层技术。我换个说法:它不是看一根线的电压,而是看两根线的电压差。
具体怎么工作的?
- 隐性状态(逻辑1):CAN_H和CAN_L都是2.5V,差值为0V
- 显性状态(逻辑0):CAN_H升到3.5V,CAN_L降到1.5V,差值为2V
接收器只关心这个差值。外部干扰来了,两根线同时升高或降低,差值不变。这就是差分信号的抗干扰原理。
我有个亲身经历:在一条生产线上,电机启动时电磁干扰特别大。单端信号(比如UART)根本没法用,数据全是错的。换成CAN总线,同样的线缆,同样的环境,通讯稳如老狗。嗯,这就是差分信号的价值。
小技巧:排查CAN总线物理层问题时,别只看单根线的波形。用示波器看CAN_H和CAN_L的差值波形,能快速定位问题。我习惯把示波器通道A接CAN_H,通道B接CAN_L,然后做数学运算A-B。这样一眼就能看出信号质量。
1.4 总线拓扑结构——节点怎么连?
CAN总线的拓扑结构,说白了就是一条主干线,所有节点都挂在这条线上。像一串葡萄挂在藤上。
标准拓扑要求:
- 主干线:从总线一端到另一端,不能有分支
- 节点:通过短截线(stub)连接到主干线
- 短截线长度:1Mbps时不超过0.3m,低速时可以长一些
为什么短截线不能太长?我解释一下:信号在线上传输需要时间。短截线太长,信号反射回来时正好赶上采样点,数据就错了。我在一个项目中见过有人把短截线拉了2米长,结果通讯时好时坏。剪短到30cm,问题消失。
常见的拓扑结构:
| 拓扑类型 | 特点 | 适用场景 |
|---|---|---|
| 直线型 | 所有节点在一条线上 | 标准CAN网络,最推荐 |
| 星型 | 节点通过集线器连接 | 需要隔离的场景 |
| 环型 | 首尾相连 | 不推荐,容易出问题 |
我的建议:能用直线型就别用其他拓扑。星型拓扑虽然看起来整齐,但信号反射问题很难处理。我见过一个星型拓扑的项目,调试了两个月才稳定下来。直线型拓扑,只要终端电阻加对了,基本不会出物理层问题。
1.5 避坑指南——我踩过的那些坑
做CAN开发这些年,物理层的问题我见过太多了。分享几个典型的:
- 终端电阻忘加:信号反射严重,通讯不稳定。我曾经在实验室调了一整天,最后发现是终端电阻没焊。
- CAN_H和CAN_L接反:所有节点都收不到数据。别笑,我见过不止一次。
- 共模电压超限:CAN收发器要求共模电压在-2V到+7V之间。超过这个范围,收发器会损坏。
- 地线没接好:虽然CAN是差分信号,但收发器需要参考地。地线接触不良,通讯会间歇性中断。
嗯,这些坑说起来简单,但每个我都花过不少时间。你记住一句话:CAN总线物理层的问题,90%都是终端电阻、接线、接地这三件事。先把这三样检查清楚,再去看协议层的问题。
下一章,我们聊聊CAN的数据链路层——报文是怎么组织的,ID是怎么分配的。到时候我会讲一个我调试过的「ID冲突导致整车通讯瘫痪」的案例,很有意思。