相关理论补充
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 两个作用
- **制造足够的跳变供再同步使用。**如果长时间全为 0 或全为 1,接收节点缺少边沿,时钟误差会持续累积。
- **提供填充错误检测。**在应遵守填充规则的区域,如果接收器看见第 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。
二、学习检查
完成本课后,应能自行推导并解释:
- 为什么采样点位于 BS1 末端,而不是 BS1、BS2 各自的中点?
- 本工程 36 MHz CAN 时钟如何得到 500 kbit/s?
- 硬同步和再同步分别在什么时候发生,SJW 限制什么?
- 为什么连续 5 个相同位后要插入反向位?
- 两个节点同时发送时,为什么低数值 ID 获胜且获胜帧不会被破坏?
- 为什么三节点网络通常仍只安装两只 120 Ω 终端电阻?