目录
1.汽车标定概述
2.XCP协议由来及版本介绍
3.XCP技术通览
3.1 XCP上下机通信模型
3.2 XCP指令集
3.2.1 XCP帧结构定义
3.2.2 标准指令集
3.2.3 标定指令集
3.2.4 页切换指令集
3.2.5 数据采集指令集
3.2.6 刷写指令集
3.3 ECU描述文件(A2L)概述
3.3.1 标定上位机的标定、测量
3.3.2 A2L文件格式
4.小结
汽车的标定技术,最初是源自对发动机的特征值、曲线Map和图表参数的一个动态优化调整以适配不同发动机、不同车型对动力的需求。
它的基本思路是将发动机各种控制算法固化在MCU的Flash中,但是这些算法所需要用的参数通过技术手段抽象出来并在ram中运行,标定人员可以通过修改这些参数来观察算法的输出是否满足要求。注意哈,虽然说我们知道这个参数是可以修改的,但对于CPU或者控制算法来说,这些参数其实是常量,只有控制算法的输出才是变量。
下图是一个比较经典的标定测量流程示例图:
标定(Calibration)就是调整和优化ECU中的对于发动机控制算法的各种特征变量;
测量(Measurement)就是观察不同标定常量作为输入是如何影响控制算法的输出。
再举个简单一点的例子,比说说现在油门踏板开度与喷油量之间存在这样的关系
y = ax+b
y--喷油量,x--油门踏板开度,a和b分别为常量
那么要做标定,我们应该修改的是什么值?
首先,肯定不可能是x,因为这个开度是驾驶员用脚踩出来的,我们是没办法去要求别人;其次不可能是y,这是输出啊,根据x来的,那么只能是a或者b了;我们假设x此时为50%,表示油门踏板开度为50%,对应的a、b固定,那么喷油量y就是固定了;
但对于某些动力车型,它想要50%的踏板就有很强动力(y很大),这时候我们就应该去修改常数a、b(此时是运行在ram中)。标定就是修改这些特征值来满足不同车型的要求,当我们根据车型的不同将上述a、b修改成不同值后,一旦标定工程师认为这些值达到效果了,就通过flash刷写的方式将这些数写进Flash中,再通过技术手段告诉ECU以后就到Flash去取a、b的值吧。这就完成了汽车量产前的标定工作。
那么要完成标定这项工作,需要具备哪些条件呢?
首先要有一个好的修改标定常量的工具,其次要有一个好的观测方式(要么肉眼,要么通过PC端),最后还要有一个好的人机交互界面。
这时候,一个名叫ASAM的组织就冒了出来,它将刚才我谈到的这些内容进行一个标准化,即ASAM-MCD(Standardization of Automation and Measurement systems, with the work groups:
Measurement, Calibration and Diagnosis)。
借用Vector对于一个完整标定系统的描述:
有了上述基本概念,我们知道标定测量系统和ECU之间的桥梁就是ASAM-MCD-1MC,最初就是大家都比较熟的CCP(基于CAN的标定协议,于1995年提出,当前为2.01,1999定版),但是由于CAN的速率特性,对测量数据的时间戳不够精确;再加上目前ADAS等高测量速率要求,CCP逐渐不能满足要求;因此将该协议从CCP中抽象出来是非常有必要的,这时候就出现了XCP(Universal Measurement and Calibration Protocol),“X”表示的是可变的传输层协议,具体如下:
截止到目前为止,XCP协议已经迭代到了1.5版本 ,每个版本更新如下:
版本 | 发布时间 | 变更点 |
1.0 | 2003 | 1.传输层支持CAN、ETH(UDP和TCP/IP、SPI、USB) 2.发布标定测量、 |
1.1 | 2008 | 1.增加传输层支持FlexRay |
1.2 | 2013 | 1.增加A2L-IF_DATA描述,用于预估ECU资源消耗 |
1.3 | 2015 | 1.增加了feature:ECU状态,Bypassing错误处理和时间参数相关 |
1.4 | 2017 | 1.新增DAQ模式:减少时间戳数据传输的压缩DAQ等 |
1.5 | 2017 | 1.新增“Software Debugging over XCP”标准 |
本质上,XCP协议是为使用者提供了对ECU内部memory的读写机制。读访问保证标定系统可以从RAM中读取观测量,即测量(measurement);写访问保证了标定系统可以对RAM中的标定量进行数值修改,即标定(calibration)。
因此,XCP的实现就采用了经典的master-slave问答形式。
XCP基于Master-slave原则;标定系统作为Master,ECU通常作为Slave,Master与Slave之间通过标定工具(硬件例如ETAS的ES582、Vector的VX1000等)了解,使用XCP协议规定的指令进行交互;所以在Master和Slave的系统里均需集成XCP标准协议栈,就和诊断栈一样。
Master与Slave的命令交互帧叫做CTO(Command Transfer Objects);
Master与Slave的测量数据交互帧叫做DTO(Data Transfer Objects);
其通信模型如下:
图片来源:Vector官网
CTO缩写 | 全称 | 描述 |
CMD | Command Packet | Master给Slave发送的指令 |
RES | Command Response Packet | Slave返回给Master的命令正响应 |
ERR | Error Packet | Slave返回给Master的命令负响应 |
EV | Event Packet | Slave发给Master的异步事件帧 |
SERV | Service Request Packet | Slave发给Master的服务请求帧 |
DTO缩写 | 全称 | 描述 |
DAQ | Data Acquisition | Salve周期给Master发送测量数据 |
STIM | Stimulation | Master周期发送Slave的激励数据(Bypass常见) |
XCP提供了如下几种数据传输方式:
比如说使用download传输大数据给ECU,就会用到这种通讯模式
Upload指令,获取ECU内部的数据状态;一般标定download完之后,会紧跟着一个upload检查是否写进了目标ram地址。
这种比较少见,如有用到的可以在后面留言哦。
有了上位机通信模型之后,我们接下来就要了解XCP协议具体定义了哪些指令。
在这之前,要先来看XCP协议定义的帧结构。
XCP帧包含三部分:Header+Packet+Tail
其中,帧头(Header)、帧尾(Tail)依赖不同传输层,真正要讨论的深色部分,这部分内容与传输层无关了,即XCP协议栈真正要处理的数据内容,它主要包含三部分内容 ID 域、时间戳域和数据域。
ID域中最重要的就是PID(Packet identifier),这个值实际上就是Master\Slave的命令ID。如下:
DAQ主要是测量时根据DAQ list和ODT类型来定位数据的,以后有文章着重描述测量这块。
CTR可选,也是用于DAQ。
时间戳通常时DTO帧使用,因为同一个DAQ list里的观测量是同一时间采集,所以一个DAQ周期只会传输一个时间戳
Master和Slave真正交互的实际数据,每个指令都有不同的Date参数放在这个域里。
我们以FF连接命令为例,详细看下PID+DATA是如何交互的,如下:
根据标准定义,我们来分析上述报文的具体含义。
根据协议可以看到回复含义如下:
15:CAL/PAG、DAQ、STIM、PGM资源处于保护状态;
C0: 开启slave block mode,inter byte order,AG为1;
08:MAX CTO;
08:MAX DTO;
01 01 :XCP协议版本 1.1
有了这个基本概念,我们来看看XCP协议到底提供了哪些指令。
所谓标准指令集,就是提供最基础的功能,包括Master和Slave的连接建立、断开,ECU身份识别,解锁受保护资源,获取当前会话状态等等。根据XCP1.5版本,标准指令集如下:
其中前四条指令必选,我们常见的标定上位机的连接按钮,一点击就是这个四条指令的组合拳。 余下指令除了最后两条,基本也是要选的,UPLOAD可以与DOWNLOAD搭配使用,SEED\UNLOCK也是组合。
标定指令集就是执行标定动作或者在开始标定之前将离线标定的数据批量写进calibration ram中。
其通讯流程如下:
首先是SET_MTA(0xF6) 设置即将要传输的memory地址等;
然后调用DOWNLOAD(0xF0)通知Slave即将要使用的传输模式,结合DOWNLOAD_NEXT进行大数据传输,或者使用问答方式进行小数据标定。
页切换,可以用于所谓的工作页和参考页的切换,本质上就是memory地址的切换,WP和RP具体可参考之前关于标定的简单描述汽车ECU的标定
页切换指令集包含如下内容:
但在实际使用中,页切换不是所有ECU都支持的,通常是带overlay功能的CPU可以支持。因此要做页切换的目的就是想要CPU很快速滴访问WP或者RP去取算法所需的参数,但做这个切换没有overlay是比较难实现的,具体可参考overlay机制英飞凌TC3xx-Overlay-CSDN博客 。
数采指令集,就是大家常见的DAQ指令集,如下:
DAQ可以分为动态和静态DAQ;而根据ASAM_XCP_PART5的示例,DAQ的响应时序如下:
1.获取从机DAQ列表信息
由于首先就要获取DAQ列表信息,因此在XCP初始化时就要对DAQ进行初始化。
该步骤所要用到的指令:DA、D9、D7、D5、D8,
2.准备DAQ列表
1)静态DAQ配置:常用指令E3
2)动态DAQ配置
首先要释放DAQ(D6),然后分配DAQ(D4),最后分配ODT入口(D3)。
3.配置DAQ列表
这一步骤用到的指令有:SET_DAQ_PTR(E2),WRITE_DAQ(E1)
4.开始传输数据
用到的指令有:SET_DAQ_LIST_MODE(E0)、START_STOP_DAQ_LIST(DE)、GET_DAQ_CLOCK(DC)、START_STOP_SYNCH(DD)
1.声明刷写开始
用到的指令PROGRAM_START(D2)
2.擦除FLASH
用到的指令有 SET_MTA(F6)、PROGRAM_CLEAR(D1)。
3.开始刷写数据
PROGRAM(D0)
4.结束刷写
PROGRAM_VERIFY(C8)、PROGRAM_RESET(CF)
但在实际使用,通常不怎么用这个,都是标号导出hex,通过诊断刷进去。
因为以前如果是INCA,就得开发ProF文件,其次刷写的效率真的很低。
在讲A2L文件之前,我们先来思考几个问题。
带着这样的问题,我们进入A2L概述之旅
当我们使用INCA或者CANape时,标定窗口和测量窗口通常长这样:
这些数据从哪里来的呢?如下图
我们可以看到,这个数据集里有很多个观测量以及2个标定量,我们选取其中的test_calib1和measrued_Var1进行标定和测量,我们截取master的通信报文如下:
Package Type |
Xcp Package |
Parameters |
SET_MTA |
F6 xx xx 00 60 00 00 00 |
Address extension = 0x00 Address = 0x00000060 |
RES |
FF |
|
DOWNLOAD |
F0 04 00 00 80 3F |
Number of data elements = 0x04 Data elements = 0x00 0x00 0x80 0x3F |
RES |
FF |
很明显,这个0x00000060就是test_calib1的地址,那么这个标定工具INCA是怎么知道的呢?
还记得我们ASAM-MCD-2MC吗?即A2L文件,它就是用来告诉标定工具ECU里面各种详细信息的,包括指令支持类型、通讯方式、观测量、标定量在Flash和RAM的那个具体地址以及实际数据和算法物理数据转换公式等信息。
A2L文件是一种ASCII格式可读文件,记事本都可以打开,它包含了如下具体内容:
通常我习惯把绿色部分叫做A2L header部分(与/begin HEADER关键词区分),在最开始没接触vector的ASAP2 editor时,都是根据标准描述一行一行手撸,后来掌握到关键点后,用脚本做一个基于excel的配置工具也勉强能用;
红色部分,一般情况就是用模型生成的A2L文件,如下图:
最开始生成的A2L文件,标定观测量没有地址的,也没有相应的header,需要集成编译后拿到map或者elf文件进行地址替换,如果没有ASAP2 editor或者CANape,那就只能用matlab自带脚本,如果想再自定义A2L格式,还得熟悉m语言,以后会专门将这块内容。
最后以一个A2L文档结构来描述一下:
前三节内容,基本上把XCP大体框架讲的七七八八,后面会详细聊聊标定在ECU里面的具体概念、DAQ和ODT list的详解、INCA走XCP刷写必备ProF文件、基于模型如何开发标定测量以及生成完美的A2L文件,MPC5748的ovelay概念以及在集成XCP协议栈遇到的各种奇奇怪怪的问题。