CAN 位定时与采样点计算
一个 CAN 位要切成整数个 tq,采样点才落得准。填时钟和波特率,直接给出预分频、tseg1/tseg2、SJW 和 BTR 寄存器值。
位定时结果
与目标基本一致位时间 2000 ns = 4 × 24 × 500.0 ns
bxCAN BTR = 0x00330003
BTR 按「SJW−1 在 bit25:24、tseg2−1 在 bit23:20、tseg1−1 在 bit19:16、BRP−1 在 bit9:0」拼成,适用于 STM32 等 bxCAN 控制器,其他 IP 请对照手册。
检查项
- 按经验线(10⁷ ÷ 波特率)可用线长约 20 米,长线建议降速或加中继。
可选组合
按采样点接近程度排序| BRP | tq | tseg1 | tseg2 | 采样点 | 可用线长(经验上限) |
|---|---|---|---|---|---|
| 4 | 24 | 20 | 3 | 87.5% | 20 m |
| 6 | 16 | 13 | 2 | 87.5% | 20 m |
| 12 | 8 | 6 | 1 | 87.5% | 20 m |
| 8 | 12 | 10 | 1 | 91.7% | 20 m |
该时钟下的常用波特率
经验线长按 10⁷ / 波特率| 波特率 | 能否整数分频 | BRP / tq | 实际采样点 | 经验线长 |
|---|---|---|---|---|
| 10 kbps | 可以 | 200 / 24 | 87.5% | 1000 m |
| 20 kbps | 可以 | 100 / 24 | 87.5% | 500 m |
| 50 kbps | 可以 | 40 / 24 | 87.5% | 200 m |
| 100 kbps | 可以 | 20 / 24 | 87.5% | 100 m |
| 125 kbps | 可以 | 16 / 24 | 87.5% | 80 m |
| 250 kbps | 可以 | 8 / 24 | 87.5% | 40 m |
| 500 kbps | 可以 | 4 / 24 | 87.5% | 20 m |
| 800 kbps | 可以 | 4 / 15 | 86.7% | 13 m |
| 1000 kbps | 可以 | 2 / 24 | 87.5% | 10 m |
当前波特率 500,000 bps,经验线长约 20 米。这是上限,不是推荐值;节点多、支线长时还要再打折扣。
使用说明
计算只覆盖经典 CAN 的仲裁/数据共用位定时。CAN FD 的数据段是另一组寄存器,位速率更高,采样点通常设 75%–80%,不要和仲裁段混用。
tseg1 包含传播段和相位段 1。传播段要容纳总线来回的延迟和收发器延迟,所以同样的 tq 数,线越长越应该把 tseg1 留大一些。
终端电阻和共模范围不在本页计算。总线两端各 120Ω,支线尽量短于 0.3 米,这些是位定时之外同样会让总线不通信的原因。
相关工具:串口日志解析、Modbus 帧解析、串口波特率误差。
常见问题
采样点为什么常取 87.5%?
CAN 在每个位的采样点读取总线电平。采样点太靠前,信号传播和收发器延迟还没稳定;太靠后,节点之间的时钟偏差会累积到采样时刻之外。87.5%(16 tq 里的第 14 个)是 CiA 推荐的折中,兼顾长线和时钟容差。
tq 是什么,为什么必须在 8 到 25 之间?
tq 是时间份额,一个位被切成若干个 tq。tq 太少,采样点只能粗调,SJW 也很小;tq 太多,单个 tq 的时间变短,对时钟抖动更敏感。CiA 建议 8–25,多数控制器支持这个范围,16 是最常见的取值。
为什么算不出整数分频?
位时间 = 预分频 × tq ÷ 时钟,必须严格等于 1/波特率。时钟不是波特率的整数倍时,tq 就会带小数,控制器写不进去。换一个能被整除的时钟(比如 8/16/20/24/40/48 MHz 配常用波特率),或者接受实际波特率有误差。
SJW 应该设多少?
SJW 是重新同步时允许一次调整的最大 tq 数,不能超过 tseg2。晶振准、线短时 1 就够;长线、多个节点、晶振误差大时可以设 2–4。设太大反而会让位边界抖动。
CAN FD 的数据段怎么定?
数据段波特率更高(常见 2 Mbps、5 Mbps),采样点建议 75%–80%,SJW 通常 1–2。仲裁段仍按经典 CAN 的 87.5% 配,两段用不同的位定时寄存器,别把数据段参数套到仲裁段上。
线长和波特率是什么关系?
CAN 要求信号在采样点之前稳定,线越长传播延迟越大,能用的位时间就越长。经验线是「波特率 × 线长 ≤ 10⁷」:1 Mbps 约 10 米,500 kbps 约 20 米,125 kbps 约 80 米。超过就得降速或加中继。