3. CAN FD 物理层特性:差分信号、显性/隐性电平、位时序参数

大家知道,CAN 总线为什么能在工业环境里跑得那么稳?说白了,物理层设计就起了决定性作用。我早期做汽车网关项目时,有几次通信异常,查到最后发现是总线电平问题——那会儿才真正体会到,把物理层搞透,上层协议才能靠谱。这一节我们聊聊 CAN FD 的物理层基础,包括差分信号、显性/隐性电平,还有那几个绕不开的位时序参数:Tq、SyncSeg、PropSeg、PhaseSeg1、PhaseSeg2。

3.1 差分信号:两根线,一个道理

CAN 总线用的是差分信号——就是两根线:CAN High 和 CAN Low。你想想看,为什么不用单线?因为差分信号抗干扰能力强啊。电机启动时产生的共模噪声,会被差分电路直接抵消掉。我几年前在一条产线上见过,用单线通信的板子一启动电机就乱码,换成差分信号后问题直接消失。

差分信号的核心规则很简单:

  • 发送时,CAN High 和 CAN Low 同时输出相反的电压。
  • 接收时,看两根线的电压差(Vdiff = V(CAN_H) - V(CAN_L))。

关键点:差分电压 Vdiff 是判断总线状态的唯一依据。显性状态时 Vdiff 约为 2.0V(CAN FD 典型值),隐性状态时 Vdiff 接近 0V。

3.2 显性电平 vs 隐性电平:谁抢得过谁?

CAN 总线的仲裁机制就靠这两个电平。显性电平优先于隐性电平——如果两个节点同时发,显性会“盖过”隐性。嗯,这里要注意:显性电平并不是代表 1 或 0,而是代表逻辑上的“显性”(dominant)。

我做过一个实验,在示波器上同时抓 CAN_H 和 CAN_L,显性期间两根线电压差接近 2V,隐性期间两根线电压几乎相等。如果你看到波形不符合这个规律,八成是终端电阻没配好,或者共模电压漂了。

CAN FD 显性/隐性电平对比(5V 供电系统)
特性 显性(Dominant) 隐性(Recessive)
逻辑含义 逻辑 0(用于仲裁获胜) 逻辑 1(总线空闲或被动)
CAN_H 电压 ≈ 3.5V ≈ 2.5V
CAN_L 电压 ≈ 1.5V ≈ 2.5V
差分电压 Vdiff ≈ 2.0V ≈ 0V
总线驱动方式 推挽式(主动驱动) 高阻(靠终端电阻上拉回 2.5V)

个人经验:我曾经在调试一个 CAN FD 节点时,发现隐性电平总是偏低——CAN_H 只有 2.3V,CAN_L 却有 2.7V。检查后发现是 CAN 收发器输入端的一个电容轻微短路。隐性电平是整个总线网络的基础,哪怕偏 0.2V 都可能导致位采样错误。

3.3 位时序参数:到底凭什么决定波特率?

CAN FD 的一个位时间被分成 4 段:SyncSeg、PropSeg、PhaseSeg1、PhaseSeg2。再加上一个基本时间单位 Tq(Time Quantum)。说白了,一个位时间 = 若干个 Tq 拼起来的。

我自己总结的经验公式:

位时间 (tBit) = (1 + SyncSeg + PropSeg + PhaseSeg1 + PhaseSeg2) × Tq
其中 SyncSeg 固定为 1 Tq,其余三段可配。
实际波特率 = 1 / tBit

每个段的作用:

  • SyncSeg:同步段,固定 1 Tq。用于检测总线上的边沿跳变。我把它比喻成“定时器的捕捉点”。
  • PropSeg:传播段,用于补偿信号在总线上的传播延迟(包括收发器延迟、线缆延迟等)。我一般在 1~8 Tq 之间取。
  • PhaseSeg1 和 PhaseSeg2:相位缓冲段。采样点就在 PhaseSeg1 之后、PhaseSeg2 之前。我个人习惯让采样点落在位时间的 70%~80% 处。

避坑指南:配置 PhaseSeg2 时要注意,它必须足够长以补偿同步中的累积相位误差。我曾经在一个 2Mbps 的 CAN FD 项目中,将 PhaseSeg2 设成了 2 Tq,结果高速运行下采样点偏差过大,导致 CRC 错误频发。后来改为 3 Tq,问题解决。

下面我把 CAN FD 标准中常见的位时序配置整理成表,供大家参考(假设 Tq = 50ns,8MHz 晶振 16 分频):

常见 CAN FD 位时序配置举例
目标波特率 SyncSeg PropSeg PhaseSeg1 PhaseSeg2 总 Tq 数 采样点位置
1 Mbps 1 2 5 4 12 66.7%
500 kbps 1 3 6 6 16 62.5%
2 Mbps (CAN FD 高速) 1 1 4 4 10 60%

从上表能看出来,采样点位置直接影响通信可靠性。我建议你实际项目里先用示波器量一下总线上最差情况下的边沿抖动,再根据抖动调整 PhaseSeg1 和 PhaseSeg2 的比例。

最后,我专门画了一张图,把 CAN FD 物理层中差分信号、显性/隐性电平以及位时序概念串在一起——你看一眼就能明白它们是怎么协同工作的。

CAN FD 物理层结构 — 信号与位时序 1️⃣ 差分信号总线 CAN_H (3.5V 显性 / 2.5V 隐性) CAN_L (1.5V 显性 / 2.5V 隐性) 显性状态 (Dominant) Vdiff≈2.0V 隐性状态 (Recessive) Vdiff≈0V 2️⃣ 位时序分解 (一位时间) 一个位时间 tBit = N × Tq Sync 1 Tq Prop 1~8 Tq Ph1 1~8 Tq Ph2 2~8 Tq ▼ 采样点 采样点 = (Sync+Prop+Ph1) / 总Tq 典型推荐:60%~80% 位时间处 Tq = 系统时钟周期 × 分频因子 (BRP) 数据阶段与仲裁阶段可独立配置位时序

图中左边展示了差分信号的两条线以及显性/隐性电压差值,右边则是一个完整位时间内的 4 段划分。红三角标注的采样点位置决定了你在线缆抖动时能不能稳定采到正确的电平。我最后提醒一句:千万不要随便拿网上的位时序配置直接套用,每个项目的线缆长度、收发器型号都不一样,最好先通过仿真或实测校准一下。这个经验是我从一次“车规级失效”的教训里换来的,你值得记住。