CAN 总线的位时序与参数设置

CAN 的位时序构成

CAN 总线的每个位(Bit)的周期 Tbit = 1 / Baudrate。根据 CAN 规范,每个位的时间内又可细分成4段:

  • 同步段(Synchronization Segment,Tss)
  • 传播段(Propagation Segment, Tps)
  • 相位缓冲段 1(Phase Buffer Segment 1, Tpbs 1)
  • 相位缓冲段 2(Phase Buffer Segment 2, Tpbs 2)

CAN的位时序图

时序计量单位

CAN 控制器为了适应各种波特率,对上面四个段的时间长度,不是使用纳秒(ns)或微秒(us)来度量,而是使用节拍来度量,技术资料中将这个节拍称为时间量子(Time quantum, Tq)。

例如 500 k 的波特率,每个 Tbit 是 2000 ns,如果分为 10 个节拍,则每个 Tq 为 200ns。

工作流程

发送节点在每个 bit 中主要完成发送和回检。
发送侧工作流程
接收节点在每个 Bit 中主要完成接收和同步。
接收侧工作流程

传播段时长 Tps

传播段 PS 占据的时间是信号在总线上来回传输的时间。

一次单向传输的延时 Tdelay 包括 3 个时间:

  1. 发送节点从产生信号到发到总线的时间 Td 1;
  2. 信号在总线传输的时间 Tbus;
  3. 接收节点从总线获取信号的时间 Td 2。

按规范要求,传播段的时间 Tps 应大于等于 2 倍 Tdelay 的时间,即
Tps >= 2 * Tdelay = 2 * (Td 1 + Tbus + Td 2)

为什么规定是两倍时间呢?

CAN 总线是一种允许竞争并自行仲裁的协议。见上面工作流程图可知,每个节点会回读自己发出的信号。

假设极端情况下,节点 Node 1 在总线的一端发出了信号 s 1,总线另一端的节点 Node 2 在 Tdelay 时间之前由于尚未收到信号 s 1,所以可能认为总线是空闲的,那就可能往总线上发送信号 s 2。当然,Node 2 刚发出 s 2,总线上就产生了 s 1 和 s 2 的竞争,而这个竞争的情况会又经过 Tdelay 的时间才被 Node1感知到。

所以两倍 Tdelay 的要求就是为了保证每个节点都能正确检测到总线上的竞争。

CAN 参数设置

下面以 STM 32 系列 CPU 为例,具体说明参数设置方法。

STM 32 CPU 的 CAN 与位时序相关的参数有4个:

  • **BRP (Baud rate prescaler)**,预分频值,允许的范围是 1 ~ 1024。
  • TS 1 (Time segment 1), 允许的范围是 1 ~ 16。这个参数设置传播段(Tps)与相位缓冲段 1(Tpbs 1)相加的节拍数。
  • TS 2 (Time segement 2), 允许的范围是 1 ~ 8。这个参数设置相位缓冲段 2(Tpbs 2)的节拍数。
  • SJW (Resynchronization jump width), 重同步宽度,允许的范围是 1 ~ 4。用于设置 Tpbs 1 和 Tpbs 2 可以调整的节拍数。

1. BRP 的参数设置

BRP 用于将 APB 的时钟(其他 CPU 可能直接使用晶振时钟)分频到 CAN 时钟。CAN 时钟的每个周期就是前面说过的节拍或时间量子(Tq)

BRP 的值由基频(APB 时钟)频率 Fclk、波特率 Baudrate 和每个 Bit 的节拍数 Q 决定。
BRP = Fclk / (Q * Baudrate)

从 STM 32 寄存器参数允许范围来说,Q 的数量可以在 3 ~ 25 之间(见 TS 1 和 TS 2 的范围),但从同步调整的有效性来说,最好在 6 ~ 25 之间。
例如,APB 时钟 24 M,波特率 500 k,如果 Q 取 6 ~ 25 之间的整数值,则 BRP 可以使用的值有:2、3、4、6、8。

Q 的大小与通讯质量是有关系的。个人觉得只要寄存器 TS 1 和 TS 2 的数值允许,Q 值应该尽量大一点。Q 值越小,本地在同步调整时的变化就越大(不稳定)。
以 500 k 波特率(Tbit = 2000 ns)来说,如果 Q = 25,则每拍时长 Tq = 80 ns,也就是接收侧可以将同步的位置前后最小变动 80 ns;而如果 Q=5,则每拍时长 Tq = 400 ns,意味着接收侧对同步位置的调整至少是 400 ns。那很可能这次调快了,而后一次又调慢了,这会导致通讯质量明显下降。
对最极端的 Q = 3 来说(TS 1=1,TS 2=1),这样的时序分配导致几乎不具备重同步的能力。

2. TS 1 和 TS 2 的参数设置

TS 1 和 TS 2 的参数设置,就是将 Q 分配给位时序中 3 个段:PS、PBS 1 和 PBS 2 (SS 段永远占据一拍,不商量)。
Q = 1 + Tps + Tpbs 1 + Tpbs 2

  1. 计算传输段时长 Tps
    Tps 的长度根据设备性能和总线长度决定,通常总线单位延时可按 5.5 ns/米估算。单个节点收/发延时按 75 ns 估算。
    假定总线长度 12 米,则 Tps = 2 * ( 12 * 5.5 + 75 * 2) = 432 ns,然后根据上一步的 Q 值,计算出 Tq 的时间,再根据 Tq 和延时时间,计算 Tps 需要的节拍数。
    例如:当 Tq = 125 ns 时,432 ns 延时需要的节拍数 = 432 / 125,向上取整得到4。

  2. 计算相位补偿段 1 时长 Tpbs 1 和 相位补偿段 2 时长 Tpbs 2
    将 Q 值减 1,再减掉 Tps 的节拍数,剩余的节拍数由 Tpbs 1 和 Tpbs 2 平分。如果剩余节拍是奇数,则 Tpbs 1 比 Tpbs 2 少一拍。

  3. 计算 TS 1 和 TS 2 的值
    TS 1 等于 Tps 和 Tpbs 1 的节拍数相加。
    TS 2 等于 Tpbs 2 的值。

3. SJW 的参数设置

SJW 比较简单,取 (TS 2 - 1) 和 4 两个数字中小的那个。即 SJW = min (TS 2-1, 4)。

将上面的例子:基频 24 M,CAN 总线波特率 500 k,传输延时 432 ns,各种不同 Q 值下,各参数计算过程列表如下:

BRP Q Tq (ns) SS Tps 剩余 Tpbs 1 Tpbs 2 TS 1 TS 2 SJW
2 24 83.3 1 6 17 9 8 15 8 4
3 16 125.0 1 4 11 5 6 9 6 4
4 12 166.7 1 3 8 4 4 7 4 3
6 8 250.0 1 2 5 2 3 4 3 2
8 6 333.3 1 2 3 1 2 3 2 1

最后,很重要的一点
如果直接设置 STM 32 的寄存器,上面 BRP、TS 1、TS 2 和 SJW 的数值,全都需要减 1 后写入寄存器(见 STM 32 Reference Manual 中相关寄存器的说明);
如果使用 STM 提供的驱动程序,则直接使用 BRP、TS 1、TS 2 和 SJW 的数值初始化驱动的结构体。

#CAN
#通信协议
#todo