摘要CubeMX 里填了 500kbps示波器测出来只有 476kbps或者长距离通讯时 ACK 总是不对不是晶振不准而是 CAN 位时序BS1/BS2与同步跳转宽度SJW配置不当。本文拆解 CAN 的“时间量子”。一、问题描述现象**MCU 主频 72MHz想配 500kbps用计算器算出来的参数示波器实测却是 476kbps或者短距离能通线缆一拉长 50米就开始丢帧。**很多工程师的做法是换一个晶振8M / 16M / 25M手动改 BS1/BS2 数值试放弃用 250kbps二、原理分析1. 物理模型CAN 的一个比特Bit由若干时间量子Time Quantum, tq组成。| Sync | Propagation | Phase Segment 1 | Phase Segment 2 | | 1 tq | BS1 (N tq)| BS2 (M tq) |2. 核心参数tq (Time Quantum)CAN 外设的最小时间单位。BS1 (Bit Segment 1)采样点之前的时间。BS2 (Bit Segment 2)采样点之后的时间。SJW (Sync Jump Width)同步跳转宽度用于重新同步。波特率计算公式Baud Rate 1 / ( (1 BS1 BS2) × tq )3. 反直觉真相CAN 波特率允许有 ±0.5% ~ ±1.5% 的误差但不是随便配的。采样点位置必须在75%~87.5% 的位置采样才是安全的。SJW 太小线缆变长导致信号延迟时CAN 节点无法重新同步直接报错。三、工程级解决方案方案 1手动计算最稳推荐以 STM32 72MHz 主频 500kbps 为例选一个 tq 分频系数Prescaler72MHz / 500kbps ≈ 144 tq/bit分配 BS1 和 BS2采样点推荐 80%BS1 8, BS2 1 (18110, 144/1014.4? 不对)重新调整Prescaler 9 → tq 125nsBit Time 1/500k 2000ns2000ns / 125ns 16 tqBS1 11, BS2 4 (111416)CubeMX 参数Prescaler 9BS1 11BS2 4SJW 1方案 2在线计算器量产级不要手算用官方工具STMicroelectronics CAN Bit Time CalculatorNXP Bit Timing Tool输入主频、目标波特率输出最优的 BS1/BS2/SJW 组合及采样点百分比。方案 3长距离必须降速CAN 总线不是以太网。距离推荐波特率 10 m1 Mbps 50 m500 kbps 100 m250 kbps 250 m125 kbps 500 m50 kbps四、选型避坑建议SJW 至少设为 1允许 1 个 tq 的时钟漂移。采样点高速500k80% 左右低速125k-85%~87.5%不要迷信 1Mbps大多数车载 ECU 只用 500kbps。五、总结 Checklist[ ] 是否用示波器实测过 CAN 的位时间[ ] 采样点是否在 75%~87.5% 之间[ ] SJW 是否 ≥ 1[ ] 长距离通讯时是否按比例降低了波特率六、写在最后关注我少走弯路我是 XXX一个拒绝调包、专注底层逻辑的嵌入式工程师。CAN 的位时序配置是“差之毫厘谬以千里”的典型代表参数配错示波器都未必能看出来。关注我的专栏《嵌入式底层避坑指南》我会持续更新 CAN、UART、SPI 等外设的真实调试案例和量产级解决方案。下一篇预告《CAN 数据丢帧别只加 FIFO看看接收过载与错误处理》ReferencesISO 11898-1 – CAN protocol data link layerSTM32 Reference Manual – bxCAN bit timing register如果你在配置 CAN 波特率时被 CubeMX 的自动计算坑过欢迎在评论区晒出你的参数。原创文章转载请注明出处。
CAN 波特率 500k 配不出来?别只怪晶振,看看 SJW 与 BS1/BS2
摘要CubeMX 里填了 500kbps示波器测出来只有 476kbps或者长距离通讯时 ACK 总是不对不是晶振不准而是 CAN 位时序BS1/BS2与同步跳转宽度SJW配置不当。本文拆解 CAN 的“时间量子”。一、问题描述现象**MCU 主频 72MHz想配 500kbps用计算器算出来的参数示波器实测却是 476kbps或者短距离能通线缆一拉长 50米就开始丢帧。**很多工程师的做法是换一个晶振8M / 16M / 25M手动改 BS1/BS2 数值试放弃用 250kbps二、原理分析1. 物理模型CAN 的一个比特Bit由若干时间量子Time Quantum, tq组成。| Sync | Propagation | Phase Segment 1 | Phase Segment 2 | | 1 tq | BS1 (N tq)| BS2 (M tq) |2. 核心参数tq (Time Quantum)CAN 外设的最小时间单位。BS1 (Bit Segment 1)采样点之前的时间。BS2 (Bit Segment 2)采样点之后的时间。SJW (Sync Jump Width)同步跳转宽度用于重新同步。波特率计算公式Baud Rate 1 / ( (1 BS1 BS2) × tq )3. 反直觉真相CAN 波特率允许有 ±0.5% ~ ±1.5% 的误差但不是随便配的。采样点位置必须在75%~87.5% 的位置采样才是安全的。SJW 太小线缆变长导致信号延迟时CAN 节点无法重新同步直接报错。三、工程级解决方案方案 1手动计算最稳推荐以 STM32 72MHz 主频 500kbps 为例选一个 tq 分频系数Prescaler72MHz / 500kbps ≈ 144 tq/bit分配 BS1 和 BS2采样点推荐 80%BS1 8, BS2 1 (18110, 144/1014.4? 不对)重新调整Prescaler 9 → tq 125nsBit Time 1/500k 2000ns2000ns / 125ns 16 tqBS1 11, BS2 4 (111416)CubeMX 参数Prescaler 9BS1 11BS2 4SJW 1方案 2在线计算器量产级不要手算用官方工具STMicroelectronics CAN Bit Time CalculatorNXP Bit Timing Tool输入主频、目标波特率输出最优的 BS1/BS2/SJW 组合及采样点百分比。方案 3长距离必须降速CAN 总线不是以太网。距离推荐波特率 10 m1 Mbps 50 m500 kbps 100 m250 kbps 250 m125 kbps 500 m50 kbps四、选型避坑建议SJW 至少设为 1允许 1 个 tq 的时钟漂移。采样点高速500k80% 左右低速125k-85%~87.5%不要迷信 1Mbps大多数车载 ECU 只用 500kbps。五、总结 Checklist[ ] 是否用示波器实测过 CAN 的位时间[ ] 采样点是否在 75%~87.5% 之间[ ] SJW 是否 ≥ 1[ ] 长距离通讯时是否按比例降低了波特率六、写在最后关注我少走弯路我是 XXX一个拒绝调包、专注底层逻辑的嵌入式工程师。CAN 的位时序配置是“差之毫厘谬以千里”的典型代表参数配错示波器都未必能看出来。关注我的专栏《嵌入式底层避坑指南》我会持续更新 CAN、UART、SPI 等外设的真实调试案例和量产级解决方案。下一篇预告《CAN 数据丢帧别只加 FIFO看看接收过载与错误处理》ReferencesISO 11898-1 – CAN protocol data link layerSTM32 Reference Manual – bxCAN bit timing register如果你在配置 CAN 波特率时被 CubeMX 的自动计算坑过欢迎在评论区晒出你的参数。原创文章转载请注明出处。