2. CAN物理层:差分信号原理、CAN_H与CAN_L电平定义、显性电平与隐性电平、总线终端电阻
好,咱们进入第二章。物理层,说白了就是信号在线上怎么跑的问题。很多刚入行的工程师觉得协议层难,但我个人经验恰恰相反——物理层出问题,排查起来才真要命。你想想看,协议栈跑不通还能抓个log分析,物理层要是波形畸变了,示波器一挂上去,满屏都是毛刺,那才叫头疼。
这一章我们就把CAN物理层的四个核心概念掰开揉碎讲清楚:差分信号、电平定义、显隐性逻辑、终端电阻。搞懂这些,你至少能应付80%的现场总线故障。
2.1 为什么CAN要用差分信号?
CAN总线用两根线传输——CAN_H和CAN_L。它不是单端对地传信号,而是靠两根线之间的电压差来传递信息。这就是差分信号。
我遇到过不少工程师问:为什么不用单端?省一根线多好。嗯,这里要注意——汽车环境太恶劣了。发动机点火、电机启停、电磁阀动作,哪个不是强干扰源?单端信号受共模噪声影响很大,地电位一飘,信号就乱套了。
差分信号的好处在于:
- 抗共模干扰:外部噪声同时耦合到CAN_H和CAN_L上,差分电压不变,信号不受影响。
- 抑制电磁辐射:两根线电流方向相反,磁场相互抵消,EMI大幅降低。
- 可靠性高:即使一根线断掉(对地短路或对电源短路),总线往往还能降级工作。
2.2 CAN_H与CAN_L的电平定义
CAN总线上的电平不是固定的5V或3.3V,它有两种状态:隐性(Recessive)和显性(Dominant)。咱们先看电平数值:
| 状态 | CAN_H电压 | CAN_L电压 | 差分电压 (CAN_H - CAN_L) |
|---|---|---|---|
| 隐性(逻辑1) | 2.5V | 2.5V | 0V |
| 显性(逻辑0) | 3.5V | 1.5V | 2V |
你看,隐性时两根线都是2.5V,差分电压为0。显性时CAN_H拉到3.5V,CAN_L拉到1.5V,差分电压约2V。这个2V的压差就是接收器判断“显性”的依据。
为什么会这样设计?我个人的理解是:隐性状态相当于总线“空闲”,所有节点都在监听;显性状态是某个节点在“发言”。而且显性电平可以覆盖隐性电平——这就是总线仲裁的基础,后面章节会细讲。
2.3 显性电平与隐性电平的博弈逻辑
CAN总线有个很有意思的特性:显性位覆盖隐性位。什么意思呢?
- 如果所有节点都发送隐性位(1),总线呈现隐性电平。
- 只要有一个节点发送显性位(0),总线就被拉成显性电平。
- 显性电平的驱动能力比隐性强——说白了就是“谁嗓门大谁说了算”。
这个机制是CAN总线无破坏性仲裁的基础。多个节点同时发送时,谁先发0(显性),谁就赢得总线控制权。发1(隐性)的节点自动退出发送,转为接收。
2.4 总线终端电阻——为什么必须加?
终端电阻是CAN总线物理层最容易忽略、也最容易出问题的地方。标准CAN总线要求在两端各接一个120Ω电阻,并联后等效60Ω。
为什么要加?两个原因:
- 阻抗匹配,消除信号反射:CAN总线是传输线,如果末端不匹配,信号会反射回来,造成波形畸变。我见过一个案例,某节点离主干线太远,分支线没加终端电阻,结果总线上的波形像心电图一样——全是振铃。
- 提供差分负载:收发器在发送显性位时需要电流回路。终端电阻就是那个负载。没有它,显性电平拉不下去。
终端电阻的选型要点:
- 标准值:120Ω,精度1%或5%。
- 功率:一般1/4W或1/2W足够,但如果是长距离高压总线,建议用1W。
- 位置:必须放在总线的最远端,不能放在中间节点上。
2.5 知识结构总览
下面这张图把本章的核心逻辑串起来了。你可以把它当作物理层的“思维导图”:
2.6 常见问题与排查思路
最后,我把自己这些年踩过的坑整理成一张表,你调试时可以直接对照:
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 总线一直显性,无法通信 | 某个节点收发器损坏,持续拉低总线 | 逐个断开节点,用万用表测CAN_H与CAN_L之间的电阻,正常应为60Ω |
| 通信距离短,丢帧严重 | 终端电阻缺失或位置不对 | 用示波器看波形末端是否有振铃,有则加终端电阻 |
| 隐性电平不是2.5V | 共模电压偏移,可能是地环路或电源问题 | 检查各节点地电位差,建议控制在1V以内 |
| 显性电平不足2V | 总线负载过重,节点太多或分支线太长 | 减少节点数,或使用CAN中继器 |