2. CANFD物理层:差分信号、CAN_H与CAN_L、终端电阻、总线拓扑结构

大家好,我是老周。今天咱们聊聊CANFD的物理层。说实话,很多工程师学CAN通信,上来就怼着协议栈啃,结果板子调不通,拿示波器一看,波形乱七八糟。嗯,物理层没搞明白,上层协议再熟也白搭。

物理层是什么?说白了,就是信号怎么在线上跑,电压多高,线怎么接,电阻怎么配。这些搞定了,通信就成功了一半。我这些年调试CANFD,至少有一半的故障都出在物理层——终端电阻没焊、线接反了、拓扑结构不对。所以这一章,咱们把物理层彻底吃透。

核心要点:CANFD物理层基于差分信号传输,通过CAN_H和CAN_L两根线的电压差来表示逻辑0和逻辑1。终端电阻用于消除信号反射,总线拓扑结构影响通信质量。

2.1 差分信号:为什么CAN要用两根线?

先问大家一个问题:为什么CAN不用单端信号,非要搞两根线?

单端信号,比如UART,一根线对地,0V是0,3.3V是1。看起来简单,但问题来了——如果地线有干扰,或者线上串进来噪声,电压就飘了。你想想看,在汽车里,发动机点火、电机转动,电磁环境多恶劣。单端信号在这种环境下,基本就是听天由命。

差分信号就不一样了。CAN_H和CAN_L两根线,信号是互补的:

  • 显性电平(逻辑0):CAN_H = 3.5V,CAN_L = 1.5V,差分电压 = 2V
  • 隐性电平(逻辑1):CAN_H = 2.5V,CAN_L = 2.5V,差分电压 = 0V

接收器只看两根线的差值。如果外界噪声同时耦合到两根线上(共模噪声),差值不变,信号不受影响。这就是差分信号的抗干扰能力。

我的经验:有一次在产线上,一批CANFD节点通信时好时坏。查了半天,发现是线束太长,CAN_H和CAN_L的绞距不均匀,导致共模噪声变成了差模噪声。后来换了双绞线,问题解决。记住:CAN线一定要用双绞线,绞距越密越好。

2.2 CAN_H与CAN_L:电压到底是多少?

很多新手拿到CANFD芯片,看数据手册上的电压值,一脸懵。我刚开始也这样。这里我给大家整理一个清晰的表格:

信号状态 CAN_H电压 CAN_L电压 差分电压
隐性(逻辑1) 2.5V 2.5V 0V
显性(逻辑0) 3.5V 1.5V 2V

注意,这是标准CAN/CANFD的电压。有些芯片会有细微差别,但大差不差。你拿示波器量CAN_H和CAN_L对地电压,看到这两个波形,基本就能判断总线是否正常。

我个人习惯,调试时先量静态电压。总线空闲时,CAN_H和CAN_L都应该是2.5V左右。如果偏差超过0.3V,就要检查了——可能是终端电阻没接好,或者收发器坏了。

避坑指南:我曾经遇到过一块板子,CAN_H对地只有1.8V,CAN_L却有3.2V。查了半天,发现是CAN_H和CAN_L焊反了。嗯,这种低级错误,犯过一次就再也不会犯了。接线前,一定用万用表确认一下哪根是CAN_H,哪根是CAN_L。

2.3 终端电阻:为什么是120Ω?

终端电阻,说白了就是防止信号反射的。信号在线上跑,遇到阻抗不连续的地方就会反射,反射波和原信号叠加,波形就畸变了。

CAN总线要求特性阻抗为120Ω,所以我们在总线两端各接一个120Ω电阻,这样阻抗就匹配了,信号不会反射。

为什么是两端?因为信号是双向传输的,两端都要匹配。如果只在一端接电阻,另一端还是会反射。

关键点:终端电阻必须接在总线的最远端。如果接在中间,远端节点还是会看到反射。我见过有人把电阻焊在PCB上,结果节点在总线中间,远端反而没电阻——通信距离一长就丢包。

那CANFD对终端电阻有什么特殊要求吗?其实和经典CAN一样,还是120Ω。但CANFD速率更高(最高8Mbps),对终端电阻的精度要求也更高。我建议用1%精度的电阻,别用5%的。

我的习惯:调试时,我会在总线的两端各焊一个120Ω电阻,然后用万用表量总线两端的电阻。如果量出来是60Ω,说明两个电阻都接好了。如果量出来是120Ω,说明只有一个电阻。如果量出来是无穷大,嗯,一个都没接。

2.4 总线拓扑结构:怎么布线才靠谱?

CAN总线要求直线型拓扑,也就是所有节点都挂在一条主干线上,每个节点用短支线引出。主干线两端接终端电阻。

为什么不能用星型或树型?因为分支会产生反射。支线越长,反射越严重。CANFD速率高,对支线长度更敏感。

我给大家一个经验数据:

  • 经典CAN(500kbps):支线长度不超过1米
  • CANFD(2Mbps):支线长度不超过0.3米
  • CANFD(5Mbps以上):支线越短越好,最好直接焊在主干线上

下面我用一张图来展示CANFD总线的推荐拓扑结构:

120Ω 120Ω 节点1 节点2 节点3 节点4 主干线(双绞线) 支线(≤0.3m) 支线(≤0.3m) 支线(≤0.3m) 支线(≤0.3m)

这张图展示了标准的直线型拓扑。主干线是双绞线,两端各有一个120Ω终端电阻。节点通过短支线连接到主干线上。注意,支线越短越好,尤其是CANFD高速模式下。

我曾经踩过的坑:有个项目,CANFD通信在实验室好好的,一装到车上就报错。后来发现,车上的布线是星型拓扑——所有节点都通过长线汇聚到一个接线盒。反射太严重了,信号完全畸变。最后改成直线型拓扑,问题解决。记住:CAN总线不是以太网,不能用星型拓扑。

2.5 物理层调试实战:示波器怎么看?

调试CANFD物理层,示波器是必备工具。我一般会看这几个点:

  1. 静态电压:总线空闲时,CAN_H和CAN_L都应该是2.5V左右
  2. 显性电压:有数据时,CAN_H升到3.5V,CAN_L降到1.5V
  3. 信号质量:看上升沿和下降沿是否陡峭,有没有过冲或振铃
  4. 位时间:CANFD的位时间更短,要确认收发器能跟上

这里我给大家一个简单的检查流程:

1. 万用表量CAN_H对GND:应为2.5V(空闲时)
2. 万用表量CAN_L对GND:应为2.5V(空闲时)
3. 万用表量CAN_H与CAN_L之间:应为60Ω(两个终端电阻并联)
4. 示波器看差分信号:显性时约2V,隐性时0V
5. 示波器看眼图:眼睛张开,没有明显抖动

小技巧:如果手头没有差分探头,可以用两个通道分别量CAN_H和CAN_L,然后在示波器上做数学运算(CH1 - CH2),就能看到差分信号了。我经常这么干。

好了,物理层的内容就聊到这里。记住一句话:物理层是CANFD通信的地基,地基不稳,上层协议再牛也白搭。下一章咱们聊聊数据链路层,看看CANFD的帧结构是怎么设计的。


公众号:蓝海资料掘金营,微信deep3321