2. CAN物理层:差分信号原理、CAN_H与CAN_L电平定义、显性电平与隐性电平、总线终端电阻

好,咱们进入第二章。物理层,说白了就是信号在线上怎么跑的问题。很多刚入行的工程师觉得协议层难,但我个人经验恰恰相反——物理层出问题,排查起来才真要命。你想想看,协议栈跑不通还能抓个log分析,物理层要是波形畸变了,示波器一挂上去,满屏都是毛刺,那才叫头疼。

这一章我们就把CAN物理层的四个核心概念掰开揉碎讲清楚:差分信号、电平定义、显隐性逻辑、终端电阻。搞懂这些,你至少能应付80%的现场总线故障。

2.1 为什么CAN要用差分信号?

CAN总线用两根线传输——CAN_H和CAN_L。它不是单端对地传信号,而是靠两根线之间的电压差来传递信息。这就是差分信号。

我遇到过不少工程师问:为什么不用单端?省一根线多好。嗯,这里要注意——汽车环境太恶劣了。发动机点火、电机启停、电磁阀动作,哪个不是强干扰源?单端信号受共模噪声影响很大,地电位一飘,信号就乱套了。

差分信号的好处在于:

  • 抗共模干扰:外部噪声同时耦合到CAN_H和CAN_L上,差分电压不变,信号不受影响。
  • 抑制电磁辐射:两根线电流方向相反,磁场相互抵消,EMI大幅降低。
  • 可靠性高:即使一根线断掉(对地短路或对电源短路),总线往往还能降级工作。
我的经验: 曾经有个项目,样车跑起来CAN通信偶尔丢帧,查了三天没结果。后来用差分探头看波形,发现CAN_L对地有0.3V的直流偏置,是某个节点的共模扼流圈焊反了。差分信号虽然抗干扰,但PCB布局不对称照样出问题——两根线的走线长度、阻抗必须尽量一致。

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(隐性)的节点自动退出发送,转为接收。

关键点: 显性电平对应逻辑0,隐性电平对应逻辑1。这和很多人的直觉相反——0反而是“强势”的。我刚接触CAN时也搞反过,后来记住一句话:“0是老大,1是老二”。

2.4 总线终端电阻——为什么必须加?

终端电阻是CAN总线物理层最容易忽略、也最容易出问题的地方。标准CAN总线要求在两端各接一个120Ω电阻,并联后等效60Ω。

为什么要加?两个原因:

  1. 阻抗匹配,消除信号反射:CAN总线是传输线,如果末端不匹配,信号会反射回来,造成波形畸变。我见过一个案例,某节点离主干线太远,分支线没加终端电阻,结果总线上的波形像心电图一样——全是振铃。
  2. 提供差分负载:收发器在发送显性位时需要电流回路。终端电阻就是那个负载。没有它,显性电平拉不下去。

终端电阻的选型要点:

  • 标准值:120Ω,精度1%或5%。
  • 功率:一般1/4W或1/2W足够,但如果是长距离高压总线,建议用1W。
  • 位置:必须放在总线的最远端,不能放在中间节点上。
避坑指南: 我曾经在一个项目中看到有人把终端电阻焊在每个节点上,结果等效电阻只有20Ω,收发器过载发热,通信时断时续。记住:只有总线两端加电阻,中间节点不要加。另外,如果总线长度超过1km,终端电阻可能需要根据线缆特性阻抗调整,不一定是120Ω。

2.5 知识结构总览

下面这张图把本章的核心逻辑串起来了。你可以把它当作物理层的“思维导图”:

CAN物理层核心知识结构 CAN物理层核心要素 差分信号 电平定义 显性/隐性 终端电阻 CAN_H / CAN_L 双线 抗共模干扰 抑制EMI辐射 隐性:2.5V / 2.5V 显性:3.5V / 1.5V 差分电压:0V / 2V 显性=逻辑0(强势) 隐性=逻辑1(弱势) 显性覆盖隐性 两端各120Ω 消除信号反射 提供差分负载 核心逻辑:差分传输 → 电平定义 → 显隐性仲裁 → 终端匹配 四个要素缺一不可,任何一个出问题都会导致总线通信异常

2.6 常见问题与排查思路

最后,我把自己这些年踩过的坑整理成一张表,你调试时可以直接对照:

现象 可能原因 排查方法
总线一直显性,无法通信 某个节点收发器损坏,持续拉低总线 逐个断开节点,用万用表测CAN_H与CAN_L之间的电阻,正常应为60Ω
通信距离短,丢帧严重 终端电阻缺失或位置不对 用示波器看波形末端是否有振铃,有则加终端电阻
隐性电平不是2.5V 共模电压偏移,可能是地环路或电源问题 检查各节点地电位差,建议控制在1V以内
显性电平不足2V 总线负载过重,节点太多或分支线太长 减少节点数,或使用CAN中继器
我的习惯: 每次做CAN网络调试,第一件事就是用万用表量CAN_H和CAN_L之间的电阻。如果测出来是60Ω左右,说明终端电阻正常;如果是120Ω,说明只有一端有电阻;如果是0Ω或无穷大,那肯定有短路或断路。这个习惯帮我省了无数排查时间。