XCP协议
XCP协议前言一、XCP是什么二、使用步骤1.XCP的CAN帧结构1.1标识字段1.时间戳Timestamp Field1.数据域2.CTO3.DTO4.测量和标定4.1标定4.Polling轮询测量4.3同步测量总结前言前段时间想要搞CANoe和matlab联合仿真用电脑替代掉控制器。canoe实时读取can总线上的数据数据传给python调用AI帮我调参参数再通过canoe以标定的方式写进模型里。以达到提高生产力偷偷缩短劳动时间反向给自己加工资的目的。BUT创业未半而中道崩殂。用了小小的demo想说先把标定路子跑通。canoe和matlab联合仿真里标定接口只有XCP协议可以用但是标定总是报错XCP没接触过trace完全看不懂也不知道啥原因标不进去。所以我打算学习下XCP协议也就是这篇文章的由来。参考文献《XCP_Book_V1.5_EN》vector官网能够免费下载的文章学习入门利器XCP协议原文----查询具体命令必备一、XCP是什么XCP(Universal Measurement and Calibration Protocol)CCP(CAN Calibration Protocol)最开始是CCP随着发展应该是CCP不够用了ASAM在CCP的基础上又提出了XCP协议。XCP是CCP的plus版本就名字上看CCP是只能基于CAN2.0B通过can接口进行标定和测量。XCP 中的X指任意传输层可以on CANFD 、 LIN 、Ethernet、FlexRay等等等。但是据我观察最常用的还是CAN和Ethernet。以上是区别之一也是最显而易见的区别从名字上。从OSI七层协议上看XCP和CCP协议都只是Application层面上的协议底层的协议XCP不涉及。二、使用步骤1.XCP的CAN帧结构CAN的8字节数据域的格式截图来自XCP -Part 2- Protocol Layer Specification -1.0.DOC 1.1标识字段了解这部分内容之前要先知道XCP协议有两种报文类型 CTOCommand Transfer Object 和DTOCommand Transfer Object 。CTO是主机给从机下发命令每发一条指令从机都要做回复一问一答的形式。主要用来控制信息和命令响应用于建立、配置、控制通信会话之类的。也可以做异步的polling测量比如0xF4。此时的PID参数表示不同的command。DTO是用来传输数据的传输实际的标定测量数据通讯效率比较高。此时的PID是ODT编号。PID的参数分配如下图所示如果用DTO类型的报文那么传输类型又分为两种一种是“绝对ODT编号”一种是“相对ODT编号绝对DAQ编号”。绝对ODT编号是指ODT编号是唯一的即使是不同的DAQ也不会有重复的ODT编号这样仅通过ODT编号就可以区分不同的ODT。相对ODT编号是指不同的DAQ里可能有相同编号的ODT这样只通过ODT编号不能区分ODT。所以要在Identification field里PID后面再加上到个字节的DAQ列表编号这样才能找到唯一的起始地址。如果XCP数据包必须满足某些对齐条件则有可能传输额外的FILL字节用作填充1.时间戳Timestamp Field用于传输时间信息可选项长度可能为字节。1.数据域如果是CTO数据字段由不同的特定参数组成如果是DTO的DAQ模式数据来自从机的测量值如果是DTO的STIM模式数据来自master。发送STIM数据不是标定奥实时为ECU注入数据可以是模拟某个传感器的值观察ECU的反应。 DTO可以分为两种形式DAQ同步传输数据包这种测量实时性高STIM同步激励数据主机下发给从机。CTO理由也有测量0xF4这个测量是一问一答的测量实时性差属于异步polling。2.CTO命令传输对象CTO的帧结构PID里的CMD数字几表示什么意思后面的DATA应该怎么填去看协议XCP -Part 2- Protocol Layer Specification3.DTO数据传输对象DTO的帧结构DTO帧结构排列组合的结果就比较多了。就Identification域来说①绝对ODT编号PID位置放ODT编号②相对ODT编号PID一字节DAQ编号③PID两字节DAQ编号④数据有对齐要求用FILL占位PIDFILLDAQ。时间戳域①可以配置为没有时间戳②占1字节③两字节④四字节。4.测量和标定首先肯定是建立主机和从机的连接这个不管是UDS、CCP还是XCP我感觉都大同小异。什么连接、握手、互通信息、有密钥的在seed key一下具体不说了流程应该一搜就大把大把。4.1标定标定就是把数据下载到ECU的内存里那首先就是得开辟一个地址放数据然后开始传数据。开辟地址命令 PID0xF6 Set Memory Transfer Address in slave这条命令设置了一个起始地址要传输的数据都从这个地址往后放。传输标定数据 PID0xF0 Download from master to slave如果从机不支持块传模式则下载所有的数据都只能在一条报文里。因此第二个字节的数据长度就只能在[1,MAX_CTO-2]范围内。如果超出这个范围从机返回ERR_OUT_OF_RANGE.MAX_CTO 是CTO包的最大长度这个和底层传输协议有关CAN的话就是8.减去的2分别是PID0xF0和表示数据长度的两个字节。如果从机支持块传那下载的数据就可以分为多个传输命令数据包。但是从机一次能接收的数据包长度也是有限制的MAX_BS是从机能接受的最大数据包数。AG表示地址颗粒度是地址的最小长度即每个element占几个字节变量又由element组成可能一个可能多个。AG要填充对齐即数据开始的字节得是AG的整数倍。AGAddress Granularity表示数据元素ELEMENT的字节大小大小是固定的在A2L文件中有体现。我理解这个值也是地址的最小间隔所以被称为地址粒度。变量由数据元素组成而数据元素的大小由 AG 固定。 而这条报文的第二个字节里放的Number of data elements[AG]元素的个数计算方法是数据长度AG单位是个。而不是单位为的数据长度。4.Polling轮询测量一问一答的形式主机请求了从机才回复。比如主机想要知道变量A的值。从A2L文件得知A变量在ECU中的地址通过发送含有地址的命令获取数据从机做应答将数据传给主机如此不断的重复。请求数据很长一条报文放不下command code用0xF5一条报文能放下的command code用0xF4.下图就是主机使用0xF4读取数据的过程。0xF4 命令码 0x04 读取元素个数4个AG1时个数和byte数相等 0x00 扩展地址 0x2C 00 1C 00地址是0x1c002c。 即从0x1C002C的地址处开始读数据读4*AG个字节的数据。回复FF表示肯定响应因为AG为1不用对齐反馈的数据是0x00 0x00 0xE0 0x404.3同步测量polling主机决定了测量时间而同步则是ECU确定了测量时间。主机先指定要取出数据的地址从机在得到同步测量开始命令后使用DTO发送到主机。所以同步测量不是一问一答的形式是配置完成后通过测量周期或是事件由从机主动发送给主机。总结提示这里对文章进行总结