第4章 位时间参数计算方法:如何根据波特率计算TQ数量及各个段长度

做CAN FD,位时序配置是关键。

说白了,你得知道一个bit怎么被切分,又该怎么合起来。我个人习惯先从最基础的“时间量子”说起。时间量子,英文叫Time Quantum,简称TQ。它是位时间的最小单位,时钟的节拍。

4.1 时间量子TQ的定义

一个位时间,由若干个TQ组成。每个TQ的长度,由系统时钟和预分频器共同决定。

TQ = (BRP + 1) / Fclk

其中:
BRP:波特率预分频器值,你配置寄存器时填的那个数字。
Fclk:CAN控制器的时钟频率,通常是几十MHz。

我的习惯:先确定Fclk,再反推BRP。比如时钟40MHz,目标波特率500kbps,那TQ大概就是100ns级别。算之前心里有个数,不容易出错。

4.2 位时间的划分:四个段

一个位时间,不是直接一整个TQ堆起来的。CAN FD协议把它切成四段:

  • 同步段 (Sync_Seg):固定长度,1个TQ。没得商量。
  • 传播段 (Prop_Seg):补偿物理延迟,比如总线长度、驱动芯片响应时间。
  • 相位缓冲段1 (Phase_Seg1):采样点之前的缓冲,可调节。
  • 相位缓冲段2 (Phase_Seg2):采样点之后的缓冲,可调节。

你看,除了同步段,其它三段都能调。为什么要调?因为采样点的位置可以直接影响错误率。

4.3 TQ数量计算:从波特率反推

算TQ数量,其实是解一个方程。

目标波特率给了你,比如1 Mbps。那一个位时间就是1 µs。假设TQ长度是100 ns,那一个位时间就由10个TQ组成。

TQ_总数 = 位时间 / TQ长度

波特率越高,TQ数量就越少。波特率越低,TQ数量就越多。一般情况下,我建议TQ总数不少于8个,不多于25个。太少,时序精度不够;太多,浪费资源。

核心公式:
NominalBitTime = TQ总数 × TQ长度
实际波特率 = 1 / NominalBitTime

4.4 各段长度定多少?

确定了TQ总数,比如16个。接下来,你怎么分到各个段?

同步段固定1个,剩下15个。传播段至少1个,我见过很多芯片建议2-3个。两个相位缓冲段加起来占剩余TQ数量。

举个例子:

  • 同步段:1 TQ
  • 传播段:3 TQ
  • Phase_Seg1:5 TQ
  • Phase_Seg2:7 TQ

这样采样点在Phase_Seg1结束后,也就是第9个TQ位置,采样点占比约56%。数据段可以再调高些,比如70-80%。

一个小窍门:采样点尽量靠后,但不是越靠后越好。太靠后,容易因为时钟漂移采错。我一般控制在60%-70%之间。

4.5 实际计算步骤

好了,理论讲完,来点实际的。假设你的系统时钟是40 MHz,目标波特率是500 kbps,数据段速率为2 Mbps。

  1. 计算Nominal Bit Time (标称位时间):1 / 500k = 2000 ns
  2. 计算Data Bit Time (数据段位时间):1 / 2M = 500 ns
  3. 选择TQ长度:为了让TQ数量适中,我选100 ns。则 BRP = 100 ns × 40 MHz - 1 = 3。预分频值设为3。
  4. 计算TQ总数:标称段 2000 / 100 = 20 TQ;数据段 500 / 100 = 5 TQ。
  5. 分配各段长度:标称段 - 同步段1,传播段3,Phase_Seg1 8,Phase_Seg2 8(采样点约60%)。数据段 - 同步段1,传播段1,Phase_Seg1 1.5?不行,长度必须整数。所以我调整TQ长度:数据段用80 ns,则BRP调整为3,TQ总数 500/80 ≈ 6.25,取整6。分配:同步段1,传播段1,Phase_Seg1 2,Phase_Seg2 2(采样点约67%)。
注意:分TQ长度时,数据段位时间要格外小心。TQ总数太少,调整余地小;太多,配不出整数。我个人倾向于让数据段位时间控制在8-15个TQ之间。

4.6 一张图看懂计算逻辑

下面这张SVG图,把刚才的步骤串起来了。你看一遍,基本能记住核心逻辑。

位时间参数计算流程 确定目标波特率 计算位时间(ns) 选择BRP & TQ长度 计算TQ总数 分配各段(TQ) 验证采样点 & 误差 调整参数 合格

这张图清晰展示了从目标波特率出发,一步步走到TQ分配和验证的完整路径。

4.7 完整的计算实例

再用一个完整的表格来汇总一下。假设时钟40 MHz,目标标称速率500 kbps,数据段速率2 Mbps。

参数 标称段 数据段
目标波特率 500 kbps 2 Mbps
位时间 2000 ns 500 ns
TQ长度 100 ns 80 ns
BRP 3 3
TQ总数 20 6
同步段 1 1
传播段 3 1
Phase_Seg1 8 2
Phase_Seg2 8 2
采样点 60% 67%
结论:只要TQ总数和段长度配好,采样点自然就定了。我的建议是,采样点设在60%-70%之间,既有余量又不牺牲太多。数据段因为速率高,适当靠近70%会更稳妥。

嗯,以上就是位时间参数计算的核心内容。你在实际项目中,直接用这套思路去配寄存器,基本不会踩大坑。