1. CAN总线基础与物理层信号特性
各位工程师朋友,咱们直接进入正题。CAN总线这东西,搞嵌入式的基本都绕不开。但说实话,很多人调了一两年CAN,遇到丢包还是只会抓波形、看ID、数CRC。物理层那点事儿,反而成了最容易被忽略的坑。
我个人习惯是,不管上层协议多复杂,先把手伸到物理层摸一遍。因为CAN总线80%的疑难杂症,根子都在差分信号和终端电阻上。你信不信?
1.1 差分信号:为什么CAN要用两根线?
CAN总线用两根线——CAN_H和CAN_L——传输一个信号。这不是浪费引脚,而是为了抗干扰。
说白了,差分信号就是“你高我低,你低我高”。发送端把逻辑1和0变成一对相反的电压,接收端拿CAN_H减去CAN_L,得到差分电压Vdiff。外部噪声同时耦合到两根线上,一减就抵消了。这就是共模抑制。
关键指标:
- 显性位(逻辑0):CAN_H ≈ 3.5V,CAN_L ≈ 1.5V,Vdiff ≈ 2.0V
- 隐性位(逻辑1):CAN_H ≈ 2.5V,CAN_L ≈ 2.5V,Vdiff ≈ 0V
我在项目里遇到过一件事:某次整车CAN通信间歇性丢包,示波器一挂,发现CAN_H波形正常,CAN_L波形上有个0.3V的毛刺。一查,是线束接头处CAN_L的压接端子松了。差分信号的优势,恰恰成了它的软肋——只要一根线出问题,整个通信就崩。
我的调试习惯:遇到丢包,先不急着看协议栈。拿万用表量一下CAN_H对地、CAN_L对地、CAN_H对CAN_L的电阻。三组数据能告诉你80%的物理层问题。
1.2 CAN_H/CAN_L电平标准:别被“5V”骗了
很多人以为CAN是5V逻辑,其实不是。CAN总线是“差分电压逻辑”,不是“对地电压逻辑”。
咱们来看ISO 11898-2标准定义的显隐性电平:
| 信号状态 | CAN_H电压 | CAN_L电压 | 差分电压Vdiff | 逻辑值 |
|---|---|---|---|---|
| 显性(Dominant) | 3.5V | 1.5V | 2.0V | 0 |
| 隐性(Recessive) | 2.5V | 2.5V | 0V | 1 |
注意:显性位“覆盖”隐性位。也就是说,只要有一个节点发送显性位,总线就是显性。这是CAN总线仲裁的基础——谁先发0,谁赢。
嗯,这里要注意一个坑:有些廉价CAN收发器,在空载时CAN_H和CAN_L的共模电压会漂。我见过一个案例,某国产收发器隐性时CAN_H只有2.3V,CAN_L有2.7V,差分电压-0.4V。虽然理论上还是隐性,但接收器的阈值裕量被吃掉了,长距离传输就容易误判。
避坑指南:我曾经因为收发器选型不当,导致总线在高温下频繁丢包。后来换成TI的SN65HVD230,问题解决。收发器的共模输入范围、延迟时间、驱动能力,这三个参数一定要看datasheet。
1.3 终端电阻:为什么必须是120Ω?
终端电阻的作用,说白了就两个:
- 阻抗匹配——防止信号反射
- 提供回流通路——让显性位有足够的电流
CAN总线的特性阻抗大约是120Ω(双绞线)。根据传输线理论,如果终端电阻不等于特性阻抗,信号到达末端就会反射回来,叠加在原信号上,造成波形畸变。畸变严重了,接收器就会误判位电平,丢包就来了。
为什么是120Ω?因为CAN总线设计时,双绞线的特性阻抗就定在120Ω左右。你想想看,如果换成50Ω或者1kΩ,反射系数就不是0了,波形会变成什么样?
终端电阻的黄金法则:
- 标准CAN(1Mbps以下):总线两端各一个120Ω电阻
- 低速CAN(125kbps以下):可以只用单端电阻,但我不建议
- CAN FD(更高速度):终端电阻必须精确,甚至要用可调电阻
我遇到过最典型的故障:一个节点内部已经焊了120Ω终端电阻,但设计者不知道,又在总线两端各加了一个120Ω。结果三个电阻并联,等效电阻只有40Ω。显性位时电流过大,收发器过热保护,通信时断时续。查了两天才找到原因。
快速检查方法:断电状态下,用万用表量CAN_H和CAN_L之间的电阻。如果总线两端各有一个120Ω,且没有其他负载,你应该量到60Ω。如果量到120Ω,说明只有一端有电阻;如果量到40Ω,说明有三个电阻并联。这个数值能帮你快速定位终端电阻配置问题。
1.4 知识结构总览
下面这张图,把本章的核心知识点串起来了。你可以把它当作调试时的检查清单。
1.5 本章小结
物理层是CAN总线的地基。差分信号给了你抗干扰能力,但也要求两根线必须同时健康。终端电阻看似简单,但配置错了就是灾难。电平标准你得记牢,示波器上一眼就能看出显隐性是否正常。
我个人建议,每次拿到一个新项目,先花10分钟把CAN物理层测一遍。这10分钟,能帮你省下后面几天的调试时间。你想想看,是不是这个道理?