XCP协议基础
前言
本文参考了以下两篇大佬的文章
标定协议原理
为什么需要标定协议
现在一款汽车、机械臂。要有灵魂动起来,主要有机械运动部分、电子控制硬件部分、电子控制软件部分。软件部分又分为软件、和参数。比如车型A,区分高、中、低三个配置,但是其实不管是硬件还是内部代码基本都一样,不一样的是一些车型参数或者配置字。通过标定就能实现车型配置的切换,体现不一样的系统性能
标定协议是汽车控制在编写程序后,部分功能实现的部分参数是需要在实车上才能确定的,当然在实车上调试过程中也需要监测一些数据才能进行调试工作
在一些需要调试较少的系统中,可以一边调试一边优化参数重新下载程序。对于汽车这样复杂系统就变得不可能。因此诞生一种标定系统。程序工程师将程序编写架构搭建好,在编程过程中需要预知那些参数需要标定(实时修改),那些变量需要观测(实时查看)。系统程序搭建好后,标定工程师即可在实车上实时查看、调试控制器。因此诞生一种标定协议
标定协议的底层实现
汽车控制器程序本质运行在SOC(系统级芯片)上,为了性能和稳定性是无GUI的。因此需要将标定工程师手中的PC作为标定的输入和输出。标定中需要实时和友好的标定软件(电脑端软件)通信。在汽车中广泛存在CAN控制器域网。自然首要选择它作为标定的通信通道
汽车控制器的SOC使用C语言。C代码中的参数值可以在RAM(初始值本质在ROM)中,或者ROM中。我们需要标定的参数如果当变量保存在RAM中,则修改后掉电就会恢复为初始值;如果存储在ROM,则不能对其进行修改
因此大佬们想了一个办法,标定的参数在SOC上存储两份,RAM、ROM中各一份。当汽车控制器上电是将ROM标定区的数据搬移到RAM标定区,程序运行时使用RAM标定区的参数,标定过程中就能实时修改RAM标定参数,当标定参数确定以后,将RAM标定区数据拷贝到ROM标定区,这样下次上电则是最新的标定参数
当然仅仅只支持标定软件监测的参数(观测量)直接是定义在RAM中的变量,用来实时存储程序运行的部分参数并支持发送给标定软件即可,也不关心存放在ROM的初始值
标定协议规范
ASAP标准
ASAP是几家德国汽车制造商联手一些著名的汽车电子设备制造商于1991年成立了ASAP标准组织, ASAP的英文全称是The working group for thestandardization of applicationsystems(应用系统标准化工作小组),它的目标是使在汽车电子设备研发过程中相关的测试,标定,诊断方法及工具能够兼容并互换
ASAP3是应用系统,即测试,标定,诊断系统(MCD Measurement, Calibration, Diagnosis System)到自动化系统的接口规范。这里的自动化系统可以是一个测量仪器的指示装置或汽车的燃油测量装置等
ASAP2又称为ASAP描述文件,是控制单元内部数据描述文件的规范。 ASAP2文件用来具体描述电子控制单元内部的数据信息,包括数据存储的规范,数字量到物理量的转换规范等
ASAP1是控制单元到MCD系统的接口规范,ASAP1规范又细分为ASAP1b与ASAP1a。ASAP1b接口下包括一个符合ASAP标准的驱动程序,硬件接口及电子控制单元。因此ASAP1b接口规范保证了MCD与ECU之间的通信,不受所选通信媒介及不同ECU供应商的限制。其中ASAP1a是到ECU端的数据通信的物理及逻辑接口规范,包括通过CAN总线对ECU进行标定的协议规范
ASAM标准组织及其规范
1998年ASAM小组成立,其英文全称是Association for Standardization of Automation and Measuring System(自动化及测量系统标准化小组)。ASAM标准是ASAP标准的扩展和衍生,在新的ASAM标准中,ASAP标准 变名为ASAM MCD(ASAM Measurement, Calibration and Diagnosis),原来的ASAP1、ASAP2、ASPA3规范在新的标准下分别为ASAM-MCD 1MC、ASAMMCD 2MC、ASAM-MCD 3MC
XCP协议剖析
XCP协议背景
CCP协议是基于CAN的标定协议,随着发展标定不再满足于CAN通信,因此发展出XCP来支持CAN、USB、TCP/IP、UDP/IP。它与CCP具有渊源
XCP提供以下基本功能:
- 同步数据采集
- 同步数据激励
- 在线内存校准(读/写访问)
- 校准数据页面初始化和切换
用于ECU开发的FLASH编程
XCP提供以下可选的功能:
各种传输层(CAN、以太网、USB、…)
- 快通信模块
- 交错通信模块
- 动态数据传输配置
- 时间戳数据传输
- 数据传输同步
- 数据传输的优先级
- 原子位修改
- 按位数据刺激
与CCP2.1相比,XCP改进了以下功能
- 兼容性和规范
- 效率和吞吐量
- 开机数据传输
- 数据页面冻结
- 自动配置
- 闪存编程
XCP根据以下原则设计的:
- 最小的从资源消耗(RAM、ROM、运行时资源)
- 高效的通信
- 简单的从设备实现
XCP消息帧结构说明
所有XCP通信都作为称为XCP数据包的数据对象传输。 有2种基本的数据包类型:
1.用于传输通用控制命令的数据包:CTO
用于执行协议命令(CMD)
传输命令响应(RES)
错误(ERR)数据包
事件(EV)数据包
服务请求数据包(SERV)
2.用于传输同步数据的数据包:DTO
- DTO(数据传输对象)用于传输同步数据采集数据(DAQ)和传输同步数据刺激数据(STIM)
XCP协议的帧格式
1.XCP帧格式由头部、数据包、尾部组成,头部尾部根据协议在不同通信方式上有所区别
2.XCP数据包包含协议的通用部分,独立于使用的传输层
3.XCP数据包由标识字段、可选时间戳字段、数据字段组成
4.CAN上的XCP来说,XCP Header和XCP Tail是不需要的
头部尾部
头部尾部根据协议在不同通信方式上有所区别
标识字段
XCP数据包基本上总是以标识字段开头,该字段作为第一个字节包含数据包标识符(PID)
主设备到从设备的标识字段
Master->Slave (上位机到下位机)总共0xFF条
- 名称 PID范围
- CMD 0xC0~0xFF 指的是上位机下发给下位机的一些命令,比如连接命令FF,解锁,获取状态、下位机交互的命令
- STIM 0x00~0xBF 可以理解为一种上位机向下位机大量发数据的一种方式,相当于反向的DAQ(数据采集)
从设备到主设备的标识字段
Slave ->Master(下位机到上位机)总共0xFF条
- 名称 PID范围
- Response 0xFF 肯定应答,指的下位机答复上位机的命令
- Error 0xFE 否定应答上位机的命令
- Event 0xFD 事件,指下位机发生某事件时通知上位机
- Service 0xFC 指下位机在某些情况下,需要上位机执行一些动作,你可以理解为请求上位机服务
- DAQ 0x00~0xFB //ODT的序号 很显然,就是下位机上传数据给上位机
数据段
1.对于CTO数据包,数据字段包含不同类型的CTO数据包的特定参数
2.对于DTO数据包,数据字段包含用于同步获取和激励的数据
CTO
CTO(Command Transfer Object)用于传输通用控制命令
1.识别字段仅由PID组成,其中包含CTO数据包代码。时间戳字段不可用
2.数据字段包含不同类型的CTO数据包的特定参数
CMD
CMD(Command Packet)的PID包含0xC0 <= CMD <= 0xFF范围内的代码。所有可能的命令代码都在命令代码(CMD)定义
RES
RES(Command Response packet)PID包含命令正响应包代码RES = 0xFF。如果命令成功执行,RES将作为CMD的回复发送
ERR
ERR(Error packet)的PID包含数据包代码ERR = 0xFE。如果命令未成功执行,ERR将作为CMD的响应发送。第二个字节包含错误代码。后续定义了错误代码
EV
EV(Event packet)的PID包含数据包代码EV = 0xFD。如果从设备想要报告异步事件包,则发送EV。第二个字节包含事件代码。后续定义了事件代码。实现是可选的。从设备发送到主设备的事件数据包无被确认回复,因此不能保证传输
SERV
SERV(Service Request packet)的PID包含请求包代码SERV = 0xFC。SERV要求主设备执行一些操作。第二个字节包含服务请求代码。可能的服务请求代码在后续定义
DTO
DTO用于传输同步数据采集数据(DAQ)和传输同步数据刺激数据(STIM)
Identification Field:可以根据PID来判断帧的DTO类型,其中包含的信息为Absolute ODT Number或者Relative ODT Number,长度固定一个字节;当采用Absolute ODT Number时,每个ODT的编号在A2L文件中都是固定的,依次递增;当采用Relative ODT Number时,每个ODT仅代表当前DAQ LIST内的ODT编号。同时增加Absolute DAQ list Number进行区分。若XCP有字节对齐要求,则需添加一个FILL来进行字节对齐
Timestamp:在主从结点间的通信中,如果因为加入网关而造成时间差,又或者因为使用无线通信,使得通信时间出现波动的情况下,同步测量中的测量时间对于主结点来说是“不确定”的。为了防止这种情况,要使用“带时间戳的DAQ”。在从结点侧,包含测量时间的时间戳的DAQ,通过DTO报文传送给主结点。而收到这个报文的主结点,可以读出所添加的时间戳来知道正确的测量时间。主节点可通过SET_DAQ_LIST_MODE命令来开启和关闭TS,如果从节点的TIMESTAMP_FIXED flag为1(主节点可通过GET_DAQ_RESOLUTION_INFO获取),则代表主节点不可以设置TS,TS的长度可以是1,2,4字节
DAQ
ECU向上位机发送数据,实现数据采集
PID包含0x00 <= DAQ <= 0xFB范围内的(绝对或相对)ODT数。ODT编号是指对象描述符表(ODT),该表描述了剩余数据字节中包含哪些数据采集元素
每个ODT即是一帧CAN报文;应用中希望一个周期内采集非常多的数据(超过一帧),那么就需要把多个ODT组合起来,这种组合在XCP中称为DAQ LIST;ODT由ODTENTRY组成;ODTENTRY里存放的是数据地址与长度;DAQLIST里的ODT数量由slave决定;由于一个ODT即一个CAN报文,那么ODT里的所有ODTENTRY的数据地址加起来不能超过7
STIM
上位机向ECU发送数据,实现数据的刷新,用于数据标定时,上位机向下位机修改参数
PID包含0x00 <= STIM <= 0xBF范围内的(绝对或相对)ODT编号。ODT编号是指相应的对象描述符表(ODT),该表描述了剩余数据字节中包含哪些数据刺激元素
相关代码
错误代码
事件代码
下表中的事件数据包代码可以作为PID = 0xFD的异步数据包发送。实现是可选的。从设备发送到主设备的事件数据包不被确认,因此不能保证传输
服务代码
下表中的服务请求数据包代码可以作为PID = 0xFC的异步数据包发送。对于从设备来说,实现是可选的,但对于主设备来说是强制性的。从设备发送到主设备的服务请求包不被确认,因此不能保证传输
命令代码
CMD-STD(标准命令)
CMD-CAL(标定命令)
CMD-PAG(页切换命令)
CMD-DAQ(数据采集命令)
CMD-PGM(储编程命令)
网络和传输方式
在网络上,只要能区分“从主结点发送到从结点”和“从从结点发送到主结点”,这两种类型的通信,就能够使用XCP。在“XCP on CAN”的情况下,是通过用两个CAN ID,“从主结点发送到从结点的ID”和“从结点发送到主结点的ID”进行区分。在网络上使用区分的通信并传输一些内容时,XCP使用了三种传输模式
标准传输模式:
在标准通信模型中,对从机的每个请求都有一个响应。除了 XCP 在 CAN 上,不允许多个从机对主机的命令做出响应。因此,每条 XCP 消息总是可以追溯到一个唯一的从机。这种模式是通信中的标准情况
块传输模式:
块传输模式是可选的,可以节省大量数据传输(例如上传或下载操作)的时间。尽管如此,在这种模式下,性能问题必须朝着从机的方向考虑。因此,必须保持两个命令之间的最小时间,命令总数必须限制在最大值的上限
交错传输模式:
交错模式也是出于性能原因而提供的,在典型通讯模式中,主机在收到上一条指令的回复前不会发送下一条指令,为提高通讯的效率,交错通讯模型可以不等待回复直接再发送下一条指令。但是这种方法也是可选的,并且与块传输模式相反,它在实践中没有相关性
XCP测量
按测量方式可分为异步测量与同步测量
异步测量(Poling)
Poling不是基于DTO,而是基于CTO,对需要采集的变量进行挨个轮询;主站可以使用SHORT_UPLOAD命令从从站请求测量参数的值。这称为轮询;这是最简单的测量情况:在已接收并执行SHORT_UPLOAD命令时发送测量参数的测量值
异步测量是使用主结点发送的命令,通过指定的XCP地址来提取从结点的ECU内部的数据,并通过从结点的应答将该数据传送给主结点,如此循环往复来实现的
Poling模式特点
1.Poling模式下的时间戳机制不能使用
2.不同测量值时间上没有一致性
3.包含2条报文(上位机请求和Slave响应),影响总线负载率
DAQ测量
为了使测量与ECU的控制相匹配,有必要由ECU确定测量时机,并在数据取出来后由从结点发送到主结点。这种数据通信是通过DTO来完成的
主结点在进行同步测量之前,通过命令指定要取出的数据的XCP地址,从结点在等到同步测量开始命令后,使用DTO发送到主结点。因此,在同步测量的情况下,不是通过命令和应答的组合,而是通过测量周期或事件(用来触发DAQ-list的事件在XCP中被称为Event channels),由从结点发送DTO报文到主结点
每个事件周期(Event)可对应多个DAQLIST,一个DAQ包括多个ODT List,一个ODT包括多个变量
DAQ基本原理
静态DAQ
静态DAQ LIST:DAQ LIST和ODT表在ECU中是被永久固定的;通过A2L文件,上位机能够获取DAQList中的信息
动态DAQ
动态DAQ分配过程
动态DAQ列表配置使用FREEDAQ、ALLOC_DAQ、ALLOC_ODT和ALLOC_ODT_ENTRY命令依次完成。这些命令允许在上述限制范围内动态分配多个DAQ列表、多个ODT到DAQ列表以及多个ODT LIST到ODT。如果没有足够的内存来分配请求的对象,这些命令会得到一个ERR_MEMORY溢出作为负响应。如果发生错误内存溢出,则完整的DAQ列表配置无效
XCP标定
参考页(Reference Page):可以理解为定义的逻辑地址对应Flash上的一块地址,参考页的属性在标定过程是可读不可写
工作页(Working Page):可以理解为定义的逻辑地址对应RAM上的一块地址,工作页的属性是可读可写
激活页(Activiting Page):就是指选择激活的一个页,比如激活工作页或者激活参考页等
标定过程:激活参考页(仅可读),读取当前的参数,比如PID中的比例因子 P,然后切换激活页,激活工作页(可读可写),可以在工作页在线修改参数,来获得较好标定值,最后,需要将优化后的P参数写入到原来参考页上,这样就完成了一个参数的标定
地址映射
硬件映射
有些芯片是支持硬件地址映射的,比如英飞凌TC系列,其工作方式比较简单,就是在切换激活的工作页时,通过操作寄存器完成地址映射
如当寄存器Reg1 = 0时,激活页是参考页,逻辑地址0x000~0x200 对应的Flash中的0x100~0x300
切换激活页为工作页时,寄存器Reg1=1,对应逻辑地址0x000~0x200 对应Ram中的0x000~0x200
软件方式(OFFSET偏移)
通过加入一个offset偏移量来实现,还是以上面的例子为例:
激活页->参考页
逻辑地址 0x000~0x200 -> Offset=0x100 Flash地址0x100~0x300=(逻辑地址+Offset)
激活页->工作页
逻辑地址 0x000~0x200 -> Offset=0x000 Flash地址0x000~0x200=(逻辑地址+Offset)
TC3xx系列Overlay
将数据访问从原始目标内存(“目标Flash地址”)重定向到Overlay内存(“重定向地址”)的原理如下所示:
数据访问Overlay使用Overlay范围(“Overlay Blocks”)定义。每个Overlay Block定义一个地址空间的连续范围,访问被重定向到该范围。每个Overlay Block都配置有以下内容参数:
- Overlay Block目标Base地址-要重定向的目标地址范围的起始地址
- Overlay Block大小-要重定向的地址范围的大小
- Overlay Block重定向Base地址-重定向的起始地址
在AURIX TM中,每个TriCore实例最多可使用32个Overlay范围。Overlay内存Block的大小可以是2nx32字节,n=0到12。这使Block大小的范围从32字节到128 KB;每个Overlay Block有3个相关寄存器,用于独立配置这些参数。Overlay参数的配置如下所示:
- 目标Base地址在OTARx寄存器中进行配置
- OverlayBlock大小用OMAKX寄存器进行配置
- 重定向Base地址使用RABRx寄存器进行配置
A2L文件解析
A2L文件说明
A2L 文件包括:设备参数信息、接口数据信息和 ECU 参数信息
1.设备参数信息: 描述了 ECU 的基本信息和 ECU 数据单元的一些公共属性
2.接口数据信息: 描述了标定系统与 ECU 通信时所需配置的接口信息
3.ECU 参数信息:描述了内部数据单元的详细内容
A2L格式
1 | /begin PROJECT /* 表示一个项目 */ |
PROJECT
一个A2L文件只能有一个PROJECT,而PROJECT中至少要有一个Module,A2L文件的注释和C语言的注释方式是一样的,支持 /* 和 // 两种方式
HEADER
这个部分主要包含项目编号、项目版本等信息,可以没有
1 | /begin HEADER "" |
A2ML
这个部分主要是描述接口数据格式。例如将XCP协议支持的某种模式全部在该部分定义出来,会在后面的接口具体的参数部分直接使用
MOD_PAR
MOD_PAR部分管理控制器数据,最重要的信息是内存的分段分页管理会在标定时用到
MOD_COMMON
MOD_COMMON部分主要是数据的对齐方式的描述信息
1 | /begin MOD_COMMON "" |
IF_DATA
这块是A2L文件的主要内容。Timeout、支持的命令等等。OPTIONAL_CMD就是选择可选。指令,列出控制器支持的指令,必实现的指令不在此处。控制器是一定要实现的
这块还有DAQ的配置,DAQ类型(动态/静态)、数量,用到的事件等等
还有CAN的配置信息,ID、波特率、采样设置等等
CHARACTERISTIC
标定量部分,包含了被标定的变量的名称、地址、长度、计算公式、精度,最大最小值等信息
1 | /begin CHARACTERISTIC |
MEASUREMENT
定义观测量,包含了被观测量的名称、地址、长度、计算公式、精度,最大最小值等信息
1 | /begin MEASUREMENT |
1 | FLOAT32_IEEE:IEEE 754 格式的 32 位浮点数。 |
COMPU_METHOD
用于定义计算公式,即原始值和物理值之间的转换关系,将原始值通过相应的计算方法转换成便于用户阅读和使用的物理值
RECORD_LAYOUT
用来定义标定变量的物理存储结构