2. CAN FD物理层:差分信号原理、收发器选型与终端电阻匹配

大家好,欢迎来到第二章。上一章我们聊了CAN FD的协议概貌,这一章咱们把脚落在地上,看看物理层那些“硬”东西。说白了,信号在线上怎么跑,芯片怎么选,线怎么布——这些搞不定,上层协议写得再漂亮也是白搭。

我刚开始做CAN项目时,就吃过物理层的亏。记得有一次,样机在实验室跑得好好的,一上整车就丢帧。查了三天,最后发现是终端电阻焊错了位置。嗯,从那以后,我对物理层再也不敢马虎了。

2.1 差分信号原理:为什么CAN总线这么“抗造”?

CAN总线用的是差分信号传输。你想想看,为什么汽车、工业现场这么恶劣的环境,CAN还能稳定通信?秘密就在“差分”这两个字上。

简单说,CAN总线有两根线:CAN_H(高线)和CAN_L(低线)。信号不是靠一根线对地的电压,而是靠两根线之间的电压差来传递。

显性电平(Dominant): CAN_H ≈ 3.5V,CAN_L ≈ 1.5V,差分电压 ≈ 2V,代表逻辑“0”。

隐性电平(Recessive): CAN_H ≈ 2.5V,CAN_L ≈ 2.5V,差分电压 ≈ 0V,代表逻辑“1”。

为什么差分信号抗干扰?因为外部噪声会同时耦合到两根线上(共模噪声),而接收器只关心两根线的差值。噪声在两根线上幅度相同,一减就抵消了。这就是所谓的“共模抑制”。

我在一个电机驱动项目里遇到过强干扰环境,单端信号根本没法看,但CAN总线纹丝不动。差分信号就是这么“抗造”。

CAN FD 差分信号原理图 发送节点 接收节点 CAN_H (3.5V / 2.5V) CAN_L (1.5V / 2.5V) 差分电压 Vdiff = CAN_H - CAN_L (2V / 0V) 关键点: • 显性(逻辑0):CAN_H=3.5V, CAN_L=1.5V, Vdiff≈2V • 隐性(逻辑1):CAN_H=2.5V, CAN_L=2.5V, Vdiff≈0V

2.2 CAN FD收发器选型:TJA1044 vs SN65HVD230

收发器是MCU的CAN控制器和物理总线之间的“翻译官”。控制器输出的是逻辑电平(3.3V或5V),收发器把它转换成差分信号送到总线上,反过来也一样。

选型时我主要看三点:供电电压、速率支持、以及是否支持CAN FD。下面是我最常用的两款芯片对比。

参数 TJA1044 (NXP) SN65HVD230 (TI)
供电电压 4.5V ~ 5.5V 3.0V ~ 3.6V
CAN FD支持 ✅ 支持,最高5Mbps ✅ 支持,最高1Mbps
待机模式 支持,超低功耗 支持,有使能引脚
工作温度 -40°C ~ 150°C -40°C ~ 85°C
典型应用 车载、工业高温环境 3.3V系统、电池供电设备

我的选型建议:

  • 如果你的MCU是5V供电,或者工作在高温环境(比如发动机舱),TJA1044是首选。我做过一个车载项目,环境温度85°C,TJA1044稳如老狗。
  • 如果你的系统是3.3V供电(比如STM32F4系列),想省掉电平转换,SN65HVD230直接匹配,非常方便。但注意它最高只支持1Mbps,跑CAN FD高速模式(2Mbps以上)会吃力。

避坑指南:我曾经在一个项目里把SN65HVD230用在5V系统上,没加电平转换,结果芯片直接冒烟。记住:3.3V的收发器绝对不能接5V电源!反过来,5V的收发器接3.3V虽然不会烧,但信号电平可能达不到总线要求,导致通信不稳定。

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

终端电阻是CAN总线物理层最容易出错的地方。我见过太多工程师在这里翻车。

为什么需要终端电阻?因为高速信号在总线末端会发生反射。反射回来的信号会跟原始信号叠加,造成波形畸变,导致误码。终端电阻的作用就是“吸收”信号能量,消除反射。

为什么是120Ω?这是由CAN总线的特性阻抗决定的。标准CAN总线(双绞线)的特性阻抗大约是120Ω。终端电阻必须匹配这个值,才能做到“阻抗匹配”,让信号无反射地传输。

终端电阻配置规则:

  • 低速CAN(ISO 11898-3): 不需要终端电阻,或者只在两端各接一个2.2kΩ的弱上拉。
  • 高速CAN(ISO 11898-2): 总线两端各接一个120Ω电阻。中间节点不接。
  • CAN FD: 同样遵循高速CAN的规则,两端各120Ω。

你想想看,如果总线有3个节点,每个节点都接了120Ω,那等效电阻就是40Ω,信号反射会更严重。所以记住:只有总线最远的两个节点接终端电阻。

我的经验:在STM32开发板上调试CAN FD时,我习惯在板子上预留120Ω电阻的位置,用跳线帽控制是否接入。这样在搭建多节点网络时,可以灵活配置哪两个节点做终端。省得每次都要焊电阻。

2.4 布线要点:让信号跑得稳

物理层最后一步,就是PCB布线和线束设计。这里我总结几个关键点,都是实战中踩过的坑。

  1. CAN_H和CAN_L必须走差分对。 两根线要等长、等距、紧耦合。我见过有人把CAN_H和CAN_L分开走,中间还夹了一根电源线,结果信号质量一塌糊涂。
  2. 避免90°直角走线。 直角会造成阻抗突变,引起反射。用45°斜线或圆弧过渡。
  3. 终端电阻尽量靠近收发器。 电阻到收发器的走线越短越好。我有个项目把电阻放在板子角落,离收发器5cm远,结果高频时反射严重。
  4. 加共模扼流圈(Common Mode Choke)。 在CAN_H和CAN_L上串联一个共模扼流圈,可以有效抑制共模干扰。特别是在电机驱动、逆变器这些强干扰场景,这个元件能救命。
  5. ESD保护不能省。 在总线入口处加TVS管(比如PESD1CAN),防止静电和浪涌损坏收发器。我曾经省掉这个,结果一个雷雨天的静电就把收发器打坏了。
CAN FD 节点电路与终端电阻配置 MCU (CAN控制器) 收发器 TJA1044 TXD/RXD 120Ω 共模扼流圈 TVS管 总线 布线要点总结: 1. CAN_H/CAN_L走差分对,等长等距紧耦合 2. 终端电阻(120Ω)只在总线两端节点接入,中间节点不接 3. 共模扼流圈串联在总线入口,抑制共模干扰 4. TVS管并联在总线对地,提供ESD和浪涌保护 5. 所有元件尽量靠近收发器引脚,走线越短越好

重要提醒:CAN FD的速率比经典CAN高很多(最高可达8Mbps甚至更高),对布线的要求也更严格。如果你在2Mbps以上速率遇到通信不稳定,先检查物理层:终端电阻对不对?差分对走线有没有等长?共模扼流圈有没有加?我曾经在一个5Mbps的项目里,就因为差分对长度差了3mm,导致眼图闭合,通信时好时坏。