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 错误帧与过载帧

错误帧由两个场组成:

  1. 错误标志: 6个连续相同位(显性错误标志为6个显性位,隐性错误标志为6个隐性位)。
  2. 错误界定符: 8个隐性位。

过载帧的结构与错误帧类似,但触发条件不同:

  • 节点在帧间隔的前两个位检测到显性位。
  • 节点因内部过载需要延迟下一个数据帧或远程帧。
故障排查要点: 频繁出现的错误帧通常指示物理层问题(如终端电阻缺失、线缆短路)或位时序配置错误。在XMC调试中,可通过CAN错误状态寄存器(CAN_ECNT)读取发送/接收错误计数,快速定位故障节点。

4.5 仲裁机制

CAN总线采用载波监听多路访问/冲突检测(CSMA/CD)结合非破坏性逐位仲裁机制。当多个节点同时发送时,通过标识符的逐位比较决定优先级:

  • 显性位(逻辑0) 覆盖 隐性位(逻辑1)。
  • 发送隐性位但检测到显性位的节点立即退出仲裁,转为接收模式。
  • 标识符数值越小,优先级越高。

下图展示了三个节点同时发送时的仲裁过程:

CAN总线非破坏性逐位仲裁示例 节点A (ID=0x2A0) 节点B (ID=0x180) 节点C (ID=0x2B0) 逐位仲裁过程(从左到右逐位比较) 位序号: 1 2 3 4 5 6 7 8 9 10 11 节点A: 0 1 0 1 0 1 0 0 0 0 0 节点B: 0 0 1 1 0 0 0 0 0 0 0 节点C: 0 1 0 1 0 1 0 1 0 0 0 仲裁结果:节点B(ID=0x180)在第2位以显性“0”获胜,节点A和C退出

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分析仪,可逐帧捕获并分析总线上的数据流,快速定位通信异常点。