2、CAN总线基础(上):CAN总线物理层特性、差分信号、CAN_H与CAN_L、终端电阻的作用与测量
好,咱们正式开始聊CAN总线。很多刚入行的工程师觉得CAN协议栈很复杂,各种帧结构、位时序、错误处理……但我想说,万丈高楼平地起,物理层要是没搞明白,后面全是空中楼阁。我见过太多排查到半夜的问题,最后发现是终端电阻没焊、或者CAN_H和CAN_L接反了。所以,这一章咱们先把物理层的底子打扎实。
2.1 CAN总线的物理层特性
CAN总线是差分信号总线,这一点是它的灵魂。为什么汽车这种电磁环境极其恶劣的地方,偏偏选中了CAN?说白了,就是差分信号抗干扰能力强。
咱们看看CAN总线的几个关键物理参数:
| 参数 | 典型值 | 说明 |
|---|---|---|
| 总线电平 | 显性:CAN_H≈3.5V,CAN_L≈1.5V 隐性:CAN_H≈2.5V,CAN_L≈2.5V |
显性电平差约2V,隐性电平差约0V |
| 最大传输速率 | 1 Mbps(ISO 11898-2) | 实际车载常用250kbps或500kbps |
| 最大总线长度 | 40m @ 1Mbps | 速率越低,距离可以越长 |
| 节点数 | 最多30个(标准) | 受收发器驱动能力限制 |
| 终端电阻 | 120Ω(两端各一个) | 匹配总线特性阻抗 |
嗯,这里要注意,上面说的电平值是针对5V供电的CAN收发器。现在很多车也用3.3V的收发器,电平会略有不同,但原理一样。
2.2 差分信号:为什么是CAN的护身符?
差分信号,说白了就是两根线一起传信号。一根叫CAN_H,一根叫CAN_L。发送端让这两根线的电压朝着相反方向变化,接收端只看它们之间的电压差。
为什么会这样设计?你想想看,汽车发动机点火、电机运转、各种继电器吸合……这些都会产生强烈的电磁干扰。如果用的是单端信号(比如一根信号线对地),干扰信号会叠加在信号线上,接收端根本分不清哪个是信号、哪个是噪声。
但差分信号就不一样了。干扰信号同时作用在CAN_H和CAN_L上,两根线上的噪声幅度几乎一样。接收端一相减,噪声就被抵消了。这就是所谓的「共模抑制」。我在项目中遇到过好几次,明明示波器看CAN_H和CAN_L对地都有很大的毛刺,但总线通信就是正常。这就是差分信号的厉害之处。
核心要点:
- 显性位(Dominant):CAN_H - CAN_L ≈ 2V,逻辑上代表"0"
- 隐性位(Recessive):CAN_H - CAN_L ≈ 0V,逻辑上代表"1"
- 显性位会覆盖隐性位——这是CAN总线仲裁的基础
2.3 CAN_H与CAN_L:别小看这两根线
很多新手觉得CAN_H和CAN_L不就是两根线嘛,接上就行。其实不然。我见过最离谱的故障,是产线上工人把CAN_H和CAN_L接反了,结果整车网络时通时断,查了两天才找到原因。
咱们来看看CAN_H和CAN_L在总线上的正确接法:
- CAN_H(高电平线):显性时电压升高到约3.5V,隐性时回落到2.5V
- CAN_L(低电平线):显性时电压降低到约1.5V,隐性时回升到2.5V
这两根线必须双绞在一起。为什么?因为双绞线能进一步抑制电磁干扰。两根线绞合得越紧密,抗干扰能力越强。我个人的习惯是,在布线时尽量让CAN_H和CAN_L远离大电流线束,比如电机线、电池线。实在避不开,也要保持至少10cm的距离。
小技巧:用万用表测量CAN_H和CAN_L对地的电压,可以快速判断总线状态:
- 如果两根线都是2.5V左右,说明总线处于隐性状态(空闲)
- 如果CAN_H≈3.5V、CAN_L≈1.5V,说明总线上有节点在发送显性位
- 如果两根线电压异常(比如一根0V、一根5V),大概率是收发器烧了或者短路了
2.4 终端电阻的作用与测量
终端电阻,这是CAN总线物理层里最容易出问题的地方。我曾经在售后现场排查一个偶发通信故障,换了三个ECU都没解决,最后发现是总线末端的终端电阻虚焊了。
终端电阻的作用有两个:
- 阻抗匹配:防止信号在总线末端反射。没有终端电阻,信号会在总线两端来回反射,造成波形畸变,导致通信错误。
- 提供隐性电平:当所有节点都处于隐性状态时,终端电阻把CAN_H和CAN_L拉到相同的2.5V电平。
标准要求:在总线两端各接一个120Ω电阻。为什么是120Ω?因为CAN总线使用的双绞线特性阻抗大约是120Ω。两个120Ω并联,总线上测得的等效电阻就是60Ω。
注意:测量终端电阻时,一定要在断电状态下测量!而且最好把ECU的插头拔掉,因为ECU内部的收发器也会影响测量结果。
测量方法很简单:
- 用万用表电阻档,红表笔接CAN_H,黑表笔接CAN_L
- 正常值应该在60Ω左右(两个120Ω并联)
- 如果测到120Ω,说明只有一个终端电阻(总线一端没接)
- 如果测到0Ω,说明CAN_H和CAN_L短路了
- 如果测到无穷大,说明总线断路了
嗯,这里有个坑。有些ECU内部也集成了终端电阻,比如某些网关模块。如果你在总线上又外接了一个120Ω电阻,那等效电阻就变成60Ω并联内部电阻,可能低于60Ω。所以设计时一定要搞清楚哪些节点内部已经带了终端电阻。
避坑指南:
我曾经遇到一个案例,客户反映某条CAN总线在高温环境下通信不稳定。排查后发现,终端电阻用的是普通贴片电阻,温漂太大。高温下阻值变了,导致阻抗不匹配。从那以后,我选终端电阻都指定用低温漂的精密电阻,尤其是靠近发动机舱的节点。
好了,这一章咱们把CAN总线的物理层基础捋了一遍。差分信号怎么工作、CAN_H和CAN_L怎么接、终端电阻怎么测——这些看起来简单,但恰恰是现场排查问题最常用的手段。下一章咱们接着聊CAN总线的数据链路层,看看那些帧结构、位填充、CRC校验到底是怎么回事。