CAN 位定时与采样点计算

一个 CAN 位要切成整数个 tq,采样点才落得准。填时钟和波特率,直接给出预分频、tseg1/tseg2、SJW 和 BTR 寄存器值。

常见问题

采样点为什么常取 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 米。超过就得降速或加中继。