第2章:CAN物理层——差分信号与双绞线、总线电平标准、拓扑结构与终端电阻

大家好,我是你们的老朋友。今天咱们来聊聊CAN物理层。说实话,很多刚入行的工程师觉得物理层就是些“硬件的活儿”,没什么技术含量。但我得说,这种想法可要不得。我见过太多因为物理层设计不当导致的通信故障,那排查起来真是让人头大。

物理层,说白了就是信号在线上怎么跑、怎么表示、怎么连接。你想想看,如果连信号都传不对,上层协议再牛也没用。所以,咱们今天就把CAN物理层的几个核心问题掰开揉碎了讲清楚。

2.1 差分信号与双绞线

CAN总线为什么用差分信号?而不是像UART那样用单端信号?

嗯,这里有个关键原因:抗干扰。汽车环境有多恶劣,大家心里都有数。发动机点火、电机运转、各种电磁干扰,单端信号在这种环境下很容易被“带偏”。差分信号就不一样了。

差分信号,就是一对线——CAN_H和CAN_L。信号不是看某根线的绝对电压,而是看两根线之间的电压差。你想想看,如果外界有干扰,它通常会同时作用在两根线上,那差值基本不变。这就是所谓的“共模抑制”。

我个人习惯把差分信号比作“跷跷板”。CAN_H往上翘,CAN_L就往下压,差值就是信号。干扰来了,两根线一起动,但差值不变——稳得很。

核心要点:差分信号通过两根线的电压差来传递信息,具有天然的共模抑制能力。这是CAN总线能在强电磁干扰环境下稳定工作的基石。

那为什么用双绞线呢?

双绞线,就是把两根线绞在一起。绞合的目的是什么?让两根线受到的电磁干扰尽可能一致。你想想看,如果两根线平行走,干扰源离一根近、离另一根远,那干扰就不一样了。绞在一起后,两根线轮流靠近干扰源,平均下来受到的干扰就差不多了。

我在项目中遇到过一件事:有个同事为了省成本,用了普通平行线代替双绞线。结果呢?总线长度一超过2米,通信就开始丢帧。换回双绞线,问题立马解决。所以,别在这种地方省钱。

实战建议:双绞线的绞距(每英寸绞合次数)有讲究。CAN总线推荐使用绞距在1.5-2英寸之间的双绞线。太密或太疏都会影响信号质量。

2.2 CAN总线电平标准:显性与隐性

CAN总线上只有两种状态:显性(Dominant)和隐性(Recessive)。

说白了,显性就是“0”,隐性就是“1”。但这里有个有意思的地方:显性电平会“覆盖”隐性电平。什么意思呢?如果多个节点同时发送,只要有一个节点发显性,总线就是显性。这就是CAN总线仲裁的基础。

咱们来看看具体的电平值:

状态 CAN_H电压 CAN_L电压 差分电压(CAN_H - CAN_L)
隐性(Recessive) 2.5V 2.5V 0V(约0V)
显性(Dominant) 3.5V 1.5V 2V(约2V)

你看,隐性时两根线都是2.5V,差分电压接近0V。显性时CAN_H升到3.5V,CAN_L降到1.5V,差分电压约2V。

这里要注意:实际应用中,这个电压值会有一定偏差。比如线缆长了、节点多了,电压会有点波动。但差分电压只要大于0.9V就算显性,小于0.5V就算隐性。这个阈值范围给了系统一定的容错空间。

避坑指南:我曾经遇到过一个问题:某个节点的CAN_H和CAN_L接反了。结果呢?显性变成隐性,隐性变成显性,整个总线乱成一锅粥。所以,布线时一定要再三确认极性。我习惯在连接器上用不同颜色标记:CAN_H用黄色,CAN_L用绿色。

2.3 CAN总线拓扑结构与终端电阻

CAN总线用什么拓扑?说白了,就是一条直线,所有节点都挂在这条线上。这就是所谓的“总线型拓扑”。

为什么不用星型或树型?因为信号反射。你想想看,信号在线上跑,遇到分支或拐弯,就会有一部分信号反射回来。反射信号和原始信号叠加,就会导致信号畸变。CAN总线对信号完整性要求很高,所以必须用最简单的直线拓扑。

那终端电阻是干什么用的?

终端电阻,就是在线路两端各接一个120Ω的电阻。它的作用是吸收信号能量,防止信号在末端反射。你可以把信号想象成水波,终端电阻就是海绵,把水波吸掉,不让它反弹回来。

为什么是120Ω?因为CAN双绞线的特性阻抗大约是120Ω。阻抗匹配了,反射就最小。这个值不是随便定的,是经过理论计算和大量实验验证的。

关键参数:

  • 终端电阻:120Ω(±1%),两端各一个
  • 总线长度:CAN(低速)最长40m@125kbps,CAN FD(高速)最长10m@5Mbps
  • 节点数量:标准CAN最多30个节点,CAN FD建议不超过16个

我给大家讲个真实案例。有一次,一个项目在整车测试时发现,偶尔会出现通信超时。排查了三天,最后发现是终端电阻的问题。原来,有个节点内部已经集成了120Ω电阻,但设计人员又在外部加了一个。结果两个电阻并联,变成了60Ω。阻抗不匹配,信号反射严重,导致通信不稳定。

我的习惯:设计CAN网络时,我会先画一个拓扑图,标出每个节点的位置。然后确认终端电阻只在总线两端各放一个。如果节点内部有可配置的终端电阻,一定要检查配置是否正确。我见过太多因为“默认配置”导致的通信问题了。

最后,给大家总结一下CAN物理层的几个关键点:

  • 差分信号:用CAN_H和CAN_L的电压差传递信息,抗干扰能力强
  • 双绞线:绞合结构让两根线受到的干扰一致,进一步提升抗干扰能力
  • 显性/隐性:显性(0)覆盖隐性(1),这是仲裁的基础
  • 总线拓扑:直线型,避免分支和拐弯
  • 终端电阻:120Ω,两端各一个,吸收反射信号

嗯,物理层的内容就讲到这里。下一章咱们聊聊CAN的数据链路层,看看数据帧是怎么组织的。到时候我会分享一些我在解析CAN报文时踩过的坑,保证让你少走弯路。