第1章:CAN总线物理层基础

各位同行,今天咱们聊聊CAN总线物理层。说实话,很多通信丢失故障,根子就在物理层。我处理过的案例里,至少六成是物理层问题。你想想看,物理层都不稳,上层协议再完美也没用。

1.1 CAN_H与CAN_L的电平逻辑

CAN总线用两根线传输数据:CAN_H和CAN_L。它们不是简单的0和1,而是靠差分电压来传递信号。

什么叫差分电压?说白了,就是CAN_H减去CAN_L的差值。这个差值决定了总线状态:

  • 显性电平(Dominant):CAN_H比CAN_L高2V左右。此时总线被拉低,逻辑上代表"0"。
  • 隐性电平(Recessive):CAN_H和CAN_L电压几乎相等(约2.5V)。此时总线处于空闲,逻辑上代表"1"。

我刚开始接触CAN时,总觉得这设计有点绕。后来才明白,差分信号抗干扰能力极强。你想想,外界噪声同时作用在两根线上,差值基本不变。这就是为什么CAN能在发动机舱这种恶劣环境里稳定工作。

关键参数速查表

参数显性电平隐性电平
CAN_H电压3.5V2.5V
CAN_L电压1.5V2.5V
差分电压2.0V0V
逻辑值01

嗯,这里要注意:显性电平会覆盖隐性电平。也就是说,只要有一个节点发送显性位,总线就是显性状态。这是CAN总线仲裁机制的基础。

1.2 终端电阻的作用

终端电阻,每个CAN工程师都绕不开的东西。它的标准值是120Ω,安装在总线两端。

为什么需要它?我打个比方:信号在总线里传输,遇到阻抗突变就会反射。反射回来的信号会干扰原始信号,导致误码。终端电阻的作用就是吸收信号能量,消除反射。

我记得有一次,某车型批量出现间歇性通信丢失。排查了三天,最后发现是终端电阻虚焊。你想想,一个120Ω的电阻,成本不到一毛钱,却让整车厂赔了几十万。

我的经验:测量终端电阻时,一定要在ECU断电状态下测。带电测量会引入其他路径的阻抗,读数不准。我习惯用万用表直接量CAN_H和CAN_L之间的电阻,正常应该在60Ω左右(两个120Ω并联)。

终端电阻还有两个隐藏作用:

  • 提供偏置电压:隐性电平时,电阻将总线电压稳定在2.5V。
  • 限制电流:防止短路时电流过大烧毁收发器。

避坑指南:我曾经遇到一个案例,工程师把终端电阻装在了同一个节点上。结果总线两端没有匹配,信号反射严重,通信距离从40米直接缩到5米。记住:终端电阻必须装在总线物理位置的两端,不是ECU的两端。

1.3 总线拓扑结构

CAN总线是典型的"多主"总线。什么意思?就是所有节点地位平等,谁都可以发起通信。这跟传统的"主从"架构完全不同。

常见的拓扑结构有三种:

  1. 直线型(最推荐):所有节点挂在一条主干线上。这是最标准、最稳定的拓扑。
  2. 星型:节点通过集线器连接。我不建议用这种,因为集线器会成为单点故障。
  3. 树型:主干分出分支。分支长度必须严格控制,否则反射严重。

我个人习惯用直线型。你想想,CAN总线设计初衷就是直线拓扑。非要搞花活,迟早要还的。

关于分支长度,有个经验公式:分支长度(米)≤ 波特率(kbps)/ 10。比如500kbps的波特率,分支不能超过50米。实际上,我建议分支越短越好,最好控制在30cm以内。

拓扑设计黄金法则

  • 主干线两端必须安装120Ω终端电阻
  • 分支长度尽量短(<30cm为佳)
  • 节点间距尽量均匀
  • 避免T型分支过长

嗯,这里还要提一下总线长度。CAN总线的最大长度取决于波特率:

波特率最大总线长度
1 Mbps40 m
500 kbps100 m
250 kbps250 m
125 kbps500 m
50 kbps1000 m

这个表我建议你存下来。实际项目中,我一般留20%的余量。比如需要100米通信,我会选125kbps的波特率,而不是500kbps。

最后说一句:物理层是CAN通信的基石。你花80%的精力把物理层搞扎实,剩下20%处理协议问题就够了。反过来,物理层有隐患,你花再多时间调软件也是白搭。

下一章,咱们聊聊CAN收发器的选型与常见故障。到时候我会分享一个让我印象深刻的案例——收发器电源纹波导致的通信丢失,排查过程相当曲折。