CAN 波特率的几个参数说明和计算方式(以STM32为例)

CAN总线的位时间 (决定波特率的根本)主要由 Seg1Seg2 这两个段决定。但是,还有一个同样关键的段叫做 Propagation Segment

所以,一个完整的标准位时间由以下4个段组成:

  1. 同步段

  2. 传播时间段

  3. 相位缓冲段1

  4. 相位缓冲段2

Sync Jump Width 是一个与这些段相关的、非常重要的容错参数

下面我们来详细分解:

1. 决定波特率的四个段

位时间可以想象为将一个CAN位的长度(例如,在500kbps下是2微秒)划分成的几个部分。其计算公式为:

波特率 = 1 / 位时间

位时间 = (Sync_Seg + Prop_Seg + Seg1 + Seg2) × 时间量子

其中:

  • 同步段(Sync Segment, Sync_Seg)

    • 作用:用于同步总线上的各个节点。期望的边沿(从隐性到显性或反之)就发生在这个时间段内。

    • 长度 :固定为 1个时间量子。您无法更改它。

  • 传播时间段(Propagation Segment, Prop_Seg)

    • 作用:用于补偿信号在物理总线上传输的延迟,包括总线上的延迟和节点内部(收发器、PCB走线)的延迟。

    • 长度 :可配置,通常为1-8个时间量子。这个段是您提到的第三个关键段。

  • 相位缓冲段1(Phase Buffer Segment 1, Seg1)

    • 作用 :用于补偿节点的内部时钟误差。它可以在再同步时被延长。

    • 长度:可配置,通常为1-8个时间量子。

  • 相位缓冲段2(Phase Buffer Segment 2, Seg2)

    • 作用 :同样用于补偿节点的内部时钟误差。它可以在再同步时被缩短。

    • 长度:可配置,通常为1-8个时间量子。

重要关系:

在常见的控制器(如STM32的bxCAN)中,Prop_Seg 和 Seg1 经常被合并成一个参数 ,称为 BS1

  • BS1(时间段1) = Prop_Seg + Seg1

  • BS2(时间段2) = Seg2

因此,我们最常见的配置公式是:
位时间 = (1 + BS1 + BS2) × 时间量子

采样点 的位置位于 BS1结束之时(即Seg1的末尾)。采样点是读取总线电平并决定该位是显性还是隐性的时刻。通常建议将采样点设置在位时间的75% - 80%左右。


2. 同步跳转宽度(Sync Jump Width, SJW)

现在来回答您关于SJW的部分。

  • 作用 :SJW不直接决定波特率 ,但它决定了在一次再同步过程中,位时间可以调整的最大限度。它是一个容错参数,用于适应不同节点之间的时钟偏差。

  • 工作原理:当CAN控制器检测到一个边沿没有出现在预期的Sync_Seg内时,它会通过延长Seg1或缩短Seg2来"重新同步"自己的位时钟。SJW的值限制了这种调整的最大幅度。

    • SJW决定了Seg1最多可以被延长多少个时间量子。

    • SJW也决定了Seg2最多可以被缩短多少个时间量子。

  • 配置规则 :SJW的值通常设置为 1到4之间 ,并且必须满足:SJW ≤ Min(BS1, BS2)。也就是说,它不能大于BS1和BS2中较小的那个。

总结与配置示例

假设我们要配置一个500kbps的CAN总线,使用8MHz的时钟,目标采样点为80%。

  1. 计算时间量子: 时间量子 = 1 / 8MHz = 0.125 µs

  2. 计算位时间: 位时间 = 1 / 500kHz = 2 µs

  3. 计算总时间量子数: 总时间量子数 = 2 µs / 0.125 µs = 16

  4. 分配各段

    • Sync_Seg = 1 (固定)

    • 剩余 16 - 1 = 15 个时间量子分配给 BS1 和 BS2。

    • 为了达到80%的采样点,采样点应在 16 * 0.8 = 12.8 -> 约第13个时间量子处。采样点在BS1末尾,所以:

      • BS1 = (Prop_Seg + Seg1) = 12 (包括Sync_Seg的1,所以实际是13-1=12)

      • BS2 = Seg2 = 16 - 1 - 12 = 3

    • 检查:采样点 = (1 + BS1) / (1 + BS1 + BS2) = (1+12)/16 = 81.25%,符合要求。

  5. 设置SJW

    • Min(BS1, BS2) = Min(12, 3) = 3

    • 我们可以设置 SJW = 12 以提供足够的容错,同时保持稳定。

结论:

  • 直接决定波特率 的是:Sync_Seg(固定为1)、Prop_Seg、Seg1 和 Seg2

  • SJW 是一个至关重要的辅助和容错参数,它确保了在存在时钟偏差时,由上述四个段定义的位时间仍然能够稳定可靠地工作。

相关推荐
鸟电波6 分钟前
硬件笔记——Allegro绘制PCB(未完待续)
笔记·嵌入式硬件·智能硬件
永霖光电_UVLED11 分钟前
CEA-Leti 和 CEA-List 已宣布与 Powerchip 半导体制造公司 (PSMC) 合作
人工智能·生成对抗网络·汽车·制造·激光
申耀的科技观察20 分钟前
【观察】昂瑞微5G射频前端通过车规认证,筑牢智能网联汽车通信安全“底座”
前端·5g·汽车
悠哉悠哉愿意34 分钟前
【单片机复习笔记】十三届国赛复盘2
笔记·单片机·嵌入式硬件
清风66666635 分钟前
基于单片机的矿井温度、烟雾与甲烷检测通风报警系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
水云桐程序员37 分钟前
单片机如何工作|单片机工作原理
单片机·嵌入式硬件
水云桐程序员40 分钟前
用C语言开发单片机项目的工作思路
c语言·开发语言·单片机
Freak嵌入式1 小时前
MicroPython LVGL基础知识和概念:底层渲染与性能优化
人工智能·python·单片机·性能优化·嵌入式·lvgl·micropython
kaikaile19951 小时前
移动机器人路径跟踪的设计与仿真:模型预测控制(MPC)详解
人工智能·stm32·嵌入式硬件·算法
广药门徒6 小时前
PADS 为什么router里面两元件放置在一个地方不会报错
嵌入式硬件