2. CAN FD物理层:差分信号原理、CAN_H和CAN_L电平定义、总线拓扑结构(线性/星型)、终端电阻匹配、位时间与采样点

大家好,我是你们的讲师。今天咱们聊聊CAN FD的物理层。说实话,很多工程师做CAN通信,软件调得飞起,但一碰到物理层问题就抓瞎。我当年刚入行时也是这样,直到有一次在产线上被一个终端电阻的问题折腾了两天……嗯,从那以后我就明白了,物理层才是通信的基石。

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

先问大家一个问题:为什么CAN总线要用两根线(CAN_H和CAN_L),而不是像UART那样一根线对地?

答案很简单:抗干扰。

差分信号的核心思想是:信号不是对地测量的,而是两根线之间的电压差。你想想看,如果外界有个强电磁干扰过来,它会同时作用在CAN_H和CAN_L上——两根线上的噪声几乎一样。这时候我们只关心它们的差值,噪声就被抵消掉了。

差分信号公式:

V_diff = V(CAN_H) - V(CAN_L)

逻辑显性(Dominant):V_diff ≈ 2V(CAN_H=3.5V,CAN_L=1.5V)

逻辑隐性(Recessive):V_diff ≈ 0V(CAN_H=2.5V,CAN_L=2.5V)

我在项目中遇到过一件事:有个客户的车载设备在电机启动时总是丢帧。查了半天,发现他们用的是单端信号传输方案。换成差分CAN之后,问题立马消失。说白了,差分信号就是给信号穿了一层「防弹衣」。

2.2 CAN_H和CAN_L电平定义

CAN总线的电平定义其实很直观。我习惯把它理解成「推拉」关系:

  • 隐性电平(Recessive):两根线都是2.5V,差值为0。这时候总线处于「空闲」状态,任何节点都可以发起通信。
  • 显性电平(Dominant):CAN_H被拉到3.5V,CAN_L被拉到1.5V,差值约2V。这时候总线被某个节点「占用」了。

这里有个关键点:显性电平会覆盖隐性电平。也就是说,如果两个节点同时发送,一个发显性一个发隐性,总线最终呈现的是显性。这就是CAN总线仲裁机制的基础——谁先发显性位,谁就赢得总线控制权。

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

个人经验:测量CAN总线波形时,我建议你用差分探头直接看CAN_H和CAN_L的差值。单端测量容易误判,因为地平面噪声会混进去。我曾经用示波器单端测了一下午,愣是没找到问题,换了差分探头五分钟就搞定了。

2.3 总线拓扑结构:线性 vs 星型

CAN总线最推荐的拓扑是线性总线(也叫干线-支线结构)。说白了就是一根主干线,所有节点都挂在这根线上,支线越短越好。

为什么?因为CAN总线是多主通信,所有节点共享同一根物理介质。如果搞成星型拓扑,信号反射会非常严重。我见过一个案例:有人为了布线方便,把四个节点用星型连接,结果通信距离从500米直接缩到50米,还时不时出错。

当然,星型拓扑也不是完全不能用。如果你用CAN FD,并且加了中继器或集线器,星型也是可行的。但记住:纯CAN总线,老老实实用线性拓扑

避坑指南:我曾经在一条总线上接了32个节点,支线总长度超过了5米。结果高速通信时(1Mbps)频繁出现位错误。后来把支线全部控制在0.3米以内,问题解决。记住:支线长度越短越好,最好不超过0.3米。

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

终端电阻,说白了就是防止信号反射的。CAN总线要求在总线两端各接一个120Ω电阻,这样总线的等效阻抗就是60Ω。

为什么是120Ω?因为CAN双绞线的特性阻抗大约是120Ω。阻抗匹配了,信号就不会在末端反射回来。如果不接终端电阻,或者只接一个,你会看到波形上出现明显的振铃——就像往水池里扔石头,波纹来回荡。

我个人的习惯是:终端电阻一定要接在总线的物理两端,而不是随便找个位置。曾经有个项目,工程师把两个120Ω电阻都放在了一端,另一端没接。结果总线长度超过100米后,通信完全瘫痪。

终端电阻计算:

R_term = 120Ω(单端)

总线等效阻抗 = 120Ω // 120Ω = 60Ω

注意:CAN FD速率更高(最高8Mbps),对终端电阻的精度要求也更高。建议使用1%精度的电阻。

2.5 位时间与采样点

位时间,就是一个CAN位持续的时间。比如1Mbps的速率,位时间就是1μs。但CAN总线不是简单地把1μs分成「发0」和「发1」两段,而是分成四个段:

  1. 同步段(Sync_Seg):用于同步,固定为1个时间量子(Tq)
  2. 传播段(Prop_Seg):补偿物理延迟,通常1-8个Tq
  3. 相位缓冲段1(Phase_Seg1):用于采样点前的调整,通常1-8个Tq
  4. 相位缓冲段2(Phase_Seg2):用于采样点后的调整,通常1-8个Tq

采样点就是接收器读取总线电平的时刻。它位于Phase_Seg1和Phase_Seg2之间。采样点的位置非常关键——太早了信号还没稳定,太晚了可能错过下一个位。

速率 位时间 推荐采样点位置 说明
125kbps 8μs 87.5% 低速,采样点靠后
500kbps 2μs 87.5% 常用速率
1Mbps 1μs 75% 高速,采样点提前
5Mbps (CAN FD) 200ns 70% CAN FD高速模式

我的经验:采样点设置不要死板。我曾经在一个项目中,总线长度300米,速率500kbps。按手册推荐设87.5%的采样点,结果总是有偶发错误。后来我把采样点调到80%,问题消失。为什么?因为长总线导致信号延迟变大,采样点太靠后反而采到了反射波。记住:采样点要根据实际总线长度和拓扑微调。

最后说一句:CAN FD的物理层和经典CAN基本一致,但速率更高,对信号质量的要求也更苛刻。如果你在CAN FD项目中发现通信不稳定,先别急着调软件——拿示波器看看波形,检查一下终端电阻和采样点设置。很多时候,问题就出在这些「不起眼」的地方。