第2章:CAN物理层——差分信号与电平定义
大家好,我是你们的实战派导师。今天咱们聊聊CAN总线的物理层。说实话,很多工程师一上来就扎进协议栈里,结果硬件上出了问题,排查半天才发现是物理层没搞对。我当年就吃过这个亏,所以这一章咱们把底子打扎实。
2.1 为什么CAN要用差分信号?
你想想看,汽车里发动机点火、空调压缩机启动,这些大电流设备一工作,整个车内的电磁环境简直是个噩梦。普通的单端信号(比如UART的TX/RX)在这种环境下,分分钟被干扰得面目全非。
CAN总线聪明就聪明在用了差分信号。说白了,就是一对线(CAN_H和CAN_L)同时传输,一个走高,另一个就走低。接收端看的是两根线的电压差,而不是对地的绝对电压。
核心公式:
差分电压 V_diff = V(CAN_H) - V(CAN_L)
当 V_diff > 0.9V 时,总线为显性(逻辑0)
当 V_diff ≈ 0V 时,总线为隐性(逻辑1)
我在项目里遇到过一件事:有个同事用示波器量CAN_H对地波形,发现毛刺很多,吓得不敢用了。我让他改测CAN_H和CAN_L的差分波形,结果干净得很。这就是差分信号的抗干扰能力——共模噪声会被抵消掉。
2.2 CAN_H与CAN_L的电平定义
咱们以最常用的ISO 11898-2高速CAN标准为例。总线空闲时,CAN_H和CAN_L都维持在2.5V左右,这叫隐性电平。当有节点发送数据时,CAN_H被拉高到3.5V,CAN_L被拉低到1.5V,这叫显性电平。
| 总线状态 | CAN_H电压 | CAN_L电压 | 差分电压 | 逻辑值 |
|---|---|---|---|---|
| 隐性(空闲) | 2.5V | 2.5V | ≈0V | 1 |
| 显性(发送) | 3.5V | 1.5V | ≈2V | 0 |
这里有个关键点:显性电平会覆盖隐性电平。也就是说,只要有一个节点拉出显性电平,整条总线就是显性的。这就是CAN总线仲裁的基础——谁先发0,谁就赢。
我的小技巧:调试时用万用表测CAN_H和CAN_L对地电压。如果两个都是2.5V左右,说明总线空闲。如果一个3.5V一个1.5V,说明有节点在发数据。这比看示波器快多了。
2.3 显性电平与隐性电平的博弈
为什么会设计成显性覆盖隐性?我打个比方:就像一群人开会,谁嗓门大谁先说话。在CAN总线里,逻辑0(显性)就是那个嗓门大的。多个节点同时发送时,谁先发0,谁就抢到总线控制权。
嗯,这里要注意:隐性电平不是0V,而是差分电压接近0V。很多新手以为隐性就是没信号,其实不是。隐性状态下,总线仍然有2.5V的共模电压,只是两根线电压相等而已。
我曾经帮一个客户排查问题,他们发现总线偶尔通信失败。查了半天,原来是CAN收发器的隐性电平漂到了2.7V,导致接收端误判。所以啊,收发器的共模电压稳定性很重要。
2.4 终端电阻:120Ω的奥秘
说到终端电阻,很多人的第一反应就是「CAN总线两端各接一个120Ω电阻」。但你知道为什么是120Ω吗?
这要从传输线理论说起。CAN总线的双绞线特性阻抗大约是120Ω。为了消除信号反射,终端电阻必须匹配这个阻抗。如果不匹配,信号会在总线末端反弹,造成波形畸变。
终端电阻的作用:
- 消除信号反射:匹配特性阻抗,防止波形振铃
- 提供偏置电压:隐性状态下,两个120Ω电阻分压,将总线偏置到2.5V
- 确定总线差分阻抗:两个120Ω并联,总阻抗60Ω
我见过最典型的错误,就是有人只在总线一端接了120Ω电阻。结果总线长度超过10米后,通信就时好时坏。示波器一看,波形末端有个明显的过冲。加上第二个120Ω电阻后,波形立刻干净了。
2.5 终端电阻的选型实战
选型时,我建议你关注以下几点:
- 功率:常规120Ω电阻用1/4W就够了。但如果总线有短路风险,建议用1/2W的。
- 精度:1%精度足够,5%的也能用,但匹配效果差一些。
- 封装:0805或1206都行,但要注意散热。我习惯用1206,焊接方便,功率余量大。
- 是否可拆卸:开发阶段建议用可插拔的终端电阻模块,方便调试。
警告:千万不要在总线中间节点上接终端电阻!我曾经见过一个项目,每个节点都焊了120Ω电阻,结果总线阻抗变成了20Ω,收发器直接过载保护。记住:终端电阻只在总线最远的两端各接一个。
2.6 实际电路中的注意事项
最后,分享几个我在量产项目中踩过的坑:
- 共模扼流圈:在CAN_H和CAN_L上串一个共模扼流圈,能有效抑制共模干扰。我一般选100μH的。
- ESD保护:CAN总线是外露的,必须加TVS管。推荐PESD1CAN或类似型号。
- 分叉线长度:从总线到节点的分支线(stub)越短越好,最好不超过30cm。长了会引起反射。
- 线缆类型:用双绞线,绞距越密越好。我习惯用AWG22或AWG24的屏蔽双绞线。
好了,这一章的内容就到这里。物理层是CAN总线的地基,地基不稳,上层协议再花哨也没用。下一章咱们聊聊CAN的数据链路层,看看报文是怎么在总线上跑的。
课后小作业:拿万用表量一下你手头CAN设备的CAN_H和CAN_L对地电压。如果总线空闲时不是2.5V左右,说明你的终端电阻或者收发器可能有问题。试试看?