位时间配置与采样点设置详解

说到 CAN FD 的位时间配置,我估计不少朋友都在这上面栽过跟头。记得我刚接触 CAN FD 那会,觉得这东西不就是把 CAN 的波特率调高一点嘛,结果第一个项目就给我上了一课——总线死活同步不上,丢帧丢到怀疑人生。

说白了,位时间就是总线上传输一个 bit 所花的时间。但 CAN FD 比经典 CAN 复杂在哪?它要在数据段把波特率翻倍甚至翻三倍,这就对位时间的精度提出了更高的要求。

位时间到底是怎么分的?

一个 CAN FD 的位时间,被切成了四段:

  • 同步段——用于同步总线上的节点,固定为 1 个 Tq
  • 传播段——补偿物理延迟,比如线缆传输、收发器响应
  • 相位缓冲段 1——采样点前的时间,用于补偿相位误差
  • 相位缓冲段 2——采样点后的时间,也是补偿相位误差的

采样点就在 PBS1 和 PBS2 之间。你想想看,这个点要是偏了,采样到的电平就不准了。我在项目里遇到过最典型的情况——采样点设在 70%,结果线缆长了 20 米,信号回波正好打在采样点附近,总线直接崩了。

下面是不同波特率下常用的位时间分段参考:

波特率 (Mbps) 总 Tq 数 Sync_Seg Prop_Seg PBS1 PBS2 采样点位置
1 16 1 3 6 6 62.5%
2 12 1 2 4 5 58.3%
5 10 1 2 3 4 60.0%
8 8 1 1 3 3 62.5%

采样点:为什么它如此关键

采样点设置其实就是在赌——赌你采到的电平是稳定的。总线上信号有上升时间、有振铃、有反射,如果你采样点选得太靠前,可能采到还没稳定的电平;选得太靠后,又可能被下一 bit 的边沿干扰。

我个人的习惯是,采样点尽量靠近 bit 的尾部,但别太贪。一般推荐 60%~70% 之间,具体取决于你的物理层质量。曾经有一次在产线上,我发现同一批 ECU 有一半同步失败,排查了两天——最后发现是采样点差了 2 个 Tq。嗯,就差那么一点,整条线就不转了。

采样点偏移带来的影响:

采样点位置 典型问题 后果
< 50% 采到信号边沿或振铃区 误码率飙升,重传频繁
50% ~ 60% 对线缆长度敏感 长线时易丢帧
60% ~ 70% 最佳范围 信号稳定,容错性好
> 75% 可能采到下一个 bit 前导 位同步丢失,总线关闭

Tq 的切分与配置

Tq 是什么?一个位时间里的最小时间单元。说白了,你拿晶振频率先分频得到 Tq,再用 Tq 去拼位时间的四段。

公式其实不复杂:

Bit Time = (Sync_Seg + Prop_Seg + PBS1 + PBS2) × Tq

你读配置寄存器的时候,看到的其实就是这些段的 Tq 个数。我一般这么算:

  1. 先定目标波特率,比如 2 Mbps
  2. 选系统时钟,比如 80 MHz
  3. 算 Tq:80 MHz ÷ 目标位时间 Tq 总数
  4. 再反向验证采样点位置

关键提示:当你提高数据段波特率时,Tq 会变短,对晶振精度的要求就更高了。我用过一台车规级设备,晶振偏差 0.5%,2 Mbps 时没问题,一升到 5 Mbps 就出现零星丢帧。最后换了精度更高的晶振才搞定。

配置时还要留意不同芯片的寄存器布局。我之前在 STM32 和 NXP 的芯片上做过,同样设 62.5% 采样点,Tq 分频值完全不同。我建议先画个位时间分段图,再对照手册写寄存器,一步错就得重来。

实战中的避坑指南

我曾经踩过的坑:项目里有一块核心板,我按手册推荐的采样点配置设了 75%,结果跟另一家供应商的模块死活握不上手。后来调了逻辑分析仪抓波形,发现对方的采样点偏偏设在 55%,我的 75% 正好卡在边沿上。最后两边协调,统一到 62.5%,问题解决了。

配置位时间,有几个关键要点:

  • 采样点不要低于 50%,除非你只在 1 米内通信
  • 数据段波特率越高,Tq 总数越少,你调整的空间就越小
  • 不同芯片的同步机制有差异,别拿一家的参数硬套另一家
  • 产线上的每块板子晶振都有偏差,建议留出 10% 的余量

我个人的小习惯:调完位时间后,一定用示波器或逻辑分析仪抓一下 CAN FD 的显性位宽度,跟计算值对比。实测宽度和理论值对得上,说明配置没问题;对不上,多半是 Tq 切分错了。这招救过我至少三次。

CAN FD 位时间分段结构 Sync 1 Tq Prop_Seg 1~8 Tq Phase Buffer 1 1~8 Tq ▲ 采样点 Phase Buffer 2 1~8 Tq SJW 调整 说明: • 同步段 (Sync_Seg) 固定为 1 Tq,用于总线上所有节点对齐 • 传播段 (Prop_Seg) 补偿物理层延迟,包括收发器、线缆、连接器 • 相位缓冲段 1/2 用于补偿晶振偏差,采样点位于 PBS1 和 PBS2 之间 • SJW(同步跳转宽度)决定每个位时间能容忍的最大相位偏差 • 推荐采样点位置:CAN FD 仲裁段 ~87.5%,数据段 65%~70%

最后补一句我觉得最重要的——调试阶段一定要用示波器看实际波形,别只看寄存器。你有多少参数在纸上算得漂漂亮亮,一到现场就变了样。

记住:位时间配置不是一劳永逸的事。换一批 ECU、换一种线缆、甚至换一个接插件,都可能导致采样点偏移。每次改完硬件,花十分钟测一下实际信号,远比出了问题再返工划算。