相关理论补充

Tutorial: 卓越工程师 Category: 嵌入式 Published: 2026-10-23 11:05:29 Views: 0 Likes: 0 Comments: 0

192.1.15 相关理论补充

hcan.Init.SyncJumpWidth = CAN_SJW_1TQ; /* 本工程允许每次再同步最多用 1 个时间量子修正相位误差。 */

本课补充经典 CAN 的位同步、位填充、仲裁和终端电阻。它们主要由 CAN 控制器和物理层硬件自动完成,但直接决定波特率配置、报文优先级和总线可靠性,不能只记名词。

一、补充理论知识

1.1 同步方法

1.1.1 一个位由哪些时间段组成

经典 CAN 的一个标称位时间由四段组成:

| Sync_Seg | Prop_Seg | Phase_Seg1 | Phase_Seg2 |
                                    ^
                                  采样点
  • Sync_Seg:同步段,固定为 1 TQ,期望同步边沿出现在这里。
  • Prop_Seg:传播段,用于补偿电缆、收发器和输入比较器的往返传播延迟。
  • Phase_Seg1、Phase_Seg2:相位缓冲段,通过再同步被适当加长或缩短。
  • **采样点位于 Phase_Seg1 的末端,也就是 Phase_Seg1 与 Phase_Seg2 的边界。**原笔记所说“在 BS1 和 BS2 中间”不准确。

在 STM32 bxCAN 中,寄存器把 Prop_Seg + Phase_Seg1 合并为 BS1,把 Phase_Seg2 表示为 BS2,因此:

[ T_{bit}=TQ\times(1+BS1+BS2) ]

[ TQ=\frac{Prescaler}{f_{CAN}},\qquad BaudRate=\frac{f_{CAN}}{Prescaler\times(1+BS1+BS2)} ]

[ SamplePoint=\frac{1+BS1}{1+BS1+BS2}\times100% ]

本工程的 CAN 时钟为 36 MHz,Prescaler=4、BS1=9 TQ、BS2=8 TQ:

[ TQ=\frac{4}{36,MHz}=111.11,ns ]

[ T_{bit}=18\times111.11,ns=2,\mu s,\qquad BaudRate=500,kbit/s ]

[ SamplePoint=\frac{1+9}{18}=55.56% ]

这说明“波特率相同”还不够,采样点也由 BS1/BS2 的分配决定。实际网络应根据总线长度、收发器延迟和所有节点的时钟误差选择合理的采样点。

1.1.2 硬同步

总线空闲时,各节点自己的位时间计数器可能并未对齐。节点检测到隐性到显性的跳变,即帧起始 SOF 的下降沿后,会执行硬同步:把该边沿视为新一位的 Sync_Seg 起点,重新开始位时间计数。

硬同步的重点是:

  • 它用于一帧开始时建立共同的时间基准;
  • 它不是把已经采到的波形在软件中“拖动”;
  • CAN 控制器根据边沿重置内部位时间状态,软件无需逐位处理。
1.1.3 再同步

一帧可能持续很多位,而不同节点的晶振始终存在微小误差。如果一直自由计数,采样点会逐渐漂移。帧内检测到可用于同步的边沿后,控制器计算边沿相对期望位置的相位误差,并进行再同步:

  • 边沿来得比期望晚,加长当前位的 Phase_Seg1,使采样点向后移动;
  • 边沿来得比期望早,缩短前一位/当前时序中的 Phase_Seg2,使下一位重新对齐;
  • 一次最多修正多少 TQ,由 SJW(Synchronization Jump Width,再同步跳转宽度)限制。

本工程配置 CAN_SJW_1TQ,表示单次最多修正 1 TQ。SJW 不是波特率分频值,也不是固定给每个位增加 1 TQ;只有检测到需要再同步的有效边沿时才参与修正。

1.2 位填充

原笔记中的“未填充”是语音识别错误,正确术语是位填充(bit stuffing)。

1.2.1 规则

从 SOF 开始,到 CRC 序列最后一位为止,发送器每检测到 5 个连续且相同的位,就在实际发送比特流中自动插入 1 个相反电平的填充位。接收器识别并删除该填充位,所以上层获得的报文内容不会多出一个位。

例如,逻辑数据中出现:

原始序列:0 0 0 0 0 0 ...
总线序列:0 0 0 0 0 1 0 ...
                      ↑ 自动插入的填充位

CRC 定界符、ACK 字段和 EOF 属于固定格式字段,不执行上述动态位填充。

1.2.2 两个作用
  1. **制造足够的跳变供再同步使用。**如果长时间全为 0 或全为 1,接收节点缺少边沿,时钟误差会持续累积。
  2. **提供填充错误检测。**在应遵守填充规则的区域,如果接收器看见第 6 个同极性位,就会判定填充错误。

