CAN FD 物理层:位时序、采样点、速率要求
说到 CAN FD,很多人第一反应是“比传统 CAN 快”。其实这话只说对了一半。CAN FD 的数据段确实能飙到 8 Mbps 甚至更高,但前提是——你得把物理层整明白了。
物理层这东西,看着基础,却是最容易出幺蛾子的地方。我一四年做第一个 CAN FD 项目时,就因为在位时序上少算了几个 ns,结果跑 5 Mbps 时整车报错,排查了整整两天。从那以后,我养成了一个习惯:动手调 CAN FD 之前,先把物理层的时序图在脑子里过一遍。
位时序的构成
CAN FD 的位时间跟经典 CAN 思路一致,都是把一位拆成四个段:同步段、传播段、相位缓冲段 1、相位缓冲段 2。但 CAN FD 在数据段用更短的位时间,对时序精度要求更高。
| 段名称 | 作用 | CAN FD 典型值 |
|---|---|---|
| 同步段 (Sync_Seg) | 所有节点在此对齐边沿 | 1 Tq |
| 传播段 (Prop_Seg) | 补偿总线传播延迟 | 1-8 Tq(仲裁段) |
| 相位缓冲段 1 (Phase_Seg1) | 采样点前吸收偏差 | 1-8 Tq |
| 相位缓冲段 2 (Phase_Seg2) | 采样点后补偿偏差 | 1-8 Tq |
| 采样点 (SP) | 采集总线电平的时刻 | Sync_Seg + Prop_Seg + Phase_Seg1 |
这里的 Tq 是时间量子(Time Quantum)。一个位时间由整数个 Tq 组成,通常设在 8 到 25 Tq 之间。我一般习惯仲裁段取 16 Tq,数据段取 10 Tq——这样采样点能卡在一个相对舒服的位置。
关键点:CAN FD 的位时间在仲裁段 (Arbitration Phase) 和数据段 (Data Phase) 是分开配置的。仲裁段位时间 ≥ 1 µs (对应 1 Mbps 或更慢),数据段位时间可以短至 125 ns (对应 8 Mbps)。两套时序参数互不影响,但必须在同一个节点内并存。
采样点为什么重要
采样点决定了节点在什么时候读取总线电平。如果采样点太靠前,信号还没稳定就被读了;太靠后,系统容错空间会变小,稍有干扰就会丢帧。
我的经验:采样点设在 70% - 80% 位时间的位置最稳。仲裁段建议 75% - 85%,数据段可以稍高,接近 87.5% 我也试过,只要布线质量够好就没问题。
我遇到过最典型的案例:一个客户抱怨他的 CAN FD 节点在 8 Mbps 数据段经常出现 CRC 错误。查了半天,发现采样点设在了 62.5%——离同步段太近,信号振荡还没消干净就采样了,自然错个不停。
所以,采样点不是一个可以“随便填”的参数。它直接影响 CAN FD 的通信可靠性。
速率要求:仲裁段 vs 数据段
CAN FD 的速率分两档:
- 仲裁段速率:和经典 CAN 保持一致,最高 1 Mbps。这个速率受限于总线长度和节点间的传播延迟。
- 数据段速率:CAN FD 的“杀手锏”,最高 8 Mbps(ISO 标准),部分厂商甚至做到 10-15 Mbps。但这个速率受物理层限制很大——终端电阻、线缆阻抗、接插件质量,任何一个环节掉链子都跑不上去。
注意:不要以为换了一款支持 8 Mbps 的 CAN FD 控制器,你的系统就能直接跑 8 Mbps。我之前做过一次对比测试:用两根原厂 CAN 线缆跑 5 Mbps 毫无压力,换了一段劣质车规线缆,同样的配置跑到 2 Mbps 就开始报错。物理层是真正的瓶颈。
教你一个粗略估算方法:仲裁段最长总线长度 ≈ (Tq × (Prop_Seg + Phase_Seg1)) / 2 × 信号速度因子。数据段的位时间越短,允许的线缆长度就越短。对着公式算一遍,你会明白为什么高速 CAN FD 系统要严格控制线缆长度。
时序参数的计算
以 8 Mbps 数据段为例,假设位时间 = 125 ns,Tq = 12.5 ns (10 Tq/位),采样点设在 80%:
- Sync_Seg = 1 Tq (12.5 ns)
- Prop_Seg + Phase_Seg1 = 8 Tq (100 ns)
- Phase_Seg2 = 2 Tq (25 ns)
- 采样点对应的 ns 数 = 12.5 + 100 = 112.5 ns (刚好 80%)
这个参数组合下,系统只要保证总线传输延迟不超过 100 ns(约合 20 米线缆),就能稳定跑 8 Mbps。如果线缆更长,需要把 Prop_Seg 加大,但这会压缩 Phase_Seg1 和 Phase_Seg2,采样点位置又会变。
说白了,这就是一个跟线缆长度和信号质量讨价还价的过程。我通常会准备一张表格,列出不同采样点位置对应的最大线缆长度,这样调试时心里有底。
// 一个简单的 CAN FD 位时序配置示例(基于 socketCAN)
// 仲裁段 500 kbps,数据段 5 Mbps,采样点 80%
ip link set can0 type can bitrate 500000 dbitrate 5000000 \
sample-point 0.8 dsample-point 0.8 \
fd on
小技巧:如果你用 MCU 的 CAN FD 外设,通常会在寄存器里看到类似 BS1、BS2 这样的字段。BS1 对应 Prop_Seg + Phase_Seg1,BS2 对应 Phase_Seg2,不同厂家命名可能有差异,但概念是一样的:BS1 加上 BS2 再加 1,就是总 Tq 数。
用一张图看懂物理层重点
一句话总结:CAN FD 物理层的本质是一场平衡游戏——你需要在位时间、采样点位置、总线长度和传播延迟之间找到那个“甜点区域”。我自己的经验是,先固定采样点(仲裁段 80%、数据段 85%),再根据实际线缆长度反推 Tq 和段配置,最后用示波器看一眼信号质量,基本就能稳定运行。