第4章 位时间参数计算方法:如何根据波特率计算TQ数量及各个段长度
做CAN FD,位时序配置是关键。
说白了,你得知道一个bit怎么被切分,又该怎么合起来。我个人习惯先从最基础的“时间量子”说起。时间量子,英文叫Time Quantum,简称TQ。它是位时间的最小单位,时钟的节拍。
4.1 时间量子TQ的定义
一个位时间,由若干个TQ组成。每个TQ的长度,由系统时钟和预分频器共同决定。
TQ = (BRP + 1) / Fclk
其中:
BRP:波特率预分频器值,你配置寄存器时填的那个数字。
Fclk:CAN控制器的时钟频率,通常是几十MHz。
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%。
4.5 实际计算步骤
好了,理论讲完,来点实际的。假设你的系统时钟是40 MHz,目标波特率是500 kbps,数据段速率为2 Mbps。
- 计算Nominal Bit Time (标称位时间):1 / 500k = 2000 ns
- 计算Data Bit Time (数据段位时间):1 / 2M = 500 ns
- 选择TQ长度:为了让TQ数量适中,我选100 ns。则 BRP = 100 ns × 40 MHz - 1 = 3。预分频值设为3。
- 计算TQ总数:标称段 2000 / 100 = 20 TQ;数据段 500 / 100 = 5 TQ。
- 分配各段长度:标称段 - 同步段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%)。
4.6 一张图看懂计算逻辑
下面这张SVG图,把刚才的步骤串起来了。你看一遍,基本能记住核心逻辑。
这张图清晰展示了从目标波特率出发,一步步走到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% |
嗯,以上就是位时间参数计算的核心内容。你在实际项目中,直接用这套思路去配寄存器,基本不会踩大坑。