2. 物理层基础:差分信号原理、CAN_H与CAN_L电平定义、显性电平与隐性电平
大家好,我是你们的嵌入式讲师。今天咱们聊聊CAN通信的物理层。说实话,很多初学者一上来就盯着协议栈、报文格式猛啃,结果板子一焊好,通信死活调不通。为什么?物理层没搞明白。我当年也吃过这个亏,所以这一章,咱们把底子打扎实。
2.1 为什么CAN要用差分信号?
你想想看,汽车里发动机点火、空调压缩机启动、车窗升降……这些动作都会产生巨大的电磁干扰。如果用普通的单端信号(比如UART的TX/RX对GND),干扰一上来,电平就飘了,数据全乱套。
CAN总线用的是差分信号。说白了,就是一对线(CAN_H和CAN_L)来传一个bit。接收端不看某根线对地的电压,而是看两根线之间的电压差。干扰来了?两根线上的噪声是同步的,一减就抵消了。这就是共模抑制。
我在项目中遇到过最典型的情况:一个电机驱动器一启动,旁边的RS485就乱码。换成CAN之后,同样的线束、同样的干扰环境,稳如老狗。这就是差分信号的价值。
核心结论:差分信号抗干扰能力强,适合长距离、高噪声环境。CAN总线就是靠这个在汽车和工业领域站稳脚跟的。
2.2 CAN_H与CAN_L的电平定义
CAN总线上的两根线,名字很直白:CAN_H(高线)和CAN_L(低线)。它们不是随便叫的,电平有严格定义。
咱们先看一组典型数据(以ISO 11898-2标准的高速CAN为例):
| 状态 | CAN_H电压 | CAN_L电压 | 差分电压 (CAN_H - CAN_L) |
|---|---|---|---|
| 隐性 (Recessive) | 2.5V | 2.5V | 0V |
| 显性 (Dominant) | 3.5V | 1.5V | 2V |
嗯,这里要注意:隐性时两根线都是2.5V,差分电压为0。显性时CAN_H拉到3.5V,CAN_L拉到1.5V,差分电压约2V。接收器就是靠这个差分电压来判断总线状态的。
我个人习惯用示波器看CAN_H和CAN_L的波形。两根线像镜像一样摆动,看着特别舒服。如果你手边有示波器,建议抓一下,印象会深很多。
2.3 显性电平与隐性电平
这两个概念是CAN物理层的灵魂。咱们用白话讲:
- 隐性电平:总线空闲时的状态。此时CAN_H和CAN_L都是2.5V,差分电压为0。所有节点都在“听”,没人说话。
- 显性电平:有节点在发送数据时的状态。此时差分电压约为2V。显性电平会“覆盖”隐性电平。
为什么会这样?因为CAN总线是“线与”逻辑。多个节点同时发送时,只要有一个节点输出显性,总线就是显性。隐性只有在所有节点都输出隐性时才成立。这有点像开会的场景:只要一个人说话(显性),其他人就得听着(隐性)。
避坑指南:我曾经在一个项目里,把CAN收发器的RS引脚(斜率控制)接错了,导致隐性电平拉不到2.5V,一直飘在2.8V左右。结果总线上的节点互相收不到数据,排查了两天才发现。所以,隐性电平的稳定性很重要,别忽略。
2.4 知识体系:一张图看懂物理层
下面我用SVG画了一张图,把这一章的核心逻辑串起来。你看完应该能明白:差分信号、电平定义、显性隐性,这三者是怎么配合的。
2.5 实际应用中的小细节
讲完理论,咱们聊点实战的。我建议你在设计CAN节点时,注意以下几点:
- 终端电阻不能省。 CAN总线两端各需要120Ω电阻,用来匹配阻抗、抑制反射。没有它,信号会振铃,通信距离和速率都会受影响。
- 共模电压范围。 标准CAN收发器(如TJA1050)的共模输入范围是-2V到+7V。如果超出这个范围,收发器可能损坏。我在一个项目里遇到过地线没接好,共模电压飙到12V,直接烧了一片收发器。
- 线束选择。 双绞线是标配,绞距越密抗干扰越好。别图便宜用平行线,那是给自己挖坑。
警告:千万不要在CAN_H和CAN_L之间直接短路测试!有些收发器没有短路保护,一短路就冒烟。我亲眼见过同事这么干,板子直接报废。正确的做法是用示波器探头去测,或者加个限流电阻。
2.6 小结
这一章咱们把CAN物理层的三个核心概念捋了一遍:差分信号为什么牛、CAN_H和CAN_L的电平怎么定义、显性和隐性怎么工作。说白了,物理层就是CAN通信的“地基”。地基不稳,上层协议再花哨也是白搭。
你如果现在去调一个CAN节点,先别急着写代码。拿万用表量一下CAN_H和CAN_L对地的电压,看看是不是2.5V左右。再量一下差分电压,显性时有没有2V。这些基本功,比背一百个报文格式都管用。
好,这一章就到这儿。记住:物理层搞明白了,后面的事就顺了。