3. XCP协议核心机制解析

XCP(Universal Measurement and Calibration Protocol)的设计精髓在于“协议核心与传输层分离”。同一套命令语义、同一套DAQ/STIM机制,可以分别跑在CAN、CAN FD、以太网(UDP/TCP)甚至FlexRay之上。理解XCP,关键要抓住三件事:传输层如何承载XCP报文、主从通信模型如何组织命令与响应、DAQ与STIM事件通道如何把测量与激励变成周期性的数据流。

一、传输层:XCP报文如何“搭车”

XCP本身不定义物理层,而是定义了一个传输层接口。在CAN上,XCP报文被封装进标准或扩展数据帧,通常采用“一帧一包”的方式:命令包(CMD)、响应包(RES)、事件包(EV)、DAQ数据包(DTO)都通过CAN ID区分。经典CAN每帧最多8字节,扣除XCP包头后有效载荷有限,因此大块数据(如标定页读写)需要分帧传输;CAN FD把有效载荷扩展到最多64字节,单帧可承载更多DAQ数据,显著降低总线负载。在以太网上,XCP通常使用UDP,端口号由配置决定(常见如5555),报文长度不再受8字节限制,适合高带宽测量场景。

传输层的关键参数包括:传输层类型(CAN/CAN FD/Ethernet)、最大DTO长度、最大CTO长度、通信模式(主从或从从)。这些参数在A2L文件中描述,标定工具据此决定如何打包与解析。例如,CAN FD下若配置MAX_DLC_REQUIRED=1,则每帧必须填满64字节;若为0,则允许变长,节省带宽。

XCP传输层封装与主从通信模型 主节点 Master 标定工具 / 测试脚本 发起CMD、接收RES/DAQ 从节点 Slave ECU / AURIX 执行命令、上报事件 传输层 Transport Layer CAN / CAN FD / Ethernet(UDP/TCP) CTO:命令/响应/事件 DTO:DAQ/STIM 数据 XCP报文结构(以CTO命令包为例) PID 包标识 CMD 命令码 参数1..n 地址/长度/数据 填充 对齐/预留 PID 响应标识 RES 响应码 数据 返回内容 CTO:命令/响应/事件;DTO:DAQ/STIM 数据,由事件通道周期触发

二、主从通信模型:谁发起、谁响应

XCP采用严格的主从模型。主节点(Master)通常是PC上的标定工具(如INCA、CANape)或自动化测试脚本;从节点(Slave)是运行XCP驱动的ECU,在AURIX上通常由XCP软件包配合CAN/Ethernet驱动实现。主节点发起所有命令,从节点执行并返回响应。从节点不会主动发起命令,但可以通过事件包(EV)主动上报状态,例如DAQ溢出、命令错误、会话状态变化。

通信过程分为几个阶段:连接(CONNECT)、会话配置(如设置DAQ列表、分配内存)、测量/标定操作、断开(DISCONNECT)。CONNECT命令用于建立逻辑连接,从节点返回其支持的资源(如最大CTO/DTO、DAQ列表数量、标定页数量)。主节点据此规划后续操作。例如,若从节点报告支持8个DAQ列表、每个列表最多16个ODT,主节点在配置高速测量时就不能超过这个上限。

命令包与响应包的结构在传输层之上保持一致。CTO(Command Transfer Object)承载命令、响应和事件;DTO(Data Transfer Object)承载DAQ和STIM数据。CTO包的第一个字节是PID(Packet Identifier),用于区分命令、响应、事件、服务请求等。命令包中PID之后是CMD(命令码),再往后是参数;响应包中PID之后是RES(响应码),再往后是返回数据。这种统一结构使得XCP解析器可以跨传输层复用。

三、DAQ与STIM事件通道:周期数据流的引擎

DAQ(Data Acquisition)用于从从节点周期性地采集测量变量;STIM(Stimulation)用于向从节点周期性地写入激励变量。两者都基于“事件通道”概念:从节点内部有一个或多个事件源(如10ms任务、1ms任务、曲轴角度事件),每个事件可以关联一个DAQ列表或STIM列表。当事件触发时,从节点按照列表中的ODT(Object Descriptor Table)条目,把变量数据打包成DTO帧发送(DAQ)或把接收到的DTO数据解包写入变量(STIM)。

DAQ列表的配置过程如下:主节点先通过FREE_DAQ命令清空从节点的DAQ配置,再用ALLOC_DAQ分配DAQ列表,用ALLOC_ODT分配ODT,用ALLOC_ODT_ENTRY分配ODT条目,最后用SET_DAQ_PTR和WRITE_DAQ写入具体变量地址与长度。每个ODT条目描述一个变量的地址、扩展地址、大小和位偏移。配置完成后,用START_STOP_DAQ_LIST启动列表,从节点便在对应事件触发时自动发送DTO。

以AURIX TC3xx为例,假设要测量发动机转速(地址0x80001000,4字节)、水温(地址0x80002000,2字节)和节气门位置(地址0x80003000,2字节)。可以配置一个DAQ列表,关联到10ms任务事件,包含两个ODT:ODT0放转速和水温,ODT1放节气门位置。每个DTO帧的PID会标识这是DAQ数据,并携带时间戳(如果启用)。主节点收到DTO后,根据A2L中的描述解析出物理值。若总线负载过高,可以增大事件周期或减少变量数量;若出现DAQ溢出事件,说明从节点发送速度跟不上事件触发速度,需要优化列表或提高总线带宽。

实践提示:在CAN FD上配置DAQ时,建议将MAX_DLC_REQUIRED设为0,允许变长DTO,避免为凑满64字节而填充无用数据。同时,DAQ列表的ODT数量不宜过多,否则单帧可能装不下,导致分帧和延迟。

STIM的配置与DAQ类似,但方向相反:主节点通过DTO帧把数据发送给从节点,从节点在事件触发时把数据写入目标变量。STIM常用于硬件在环(HIL)测试中向ECU注入传感器信号。需要注意的是,STIM和DAQ可以共用事件通道,但同一事件下同时启用两者时,要确保总线带宽和从节点处理能力足够。