4. CAN通信数据链路层:帧格式与仲裁机制
CAN协议的数据链路层定义了五种帧类型,用于实现节点间的数据交换、请求、错误报告和帧间隔控制。理解这些帧的结构与行为,是排查总线通信故障的基础。本节将详细解析每种帧的格式、仲裁机制以及位填充规则。
4.1 五种帧类型概述
CAN总线上的通信通过以下五种帧完成:
| 帧类型 | 功能 | 触发条件 | 优先级 |
|---|---|---|---|
| 数据帧 | 发送节点向总线广播数据 | 节点有数据要发送 | 由标识符决定 |
| 远程帧 | 请求其他节点发送特定标识符的数据 | 节点需要数据但自身不发送 | 由标识符决定 |
| 错误帧 | 检测到总线错误时通知所有节点 | 任何节点检测到错误 | 最高(立即打断) |
| 过载帧 | 表示节点尚未准备好接收后续帧 | 节点内部过载条件 | 次于错误帧 |
| 帧间隔 | 分隔数据帧/远程帧与后续帧 | 帧结束后的空闲时段 | — |
4.2 数据帧结构(标准格式与扩展格式)
数据帧是CAN通信中最常用的帧类型。它由七个位场组成:
数据帧位场序列: 帧起始(SOF) → 仲裁场 → 控制场 → 数据场 → CRC场 → ACK场 → 帧结束(EOF)
标准格式(11位标识符)与扩展格式(29位标识符)的主要差异体现在仲裁场和控制场:
| 位场 | 标准格式 | 扩展格式 |
|---|---|---|
| 帧起始(SOF) | 1位显性 | 1位显性 |
| 仲裁场 | 11位标识符 + RTR位 | 29位标识符 + SRR位 + IDE位 + RTR位 |
| 控制场 | IDE位 + r0 + DLC(4位) | r1 + r0 + DLC(4位) |
| 数据场 | 0~8字节 | 0~8字节 |
| CRC场 | 15位CRC + 1位CRC界定符 | 15位CRC + 1位CRC界定符 |
| ACK场 | 1位ACK槽 + 1位ACK界定符 | 1位ACK槽 + 1位ACK界定符 |
| 帧结束(EOF) | 7位隐性 | 7位隐性 |
排查提示: 在XMC系列微控制器中,通过CAN节点配置寄存器(如CAN_NCRx)可设置帧格式。若总线出现“格式错误”,应首先检查标识符长度(标准/扩展)是否与总线其他节点一致。
4.3 远程帧与数据帧的对比
远程帧用于请求数据,其结构与数据帧类似,但有两个关键区别:
- RTR位: 数据帧中为显性(0),远程帧中为隐性(1)。
- 数据场: 远程帧不包含数据字节,DLC字段指示请求的数据长度。
当远程帧与具有相同标识符的数据帧同时发送时,数据帧因RTR位为显性而赢得仲裁。
4.4 错误帧与过载帧
错误帧由两个场组成:
- 错误标志: 6个连续相同位(显性错误标志为6个显性位,隐性错误标志为6个隐性位)。
- 错误界定符: 8个隐性位。
过载帧的结构与错误帧类似,但触发条件不同:
- 节点在帧间隔的前两个位检测到显性位。
- 节点因内部过载需要延迟下一个数据帧或远程帧。
故障排查要点: 频繁出现的错误帧通常指示物理层问题(如终端电阻缺失、线缆短路)或位时序配置错误。在XMC调试中,可通过CAN错误状态寄存器(CAN_ECNT)读取发送/接收错误计数,快速定位故障节点。
4.5 仲裁机制
CAN总线采用载波监听多路访问/冲突检测(CSMA/CD)结合非破坏性逐位仲裁机制。当多个节点同时发送时,通过标识符的逐位比较决定优先级:
- 显性位(逻辑0) 覆盖 隐性位(逻辑1)。
- 发送隐性位但检测到显性位的节点立即退出仲裁,转为接收模式。
- 标识符数值越小,优先级越高。
下图展示了三个节点同时发送时的仲裁过程:
4.6 位填充机制
位填充是CAN协议为保证时钟同步和帧界定而引入的编码规则:
- 规则: 发送节点在连续发送5个相同位后,自动插入一个相反极性的填充位。
- 作用: 防止长时间无跳变导致接收节点失去同步,同时避免将连续6个相同位误判为错误标志。
- 范围: 从SOF到CRC场结束(包括CRC界定符之前的位)。
- 例外: 错误帧、过载帧和帧间隔不进行位填充。
位填充示例: 若数据段中出现“11111”,发送器会在其后插入一个“0”,变为“111110”。接收器在解码时会自动移除该填充位。
位填充错误是CAN总线常见的故障类型之一。当接收节点检测到连续6个相同位时,将触发位填充错误,并立即发送错误帧。
4.7 XMC微控制器中的帧处理配置
在XMC系列中,通过CAN模块的寄存器配置可控制帧格式与仲裁行为:
/* XMC4500 CAN节点配置示例:设置标准帧格式,11位标识符 */
XMC_CAN_NODE_t node_config = {
.can_frequency = 8000000U, /* CAN时钟频率 8MHz */
.node_id = 1U, /* 节点ID */
.baudrate = 500000U, /* 波特率 500kbps */
.sample_point = 875U, /* 采样点 87.5% */
.frame_type = XMC_CAN_FRAME_TYPE_STANDARD_11B, /* 标准帧 */
.loop_back = false /* 禁用回环模式 */
};
/* 初始化CAN节点 */
XMC_CAN_NODE_Init(CAN_NODE1, &node_config);
调试建议: 使用XMC的CAN调试工具(如DAVE™中的CAN配置器)可实时查看帧ID、DLC和数据场内容。当出现“仲裁丢失”错误时,检查标识符优先级是否满足系统实时性要求。
4.8 帧格式故障排查清单
| 故障现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 总线持续错误帧 | 位填充错误、CRC错误 | 检查位时序配置、终端电阻、线缆长度 |
| 特定节点无法发送 | 仲裁丢失、标识符冲突 | 验证标识符唯一性,检查优先级 |
| 远程帧无响应 | 目标节点未配置相应ID | 确认远程帧ID与数据帧ID匹配 |
| 过载帧频繁出现 | 节点处理能力不足 | 检查中断优先级、DMA配置、CPU负载 |
掌握CAN帧格式与仲裁机制,是进行总线故障定位的理论基础。在XMC开发环境中,结合硬件调试器和CAN分析仪,可逐帧捕获并分析总线上的数据流,快速定位通信异常点。