2. XCP协议核心机制解析
XCP(Universal Measurement and Calibration Protocol)之所以能同时支撑测量、标定、刷写与旁路等多种用途,关键在于它把“传输层”和“协议层”彻底解耦。理解这一点,是后续在 RH850 上配置 XCP 从站、规划 DAQ 事件通道、编写上位机 A2L 描述文件的前提。本节围绕四个核心机制展开:协议分层结构、主从通信模型、命令集分类,以及事件通道与 DAQ/STIM 的数据采集原理。
一、协议分层:传输层与协议层解耦
XCP 在结构上分为两层。下层是传输层(Transport Layer),负责把字节流可靠地搬运到对端,具体形式可以是 CAN、CAN FD、FlexRay、以太网(UDP/TCP)或 SxI。上层是协议层(Protocol Layer),定义命令格式、响应格式、DAQ 列表组织方式、标定页切换、种子密钥等语义。两层之间通过统一的“XCP 报文”接口衔接:协议层只关心“我要发一条 CONNECT 命令”,至于这条命令是走 CAN 还是走以太网,由传输层决定。
这种解耦带来一个直接好处:同一套 A2L 描述和上位机标定逻辑,可以在 CAN 版本和以太网版本之间迁移,只需替换传输层配置。在 RH850 工程中,常见做法是把 XCP 从站代码与 MCU 的 CAN 驱动、以太网驱动分层放置,协议层不直接调用寄存器,而是调用传输层提供的发送/接收回调。
二、主从通信模型:命令—响应严格配对
XCP 采用严格的主从模型。主站发起所有命令,从站只做两件事:执行命令并返回响应,或在事件触发时主动发送 DAQ 数据帧。从站不会主动发起命令,也不会在没有配置的情况下主动发送数据。这种设计保证了通信的可预测性,也简化了从站的状态机实现。
每条命令都遵循“命令码 + 参数 + 响应码 + 数据”的格式。以 CONNECT 为例,主站发送 0xFF 0x00,从站返回 0xFF 0x00 加资源位、通信模式、最大 CTO/DTO 等字段。主站根据响应判断从站是否支持标定、是否支持 DAQ、是否支持 STIM。在 RH850 工程中,CONNECT 响应中的 MAX_DTO 字段直接决定后续 DAQ 列表能打包多少字节,是配置 ODT 条目时必须先确认的参数。
主从模型还体现在错误处理上。如果从站收到不支持的命令,会返回 ERR_CMD_UNKNOWN;如果命令参数越界,返回 ERR_OUT_OF_RANGE。主站必须根据响应码决定重试、降级还是终止。实际调试中,最常见的错误是地址越界和 DAQ 列表未初始化就启动,这两类问题都会在响应码中直接体现。
三、命令集分类:标定、测量与页面管理
XCP 命令按功能可分为几组。第一组是连接与状态管理:CONNECT、DISCONNECT、GET_STATUS、SYNCH。第二组是标定相关:SET_CAL_PAGE、GET_CAL_PAGE、COPY_CAL_PAGE、DOWNLOAD、SHORT_DOWNLOAD、UPLOAD、SHORT_UPLOAD。第三组是测量与 DAQ 配置:SET_DAQ_PTR、WRITE_DAQ、SET_DAQ_LIST_MODE、START_STOP_DAQ_LIST、START_STOP_SYNCH。第四组是内存访问与页切换:SET_MTA、MODIFY_BITS 等。
标定命令的核心是“先设地址,再读写”。SET_MTA 把从站的 MTA 指针指向目标地址,随后 DOWNLOAD 或 UPLOAD 从该地址开始操作。SHORT_DOWNLOAD 允许在命令中直接携带地址,省去一次 SET_MTA,适合小数据量频繁写入。在 RH850 上做在线标定时,通常先用 SET_CAL_PAGE 把标定页切到 RAM 页,再用 SHORT_DOWNLOAD 写入新的标定值,最后用 COPY_CAL_PAGE 把 RAM 页内容固化到 Flash 页。
测量命令的核心是“先建列表,再启动”。SET_DAQ_PTR 指定当前操作的 DAQ 列表和 ODT 条目,WRITE_DAQ 把变量地址、长度和扩展信息写入该条目,SET_DAQ_LIST_MODE 设置事件通道和发送模式,最后 START_STOP_DAQ_LIST 启动。整个过程是配置—启动两阶段,配置阶段不产生数据,启动后才按事件周期发送。
四、事件通道与 DAQ/STIM 机制
DAQ(Data Acquisition)是从站到主站的数据采集方向,STIM(Stimulation)是主站到从站的激励方向。两者共用同一套 ODT(Object Descriptor Table)结构,区别只在数据流向。一个 DAQ 列表由若干 ODT 组成,每个 ODT 包含若干条目,每个条目描述一个变量的地址、长度和类型。从站按事件触发,把 ODT 中所有条目对应的变量值打包成一帧 DTO 发出。
事件通道是 DAQ 的“心跳”。常见事件包括 1ms、10ms、100ms 周期事件,以及曲轴角度事件、点火事件等。在 RH850 电机控制工程中,典型配置是:10ms 事件通道绑定一个 DAQ 列表,采集转速、母线电压、三相电流等慢变量;100μs 或角度事件通道绑定另一个 DAQ 列表,采集相电流瞬时值和 PWM 占空比。事件周期决定了采样率,也决定了总线负载。
配置 DAQ 时需要关注三个参数:事件通道编号、ODT 条目数量、DTO 帧长度。以 CAN FD 为例,单帧最多 64 字节,若每个变量占 4 字节,理论上一个 ODT 最多放 16 个变量。但实际还要扣除 XCP 头部和 ODT 编号,通常留出 2~4 字节余量。若变量总长度超过单帧容量,需要拆成多个 ODT,从站会按顺序发送多帧。
五、在 RH850 工程中的落地要点
把上述机制落到 RH850 工程,需要关注几个具体点。第一,传输层选择:若用 CAN FD,需确认 MCU 的 CAN 控制器支持 FD 帧,并在 XCP 传输层配置中把 MAX_DTO 设为 64 或实际可用值。第二,地址映射:A2L 中的变量地址必须与链接脚本中的实际地址一致,标定页切换要确保 RAM 页和 Flash 页的地址偏移正确。第三,事件源绑定:RH850 的定时器中断或电机控制中断需要调用 XCP 的事件触发函数,把事件通道编号传给 DAQ 引擎。第四,DAQ 内存分配:从站需要为每个 ODT 预分配缓冲区,缓冲区大小由 ODT 条目数和最大 DTO 长度决定,通常在 XCP 从站配置头文件中定义。
一个常见的调试顺序是:先 CONNECT 确认通信正常,再 GET_STATUS 确认资源支持,然后 SET_MTA + SHORT_UPLOAD 读取一个已知变量验证地址映射,接着配置一个最小 DAQ 列表(1 个 ODT、1 个变量)并启动,用示波器或总线分析仪观察 DTO 帧是否按事件周期出现。这个顺序能把通信、地址、DAQ 三类问题分开定位,避免一次性配置大量变量后难以排查。