1. CAN总线基础:从起源到物理层,一次讲透
大家好,我是老周。做嵌入式这些年,打交道最多的总线就是CAN。说实话,刚入行那会儿我也觉得CAN挺玄乎的——两根线怎么就能在那么恶劣的环境下稳定传数据?后来踩的坑多了,才慢慢摸透它的脾气。
这一章,咱们就从CAN的根儿上聊起。不扯虚的,全是干货。
1.1 CAN协议是怎么来的?
上世纪80年代,汽车里的电子设备越来越多。空调、ABS、发动机控制……每个模块都自己拉一堆线。你想想看,一辆车光线束就几十公斤,成本高、故障多。
1983年,德国Bosch公司开始研发一种新的串行通信协议。目标很明确:
- 用最少的两根线,把车上所有电子单元连起来
- 实时性要好,不能丢数据
- 抗干扰要强,毕竟发动机舱里全是电磁噪声
1986年,CAN(Controller Area Network)正式发布。我记得第一次看到CAN的文档时,最让我吃惊的是它的多主站架构——任何节点都能主动发消息,不需要主机轮询。这在当时是非常前卫的设计。
核心要点: CAN不是为办公室环境设计的,它天生就是为工业、汽车这类“脏乱差”场景准备的。所以它的物理层、协议层,处处都透着“抗造”两个字。
1.2 物理层特性:为什么CAN能跑那么远?
CAN的物理层,说白了就是一对双绞线,加上差分驱动器和接收器。但这里面的门道不少。
| 参数 | 高速CAN(ISO 11898-2) | 低速CAN(ISO 11898-3) |
|---|---|---|
| 最大速率 | 1 Mbps | 125 kbps |
| 最大总线长度 | 40 m @ 1 Mbps | 500 m @ 125 kbps |
| 显性电平 | CANH 3.5V / CANL 1.5V | CANH 5V / CANL 0V |
| 隐性电平 | CANH 2.5V / CANL 2.5V | CANH 2.5V / CANL 2.5V |
| 终端电阻 | 120 Ω(两端各一个) | 无强制要求 |
这里有个关键点:速率和距离是成反比的。我见过不少新手,上来就想跑1 Mbps、100米,结果通信一塌糊涂。为什么?因为信号在长线上有衰减,位时间太短,采样点对不准。
我的经验: 实际项目中,我一般按“速率 × 距离 ≤ 40”来估算。比如500 kbps,总线长度最好别超过80米。超过这个范围,丢包率会明显上升。
1.3 差分信号原理:两根线怎么抗干扰?
这是CAN最巧妙的地方。咱们先看个图:
差分信号的核心思想:不依赖单根线的绝对电压,而是看两根线之间的电压差。
- 显性(Dominant): CANH 3.5V,CANL 1.5V,差值为2V。代表逻辑“0”。
- 隐性(Recessive): CANH 2.5V,CANL 2.5V,差值为0V。代表逻辑“1”。
为什么会这样设计?我举个例子。假设发动机点火时产生了一个强电磁脉冲,两根线上同时被感应出+5V的噪声。如果是单端信号,早就乱套了。但差分信号呢?CANH变成8.5V,CANL变成6.5V,差值还是2V——数据纹丝不动。
注意: 差分信号虽然抗共模干扰强,但对差模干扰敏感。两根线的绞距、线缆的阻抗一致性,都会影响信号质量。我曾经在一个项目中,因为用了不同批次的线缆,导致CANH和CANL的延迟不一致,通信时好时坏。排查了整整两天才找到原因。
1.4 CAN总线拓扑结构:怎么连才靠谱?
CAN总线推荐的是直线型拓扑,也叫总线型。所有节点都挂在一对主干线上,每个节点通过短的支线接入。
这里有几个硬性规则,我建议你记牢:
- 终端电阻必须接在总线两端。120Ω,一个都不能少。少了反射,多了衰减。
- 支线越短越好。我见过有人用2米长的支线接一个传感器,结果整个网络都跑不稳。支线长了,相当于在总线上加了一个“小尾巴”,信号反射得一塌糊涂。
- 节点数有限制。标准CAN最多支持110个节点(取决于收发器驱动能力)。实际项目中,我一般控制在30个以内,超过这个数,总线负载和信号质量都会下降。
避坑指南: 我曾经在一个项目中,客户要求把CAN节点分布在三个机柜里,机柜之间距离15米。我用了星型拓扑,结果通信完全不行。后来改成总线型,每个机柜内用短支线接入主干,问题就解决了。记住:CAN不是以太网,别用星型。
1.5 小结:CAN物理层的三个关键点
聊了这么多,其实就三件事:
- 差分信号是CAN抗干扰的根基,理解它你就理解了CAN为什么能在工业现场活下来。
- 终端电阻是信号质量的保障,少了它,反射会让你怀疑人生。
- 总线拓扑是系统稳定的骨架,直线型、短支线,别搞花活。