先回顾下XCP和CCP的关系:XCP的前身叫做CCP(CAN Calibration Protocol),是一种仅针对CAN接口的测量标定协议。随着整车网络需求的不断发展,ASAM在CCP协议的基础上,又提出了XCP协议标准,能够适配多种网络传输协议和总线类型。所以可这样理解:XCP协议是CCP的升级版本,对CCP进行了扩展与补充。XCP相比CCP最大的升级是XCP能够适配多种网络传输协议和总线类型而不再仅限于CAN总线。1 XCP 概述
XCP的全程是Universal Measurement and Calibration Protocol(通用测试和标定协议),其中X代表不同的传输层上传输,例如CAN/CAN FD、Ethernet、FlexRay、SCI、SPI、USB,可以通过不同类型的总线测量和标定ECU内部参数。从OSI模型来理解XCP是什么。XCP协议被设计在OSI参考模型的框架内运行,XCP协议运行在OSI模型的传输层之上,它可以在各种物理层和相应的传输协议上运行,本质上与传输无关。XCP协议的应用层定义了用于测量和标定操作的特定命令、数据结构和协议,这一层是实现 XCP协议核心功能的地方。source: https://www.embien.com/automotive-insights/unveiling-the-xcp-protocol
再结合AUTOSAR架构来理解XCP是什么。AUTOSAR XCP模块位于总线接口之上,基于以太网的XCP,XCP模块应位于Socket Adaptor(SoAd)之上。基于CAN的XCP,XCP模块调用CanIf_Transmit()传输XCP数据,基于FlexRay的XCP则调用 FrIf_Transmit(),以此类推。source:https://www.linkedin.com/posts/ahmed-mounir-37979415b_how-the-xcp-is-managed-in-the-autosar-architecture-activity-7073763671646048256-BNNl
因此要了解XCP是什么,可以从两点入手,一个XCP的通讯数据,另一个是XCP的工作原理。
对于XCP的通讯数据,以基于CAN的XCP为例,关键点在XCP CAN帧,即XCP Packet。
source:https://www.canfd.net/xcp.html对于XCP的工作原理,可通过AUTOSAR XCP模块支持的基本功能先稍作了解:- 同步数据采集:XCP从机将收集测量参数的值,然后将这些值保存在缓冲区中并将它们发送给 XCP主机。
- 静态和动态 DAQ 配置:XCP主机能够通过测量工具动态调整DAQ列表,另一种类型是静态DAQ,它在ECU中有一个永久定义的列表。
- 标定(CAL):可以配置RAM的某些区域,以便在运行时使用XCP对其进行修改。
关于XCP实现的代码可参考:https://github.com/Sauci/Xcp。
接下来本文就针对第一点展开详细介绍。
2 XCP 数据包
XCP采用一主多从的通信模式,单个主机可以同时与多个从机通信。
source: XCP_Book_V1.5_EN.pdf
XCP是一种请求响应协议,主机向从机发送请求数据包,而寻址的从机则以响应形式进行应答。就响应行为而言,它支持 3 种操作模式:在标准模式时,每个请求都会有响应;块模式允许对单个请求进行多次响应,并优化下载/上传操作;可选的交错模式允许一对一请求响应,尽管多个请求的响应可以延迟和交错,如下所示:
source: https://www.embien.com/automotive-insights/unveiling-the-xcp-protocol主机通过下发命令与从机建立连接,解锁,读取数据,修改参数等操作,以"XCP数据包”的数据对象形式传输。XCP支持两种类型的数据包:命令传输对象(CTO,Command Transfer Object)和数据传输对象(DTO,Data Transfer Object)。source:https://www.embien.com/automotive-insights/unveiling-the-xcp-protocol这里先不分开介绍CTO和DTO, 直接先看XCP数据包。XCP数据包由三个部分组成:XCP头、XCP包和XCP尾。XCP头和XCP尾依赖于传输协议,在TCP/UDP协议中为控制字节,在CAN传输时直接忽略。
source: XCP_Book_V1.5_EN.pdfXCP包的结构独立于所使用的传输协议。XCP报文由“标识字段”、可选的“计数器字段”、可选的“时间戳字段”和“数据字段”组成。1)标识字段
source: XCP_Book_V1.5_EN.pdf
当主从机交换数据包时,主从双方通过标志字段来识别对方发送的信息,每个数据包都以报PID开头。当发送CTO时,PID字段完全足以识别CMD、RES或其他CTO数据包,主到从的命令使用从0xFF到0xC0的PID,从到主使用0xFF到0xFC的PID,这意味着在每种情况下,对发送的CTO有唯一的PID分配,如下所示:source: XCP_Book_V1.5_EN.pdf
如果发送DTO,情况会更为复杂,一种是传输类型为“绝对ODT编号”,其中ODT列表#在所有DAQ列表中都是唯一的,PID(即ODT#)足以全局识别ODT列表。“
source: XCP_Book_V1.5_EN.pdf另一种传输类型为”相对ODT编号和绝对DAQ列表编号“。比如可能有两个PID=0x00的ODT列表,这意味着它们无法唯一标识,因为CAN ID在两个DTO中是相同的。此时可以在CAN帧有效负载的第2到第3个字节中添加1或2字节DAQ列表,这样就可以再次唯一地标识特定的ODT列表。source: XCP_Book_V1.5_EN.pdf
如果3个字节还不够,那么再加一个填充字节FILL来解决。
source: XCP_Book_V1.5_EN.pdf
DTO数据包可以选择性地包含计数器字段。如果存在,计数器字段直接位于标识字段之后,如果在传输DAQ数据包时使用了计数器字段,XCP从机会在DAQ列表的第一个ODT报文中插入一个计数器,插入哪个计数器是为其配置此DAQ列表的事件的属性。source: XCP_Book_V1.5_EN.pdf3)时间戳字段
传输时间戳信息,Timestamp数据长度为1~4个字节,在CAN通信中可以直接忽略。source: XCP_Book_V1.5_EN.pdf
4)数据字段
实际数据在数据字段中传输,用作CAN通信时,长度为0~7个字节。在CTO数据包的情况下,数据字段由不同命令的特定参数组成。DTO数据包包含来自从机的测量值,在发送STIM数据的情况下,包含来自主机的值。source: XCP_Book_V1.5_EN.pdf3 XCP的CTO和DTO
- CMD:控制命令。PID范围为0xC0~0xFF,主机向从机发送的命令请求,从机按照该编号执行相应命令,其数据结构如下所示:
source: XCP_Book_V1.5_EN.pdf不同PID代表不同的命令,这些命令分为:标准、标定、页面、编程、调试和DAQ命令等。source: XCP_Book_V1.5_EN.pdf- RES:命令响应,PID=0xFF,从机接收到主机的CMD后,成功执行命令,并且向主机返回命令响应数据包,其数据结构如下所示:
- ERR:错误响应,PID=0xFE,从机接收到主机的CMD后,执行命令时发生错误,从机向主机返回错误响应数据包,其数据结构如下所示
- EV:报告事件,PID=0xFD,当从机发现自身出现了异常的事件时,从机会主动向主机发送报告事件数据包,其数据结构如下所示。
- SERV:请求主机执行服务,PID=0xFC,当从机需要主机执行某些服务是时,从机会主动向主机发送请求主机执行服务数据包,其结构如下所示
数据传输对象DTO包含2种形式:
DAQ:传输同步数据包,在DAQ模式下,从机周期性上传数据。这种通讯方式分为两个阶段:在初始化阶段,主机通知从机在不同的事件中应该发送哪些数据;在此阶段之后,主机触发从机的测量,然后开始测量阶段,从这一点开始,从机向主机发送所需的数据,主机只“监听”,直到它向从机发送“测量停止”。测量数据采集和发送的触发由控制单元中的事件完成。
STIM:同步激励数据,在DAQ模式下,主机周期性的向从机下载数据。这种通讯方式也分为两个阶段:在初始化阶段,主机告诉从机它将向从机发送哪些数据。在此阶段之后,主机将数据发送到从机,STIM处理器存储数据。一旦在从机中触发相应的STIM事件,数据就被传输到应用程序的内存中
综上,就构建起了对于下图所示的这些概念的理解,XCP协议同时支持同步和异步串行接口,XCP不仅可以通过以太网或CAN作为传输介质,还可作为模拟测量设备的标准化接口,以及作为硬件接口转换器到RAM仿真器、JTAG或其他微控制器诊断用调试接口。source: XCP_Book_V1.5_EN.pdf接下来以XCP on CAN为例,通过XCP实际通讯的数据包来理解上述内容。4 结合实际应用解析XCP命令
首先需要使主机与总线上的从机建立逻辑连接,才能与其开始通信。source: XCP指令详解 - fzxhub docs- RESSOURCE参数:CAL/PAG、DAQ、STIM、PGM = 1 表示该资源可用,反之不可用。
ADDRESS_GRANULARITY_1、ADDRESS_GRANULARITY_0:00:ADDRESS_GRANULARITY=BYTE AG=1
01:ADDRESS_GRANULARITY=WORE AG=2
10:ADDRESS_GRANULARITY=DWORD AG=4
11:ADDRESS_GRANULARITY=保留 AG=保留
SLAVE_BLOCK_MODE参数:
OPTIONAL参数:
1:表示支持类型的附加信息的通信模式
0:表示不支持类型的附加信息的通信模式
- MAX_CTO参数:最大CTO大小,单位为字节。- MAX_DTO参数:最大DTO大小,单位为字节。假设主机发送到从机的CAN ID是“1”,从机发送到主机的CAN ID是“2”。在这种情况下,XCP通信按以下顺序执行:- 主机发送的CAN ID为“1”,第1个字节指定为“0xFF”(命令“CONNECT”),第2个字节指定为“命令参数”。
- 从机接收第1行的连接命令,并通过PID识别该命令。
- 从机发送的CAN ID为“2”,第1个字节指定为“0xFF”,第2个字节开始指定为“应答值”。
source:http://download.vector-japan.co.jp/portal/medien/cmc/beginners
如果主机使用CONNECT命令连接一个新的从机,则与当前从机的连接会暂时断开。如果使用CONNECT命令连接一个已处于连接状态的从机,则该从机返回一个确认信息。只有当某个从机被正确连接后,该从机才会对主机发出的CTO命令做出响应。2 标定,SET_MTA和DOWNLOAD
SET_MTA将内存初始化一个指针(32位地址+ 8位扩展)转移指令,如下定义:
source: XCP指令详解 - fzxhub docs
CMD中包含的指定长度(大小)的数据块从MTA开始将被复制到内存,MTA将按数据数量后增加。source: XCP指令详解 - fzxhub docs
如果从机不支持块传输模式,则下载的所有数据都是单个命令包中传输。因此,数据元素的数量参数请求中的值必须在[1..MAX_CTO-2]范围内。如果数据元素个数大于MAX_CTO-2,则返回ERR_OUT_OF_RANGE;如果从机支持块传输模式,则下载的数据将分多个传输命令数据包。对于从机,可能存在关于最大连续命令包(MAX_BS)。因此数据元素个数(n)的取值范围为[1..min(MAX_BS*(MAX_CTO-2)/AG,255)]。主机必须连续传输(n * AG / (MAX_CTO-2)) - 1个DOWNLOAD_NEXT命令包。从机将只回复最后DOWNLOAD_NEXT命令包。命令包之间的分离时间在CONNECT的响应中指定最大数据包数(MAX_BS, MIN_ST)。
标定是为了重写ECU内部软件中的参数,而从主机发送指定XCP地址的命令和重写数据的命令,从机会对应的导出适当的参数地址、执行重写,并返回一个应答。下图所示的是根据XCP主机发送的XCP扩张地址“0”、XCP地址“0x0041D5C8”,将该地址开始的2字节的参数,重写为“0x0064”。
source:http://download.vector-japan.co.jp/portal/medien/cmc/beginners3)异步测量,SHORT_UPLOAD
XCP除了同步测量,还可以做异步测量。异步测量是使用主机发送的命令,通过指定的XCP地址来提取从机的ECU内部的数据,并通过从机的应答将该数据传送给主机,如此循环往复来实现的。为了取出数据,使用PID为“0xF4”的命令“SHORT_UPLOAD”。这个命令和应答的格式如下所述:
source: XCP指令详解 - fzxhub docs
SHORT_UPLOAD命令:
SHORT_UPLOAD应答:
下图是主机使用“SHORT_UPLOAD”,在XCP扩展地址为“0”、XCP地址为“0x00124A5C”的位置,每100ms取出4字节的过程的数据。
source:http://download.vector-japan.co.jp/portal/medien/cmc/beginners4)同步测量,START_STOP_SYNCH
在上述异步测量的情况下,主机决定了测量时间。为了使测量与ECU的控制相匹配,有必要由ECU确定测量时机,并在数据取出来后由从机发送到主机。这种数据通信是通过DTO来完成的。主机在进行同步测量之前,通过命令指定要取出的数据的XCP地址,从机在等到同步测量开始命令后,使用DTO发送到主机。因此,在同步测量的情况下,不是通过命令和应答的组合,而是通过测量周期或事件,由从机发送DTO报文到主机。START_STOP_SYNCH用于同步启停数据的传输采集列表。所有的DAQ列表或仅到选定的列表(以前配置为START_STOP_DAQ_LIST(选择))。从设备必须重置DAQ表的SELECTED,在成功执行START_STOP_SYNCH后。source: XCP指令详解 - fzxhub docs
下图是由“START_STOP_SYNCH”命令开始的测量同步,从机持续地将测量数据通过DTO报文发出,直到收到“START_STOP_SYNCH”命令才停止的实际的数据。source:http://download.vector-japan.co.jp/portal/medien/cmc/beginners以上通过对XCP数据包的解释,希望大家在看到下面trace数据时,对这些数据有一些概念,同时有思路去搞懂它们,如果更进一步,那么就回到第二点:XCP的工作原理。
[1] https://blog.csdn.net/nibiewuxuanze/article/details/78856714
[2] XCP指令详解 - fzxhub docs
[3] https://www.canfd.net
汽车研发交流群,有兴趣的朋友请添加群主:prOmiseyes,备注:公司+职务入群。仅限汽车从业人员。