2、CAN FD物理层基础:总线拓扑、电平信号、终端电阻、位时间结构
搞CAN FD,物理层是绕不开的第一关。我见过不少工程师,上来就直接配波特率、调采样点,结果总线就是不通——最后发现是终端电阻没焊对,或者线缆太长导致信号塌了。说白了,物理层基本功不扎实,上层协议栈再漂亮也白搭。
这一章,我们把这四个核心知识点掰开揉碎讲清楚:总线拓扑怎么走线、电平信号长什么样、终端电阻为什么必须装、位时间结构如何决定你的比特率。这些内容不仅适用于CAN FD,经典CAN也通用,但我会重点讲FD的差异点。
2.1 总线拓扑:别小看走线的形状
CAN总线的拓扑,说白了就是线缆怎么连。最常见的拓扑是直线型(总线型),所有节点都挂在两根差分线(CAN_H、CAN_L)上,像晾衣服一样。我建议新手优先用这种,简单可靠。
但现实中经常遇到星型和混合型。星型就是把所有节点用一根总线段接到中心Hub(通常是网关或主动节点)。你想想看,这样会带来什么问题?——信号反射!每个支路末端如果不加终端匹配,信号会在支路末端反弹,叠加到主线上,导致眼图闭合。
我记得以前做一个车载域控制器项目,总线上挂了8个节点,CAN FD速率跑到2Mbps,结果总是不定时丢帧。排查半天,发现有一个节点的线束被改成了2米长的stub(短截线)。我把stub缩短到30厘米以内,问题立刻消失。嗯,这就是拓扑不规范的代价。
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偏置也会出问题。
除了标准的单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) |
配置位时间有两个关键原则:
- 采样点位置:建议仲裁段75%左右,数据段70%~80%。太高或太低都会降低噪声容限。
- SJW不能太小:尤其在CAN FD数据段,时钟漂移可能较大。我曾经见过一个设计,SJW设为1Tq,仲裁段还正常,数据段到3Mbps后频繁错误帧——因为节点间时钟偏差累积,重同步跳不过来。最后把SJW改为2Tq,问题解决。
最后多说一句:位时间结构不是随便填的。你一定要根据线缆长度、收发器延迟、总线负载来算。我用过一个偷懒的办法:先按500kbps/2Mbps的典型配置(比如总Tq=16,TSeg1=11,TSeg2=4,SJW=2),然后在示波器上实测眼图,微调TSeg1让采样点落在眼图正中间。实践出真知,你试试看。