错误主动节点发送的主动错误标志由 6 个连续显性位组成,它会故意破坏位填充规则,使其他节点也能立即检测到错误。由此可见,位填充不是简单地“防止六个低电平被误认为错误帧”,而是正常帧编码和错误传播机制共同依赖的规则。

位填充还会让帧长随数据内容变化:同样的 ID 和 DLC,如果连续相同位较多,实际占用总线的时间会更长。

1.3 仲裁

CAN 使用基于优先级的、非破坏性逐位仲裁。总线具有“线与”效果:

  • 显性位 0 可以覆盖隐性位 1;
  • 多个节点发送显性和隐性位时,总线上读到显性位;
  • 节点发送的同时也监视总线。

当某节点发送隐性位,却读到显性位时,说明另一个节点正在发送更高优先级的内容。该节点立即停止发送并转为接收,不会破坏获胜报文,所以称为非破坏性仲裁。

1.3.1 谁先获得总线
  • 如果一个节点已经在空闲总线上发出 SOF,其他节点检测到总线忙后不会插入新帧。
  • 如果多个节点在同一 SOF 同时开始,才进入逐位仲裁。
  • 对标准帧而言,从标识符最高位开始比较;数值更小的 ID 更早出现显性 0,因而优先级更高。

例如:

ID 0x120:001 0010 0000
ID 0x123:001 0010 0011
                    ^ 首个不同位处,0x120 发 0、0x123 发 1

因此 0x120 获胜,0x123 的节点检测到“发 1、读 0”后退出本轮发送,并在总线重新空闲时再次竞争。

1.3.2 ID 相同时

在标准格式下,如果 11 位 ID 完全相同:

  • 数据帧的 RTR 为显性 0;
  • 远程帧的 RTR 为隐性 1;
  • 所以数据帧优先于同 ID 的远程帧。

标准帧与扩展帧具有相同的 11 位基本 ID 时,标准帧还会在 SRR/IDE 相关位置获得优先权。设计网络 ID 时仍应避免让不同节点同时发送“ID、帧类型和数据均冲突”的报文,因为仲裁字段结束后再出现不一致将不再是正常仲裁,而会触发错误处理。

1.4 终端电阻

1.4.1 为什么需要终端

高速 CAN 总线使用双绞线传输快速边沿。导线具有特性阻抗,信号到达不匹配的线缆末端时会反射,反射叠加后可能造成振铃、过冲或多次跨越接收阈值。终端电阻的作用是让总线末端阻抗接近线缆特性阻抗,吸收传播到末端的能量。

典型高速 CAN 网络应当:

  • 在线性主干的两个物理末端各放置 120 Ω;
  • 中间节点通过尽量短的支线接入,不在每个节点都加 120 Ω;
  • 断电测量 CANH 与 CANL 之间的直流电阻时,两只 120 Ω 并联约为 60 Ω。

课程使用的 CAN 收发器模块上已经带有终端电阻,因此两个模块连接后,相当于主干两端各有一只终端。但不同模块可能使用焊盘、拨码开关或跳帽选择是否接入 120 Ω,接线前应查原理图或实测,不能只凭模块外观判断。

1.4.2 多节点接法

三个或更多节点仍只在主干两端终端,中间节点不应继续并联 120 Ω。若三只 120 Ω 并联,等效电阻会降为 40 Ω,加重收发器负载。近距离、低速实验在错误终端下“偶尔能通信”,不代表布线符合规范,也不能作为量产设计依据。

课程图中的低速容错 CAN 使用了不同的偏置/终端网络。它不能概括成“低速 CAN 不需要终端”,也不能把图上的 2.2 kΩ 直接套用到普通高速 CAN。具体阻值和拓扑必须以所用收发器数据手册为准。

1.5 课程相关资料汇总

  • 位时间、位填充、仲裁和错误标志可对照 Bosch CAN 2.0 规范。
  • STM32F103 bxCAN 的 BS1/BS2、SJW、测试模式和寄存器配置可对照 ST RM0008。

二、学习检查

完成本课后,应能自行推导并解释:

  1. 为什么采样点位于 BS1 末端,而不是 BS1、BS2 各自的中点?
  2. 本工程 36 MHz CAN 时钟如何得到 500 kbit/s?
  3. 硬同步和再同步分别在什么时候发生,SJW 限制什么?
  4. 为什么连续 5 个相同位后要插入反向位?
  5. 两个节点同时发送时,为什么低数值 ID 获胜且获胜帧不会被破坏?
  6. 为什么三节点网络通常仍只安装两只 120 Ω 终端电阻?