浅浅学:XCP协议原理及应用
XCP是“通用测量和校准协议”,其中X代表传输层协议,XCP实际上是继承自CCP,CCP基于CAN总线的测量和校准协议。所以X当前可以当CAN也可以当Eth还有其他总线。
XCP采用主从架构(Master-Slave)进行通信。在该架构中,ECU作为从设备(Slave),而测量与校准工具则作为主设备(Master)。从设备在同一时刻仅能与一个主设备进行通信,而主设备则具备同时与多个从设备通信的能力。
XCP的一个核心功能是,它可以对Slaver的内存进行读写访问。
它的意义在于能够在开发和调试测试阶段帮助工程师实时获取设备内的运行状态。而不需要再去搭建调试环境或者链接debug板这种情况
简单来讲XCP功能可以概括为以下几个方面
CTO功能:
以问答的方式执行,master发送一个command,slaver对对应的command做一个响应
DTO功能:
DAQ功能是数据的自动采集,举个栗子,正常情况下在CTO模式下我要获取100个变量的值,那么我要来回通信200次,这对带宽影响很大,同时时间也不可控,因为我cto的时机是由master决定的。
而DAQ模式更像是一种发布订阅的模式。master 发送一组变量地址。并指定这些变量的触发方式(通常和slaver中的某些事件关联)当slaver中的对应事件触发时,slaver会主动将变量发送给master。
DAQ又分动态和静态,动态情况,用户可以再调试阶段随便添加要观测的变量给到slaver。而静态则需要slaver提前定义好要观测的变量表,master只需要指定哪个表即可。
STIM是一种bypass功能,主要用于模拟注入。比如在我缺少真实世界的输入时,可以通过stim注入数据,这样slaver中相应的算法可以拿到这个值来模拟实际工作时的响应
以下简要介绍XCP报文的组成
XCP协议层
XCP数据以消息的方式在Master和Slaver之间进行交换。整个“ XCP消息框架”嵌入到传输层的框架中( 以UDP报文为例)。框架由三个部分组成:XCP Header,XCPData 和XCP Trail。在下图中,一部分消息以红色显示。它用于发送当前的XCP帧。 XCP标头和XCP尾部取决于传输协议。
XCP数据包本身与所使用的传输协议无关。它总是包含三个组件:“标识字段”,“时间戳字段”和 当前数据字段“数据字段”。每个标识字段始于数据包标识符(PID),该标识符(PID)标识数据包 。
通过XCP数据包进行通信分为一个区域以进行命令(CTO),一个以发送同步数据(DTO)的区域。
- CMD (Command Packet): Transmits commands to the device.
- RES (Command Response Packet): Indicates a positive response to a command.
- ERR (Error Packet): Represents a negative response or error condition.
- EV (Event Packet): Asynchronously notifies of events.
- SERV (Service Request Packet): Initiates a service request.
- DAQ (Data Acquisition Packet): Periodically sends measured values.
- STIM (Stimulation Packet): Periodically stimulates the slave device.
通过CTO(命令传输对象)交换命令。例如,Master以这种方式启动对话。Slaver须始终用RES或ERR 响应CMD。 其他CTO消息是异步发送的。 数据传输对象(DTO)用于交换同步测量和刺激数据。
交换消息时,master和slaver都必须能够确定消息类型。这是在标识字段中完成的。这就是为 什么每个消息从数据包标识符(PID)开始的原因。 在传输CTO时,PID字段足以识别CMD,RES或其他CTO数据包。从master到slaver从0xc0到0xff的命令。 XCP从从0xFC到0xFF的PID响应或通知主。这导致PID对单独发送的CTO进行独特的 分配。当传输DTO时,使用了标识字段的其他元素
DTO数据包使用时间戳,但这在传输CTO消息时不可能。从slave使用时间戳记用测量值提供时间信息 。 也就是说,master不仅具有测量值,而且具有获取测量值的时间点。测量值到达master的时间不再重要,因 为测量值和时间点之间的关系直接来自从属
最后,XCP数据包还包含存储在数据字段中的数据。对于CTO数据包,数据字段由不同命令的特定参 数组成。 DTO数据包包含从从服务器中的测量值以及在向master发送数据时的值。
CTO
CTO用于将两个命令从master传输到slave,并从slave到master
XCP命令结构
slave从master那里接收命令,必须给mster一个响应。结构在这里始终相同:
特定参数也可以作为补充信息传输,而不仅仅是具有正面响应的负面响应。
模式00表示master希望XCP与slave通信。如果主机在建立连接时使用0xFF 0x01,则master请求XCP与slave 进行通信。同时,它告知slave,它应该切换到特定的 - 用户定义的模式。
slave的积极反应可以采用更广泛的形式。建立连接时,slave将已将通信特定信息发送给master。例如, 资源是slave提供的信息,即它是否支持页面切换之类的功能,还是在XCP上闪烁。借助MAX_DTO,slave将其支持的最大数据包长度告知master数据包长度,以转移测量值等。
以下是实际开发中XCP交互的流程