2、CAN FD物理层基础:总线拓扑、电平信号、终端电阻、位时间结构

搞CAN FD,物理层是绕不开的第一关。我见过不少工程师,上来就直接配波特率、调采样点,结果总线就是不通——最后发现是终端电阻没焊对,或者线缆太长导致信号塌了。说白了,物理层基本功不扎实,上层协议栈再漂亮也白搭。

这一章,我们把这四个核心知识点掰开揉碎讲清楚:总线拓扑怎么走线、电平信号长什么样、终端电阻为什么必须装、位时间结构如何决定你的比特率。这些内容不仅适用于CAN FD,经典CAN也通用,但我会重点讲FD的差异点。

CAN FD物理层知识体系 CAN FD 物理层 总线拓扑 线性/星型/混合型 电平信号 显性/隐性 + FD边沿 终端电阻 120Ω / 分体式 / 共模扼流圈 位时间结构 SS / PSEG1 / PSEG2 / SJW 提示:这四个知识点彼此耦合,比如位时间结构直接决定了采样点位置,而采样点又受线缆长度和终端匹配影响。

2.1 总线拓扑:别小看走线的形状

CAN总线的拓扑,说白了就是线缆怎么连。最常见的拓扑是直线型(总线型),所有节点都挂在两根差分线(CAN_H、CAN_L)上,像晾衣服一样。我建议新手优先用这种,简单可靠。

但现实中经常遇到星型和混合型。星型就是把所有节点用一根总线段接到中心Hub(通常是网关或主动节点)。你想想看,这样会带来什么问题?——信号反射!每个支路末端如果不加终端匹配,信号会在支路末端反弹,叠加到主线上,导致眼图闭合。

我记得以前做一个车载域控制器项目,总线上挂了8个节点,CAN FD速率跑到2Mbps,结果总是不定时丢帧。排查半天,发现有一个节点的线束被改成了2米长的stub(短截线)。我把stub缩短到30厘米以内,问题立刻消失。嗯,这就是拓扑不规范的代价。

提示:CAN FD对stub长度更敏感。经典CAN建议stub不超过0.3米;CAN FD在2Mbps以上时,stub最好控制在0.1米以内,或者干脆用无stub的菊花链。

2.2 电平信号:显性 vs 隐性,FD多了个边沿

CAN总线用差分信号传输,CAN_H和CAN_L两根线。逻辑状态分两种:显性(Dominant)和隐性(Recessive)。

  • 隐性(Recessive):CAN_H ≈ 2.5V,CAN_L ≈ 2.5V,差分电压Vdiff ≈ 0V。逻辑“1”。
  • 显性(Dominant):CAN_H ≈ 3.5V,CAN_L ≈ 1.5V,差分电压Vdiff ≈ 2V。逻辑“0”。

经典CAN和CAN FD在仲裁段的电平完全一样。但CAN FD在数据段可以切换更高的比特率,这时电平信号的边沿会变陡——上升下降时间更短。我遇到过一个问题:某国产收发器的输出斜率较慢,在5Mbps FD模式下,边沿根本达不到标准,导致接收端采样出错。所以选型时一定要注意收发器的CAN FD兼容性和边沿速率参数。

参数 经典CAN(ISO 11898-2) CAN FD(ISO 11898-2:2016)
隐性电平(CAN_H/CAN_L) 2.5V ± 0.5V 2.5V ± 0.5V(仲裁段相同)
显性差分电压 1.5V ~ 3.0V 1.5V ~ 3.0V(仲裁段相同)
数据段比特率 最高1Mbps 最高8Mbps(实际常用2~5Mbps)
边沿时间(10%~90%) ≥50ns ≥15ns(快速边沿,需专用收发器)

2.3 终端电阻:没有它,信号就是一团浆糊

终端电阻的唯一目的是消除信号反射。每根CAN总线的两端各需要一只120Ω电阻,与线缆的特性阻抗匹配。实际上,大多数CAN收发器内部没有集成这个电阻,需要你在PCB或线束上加。

我经常看到有人问:能不能只装一个?或者用100Ω代替?我的回答是:千万不要。一个电阻会导致阻抗不匹配,信号会在远端反射回来;而且只装一个的话,总线DC偏置也会出问题。

警告:CAN FD速率高时,对终端电阻的精度和放置位置更敏感。我曾经见过一个案例,终端电阻焊接虚焊(阻值变大到150Ω),总线在1Mbps还能勉强工作,跳到2Mbps后直接通信中断,示波器上的信号毛刺简直没法看。

除了标准的单120Ω电阻外,还有一种分体式终端:把120Ω拆成60Ω+60Ω,中间通过电容分压到地。这种电路可以抑制共模干扰,但增加了成本。我个人习惯:在实验室调试时先用120Ω单电阻,量产时如果EMI要求高,再换分体式+共模扼流圈的方案。

终端电阻选型要点:
  • 阻值:120Ω ±1% (最好是金属膜电阻,温漂小)
  • 功率:通常1/4W足够,但如果总线上有电源短路风险,建议用1/2W
  • 放置位置:必须在总线物理两端,不能放在中间节点
  • CAN FD推荐:使用0603或0805贴片,靠近收发器CANH/CANL引脚放置

2.4 位时间结构:比特率由它决定

CAN总线一个位的时间分为若干段:同步段(SS)、传播时间段(PTS)、相位缓冲段1(PS1)、相位缓冲段2(PS2)。其中PTS和PS1合起来也叫时间段1(TSeg1),PS2叫时间段2(TSeg2)。另外还有个重同步跳跃宽度(SJW)。

为什么这么分?因为总线上的节点时钟不完全同步,每个位要在采样点判断是0还是1。采样点一般放在PS1和PS2交界处,典型值为70%~80%位时间位置。CAN FD的数据段比特率更高,因此位时间更短,对采样点精度的要求也更高。

举个例子,假设系统时钟为40MHz,你希望仲裁段比特率500kbps,数据段2Mbps。仲裁段一个位时间为2μs,数据段为0.5μs。你配置BRP(波特率预分频)后,实际Tq(时间量子)的数目要精确分配。

段名称 作用 典型长度(Tq)
同步段(SS) 硬同步,检测边沿 1 Tq(固定)
传播段(PTS) 补偿线缆和收发器延迟 1~8 Tq
相位缓冲段1(PS1) 采样点前调整相位 1~8 Tq
相位缓冲段2(PS2) 采样点后调整相位 1~8 Tq
SJW 最大可调整的宽度 1~4 Tq(≤PS2)

配置位时间有两个关键原则:

  1. 采样点位置:建议仲裁段75%左右,数据段70%~80%。太高或太低都会降低噪声容限。
  2. SJW不能太小:尤其在CAN FD数据段,时钟漂移可能较大。我曾经见过一个设计,SJW设为1Tq,仲裁段还正常,数据段到3Mbps后频繁错误帧——因为节点间时钟偏差累积,重同步跳不过来。最后把SJW改为2Tq,问题解决。
经验公式:一个位时间总Tq数 = 1 + TSeg1 + TSeg2。TSeg1 = PTS + PS1,TSeg2 = PS2。采样点 = (1 + TSeg1) / 总Tq数 × 100%。配置时可以用工具(比如Vector CANoe或在线计算器)算一下。

最后多说一句:位时间结构不是随便填的。你一定要根据线缆长度、收发器延迟、总线负载来算。我用过一个偷懒的办法:先按500kbps/2Mbps的典型配置(比如总Tq=16,TSeg1=11,TSeg2=4,SJW=2),然后在示波器上实测眼图,微调TSeg1让采样点落在眼图正中间。实践出真知,你试试看。