XCP协议学习笔记
1.XCP⽤来做什么?
在汽车电⼦软件开发中,经常会遇到需要在整车调试或者台架调试时才能确定的⼀些变量,这个时候就会⽤到XCP,例如电机控制器的PID 参数,可能根据汽车的负载不⼀样需要调整,这个时候就可通过XCP来标定。
那么XCP主要的⽤处以下总结为四点:
a.标定
b.测量(反馈⼀些变量的值供上位机或测试系统查看,如转速等)
c.编程和刷新(例如更新⼀部分地址的数据值,甚⾄重编程等,这部分⽤的较少⼀般⽤UDS)
d.对ECU功能进⾏旁路,简单来说就是模拟ECU的数据
其中主要⽤a,b两点,其他两点⽤的⽐较少。
XCP协议数据结构
主、从设备之间每次传输的数据都采⽤XCP帧的格式,包含⼀个XCP报头、XCP数据包和XCP报尾。XCP帧⽀持的传输层可将这三个帧元素映射到相应的传输帧格式。
XCP数据包包含独⽴于所选传输机制的协议数据,携带标识、时间戳和实际数据。PID是标识字段的⼀部分,⽤于标记数据包及数据包内部的数据值。
2.XCP的⼯具简介
⽬前XCP主要使⽤的⼯具有Vector公司的CANape ITAS的INCA,Value CAN等⼯具。
3.XCP的⼀般⼯作流程
⾸先XCP是主从的⼯作结构,主节点(Master)即⼀个上位机,我们定义它为测试系统,当然你也可以理解为我们使⽤的XCP⼯具,⼀个主节点可以连接多个从节点(Slave),以XCPOnCAN为例,可以通过CAN ID的⽅式来识别不同的从节点,⼀般从节点需要两个CANID,⼀个源地址,⼀个⽬标地址。那么硬件连接如下所⽰:
Master(带上位机的笔记本)<-->CAN⼯具<-->Slave(ECU 可多个)
a.第⼀步我们要将Master和Slave连接起来,当然是通过发命令的⽅式建⽴连接,具体命令后⾯进⾏讲解。
b.第⼆步可以通过上位机⼯具监控之前定义好的⼀些变量,例如速度,转矩,电压等参数;
c.第三步可以进⾏⼀些在线标定功能,⽐如在台架上标定PID的⼀些参数,标定过程⼀般是先在⼀个存储区(RAM)定义的变量找出⼀个⽐较好的参数,然后将这个⽐较好的参数固化下来,擦除原来的数据写⼊到另外⼀个映射好的存储区(flash),这个是标定的⼀般过程;
d.当然也可以通过重新擦写⼀个数据区域,使⽤其编程的功能。亲爱的英文单词
我认为映射关系可能是XCP中较核⼼的⼀个部分,下⾯我们讲⼀讲c步骤中的地址映射。
4.XCP地址映射
⾸先我们讲⼀讲 参考页/⼯作页/激活页/逻辑地址/物理地址的⼀些概念
逻辑地址:为了XCP的逻辑应⽤定义的⼀块地址,就像我们给⼀个变量定义了⼀个名字⼀样;
物理地址:它是直接对应存储器上的⼀块地址⽐如RAM上的0x0000~0x0200⼀块地址;Flash 0x1000~0x1200⼀块地址;
mr know it all参考页: 你可以理解为定义的逻辑地址对应Flash上的⼀块地址,⽐如逻辑地址0x0000~0x0200对应Flash上⼀块0x1000~0x1200这个地址;那么参考页的属性在标定过程是可读不可写;
⼯作页:你可以理解为定义的逻辑地址对应RAM上的⼀块地址,⽐如逻辑地址0x0000~0x0200对应RAM上⼀块0x0000~0x0200这个地址;注意⼯作页的属性是可读可写(⽅便标定修改嘛)韩国驻华大使馆
turkey是什么意思激活页:就是指选择激活的⼀个页,⽐如激活⼯作页或者激活参考页等。
这⾥再进⼀步说⼀下标定过程:⾸先激活参考页(仅可读),读取当前的参数,⽐如PID中的⽐例因⼦ P,然后切换激活页,激活⼯作页(可读可写),这个时候就可以在线修改参数,来获得较好的PID曲线,从⽽确定优化后的参数P,最后,我们还是需要将原来参考页上的P 参数,写⼊优化后的P参数,这样就完成了⼀个参数的标定。
下⾯我们讲讲两种地址映射⽅式:
a.硬件⽅式
有些芯⽚是⽀持硬件地址映射的,⽐如我们现在使⽤的英飞凌TC27X系列,它的⼯作⽅式⽐较简单,就是在你切换激活的⼯作页时,操作寄存器,硬件完成地址映射。
举个例⼦ 假如Reg1 = 0时,激活页是参考页,逻辑地址0x000~0x200 对应的Flash中的0x100~0x300;
切换激活页为⼯作页时,Reg1=1,对应逻辑地址0x000~0x200 对应Ram中的0x000~0x200;
是不是超简单,但是相应芯⽚价格会贵⼀点。
b.软件⽅式
其实就是加⼊⼀个offt偏移量来实现。
还是以上⾯的例⼦为例:
激活页->参考页 逻辑地址 0x000~0x200 -> Offt=0x100 Flash地址0x100~0x300 =(逻辑地址+Offt)
激活页->⼯作页 逻辑地址 0x000~0x200 -> Offt=0x000 Flash地址0x000~0x200 =(逻辑地址+Offt)
同样也不不复杂,但是会部分增加软件的维护⼯作。dgg
激活页->参考页 逻辑地址 0x000~0x200 -> Offt=0x100 Flash地址0x100~0x300 =(逻辑地址+Offt)
5.XCP的命令简介
下⾯我将进⾏⼀定的分类⽅法来进⾏介绍;
Master->Slave (上位机到下位机)总共0xFF条
名称 PID范围
CMD 0xC0~0xFF
STIM 0x00~0xBF
Slave ->Master(下位机到上位机)总共0xFF条
名称 PID范围
Respon 0xFF
Error 0xFE
Event 0xFD
Service 0xFC
DAQ 0x00~0xFB //ODT的序号
下⾯⼤致解释⼀下上⾯名称:
CMD:指的是上位机下发给下位机的⼀些命令,⽐如连接命令FF,解锁,获取状态等⼀些和下位机交互的命令;
STIM:你可以理解为⼀种上位机向下位机⼤量发数据的⼀种⽅式,相当于反向的DAQ;
Respon:肯定应答,指的下位机答复上位机的命令;
Error:否定应答上位机的命令;
Event:事件,指下位机发⽣某事件时通知上位机;
Service:指下位机在某些情况下,需要上位机执⾏⼀些动作,你可以理解为请求上位机服务。
DAQ:很显然,就是下位机上传数据给上位机。
XCP数据包有两种类型CTO和DTO。
命令传输对象(CTO:Command Transfer Object)被⽤来传输⼀般的控制命令:控制命令(CMD),命令响应(RES),错误包(ERR)事件包(EV)以及服务请求数据包(SERV)。
数据传输对象(DTO:Data Transfer Object)被⽤于传输同步数据采集数据(DAQ)和同步数据激励数据(STIM)。
CMD: Command
dmcl
RES: Respon
ERR: Error
EV: Event
SERV: Service Request Processor
DAQ: Data Acquisition
STIM: Stimulation
四级翻译词组
6.XCP的A2L⽂件
ASAP2标准是ASAM组织制定的⼀套标准,该标准规定了上位机(Master)和ECU(Slave)之间的通讯所需要的所有信息(可以是XCPonCAN,XCPonUSB等,也可以是CCP,还可以是UDS),⽽A2L⽂件就是ASAP2标准的表现形式。
符合ASAP2标准的A2L⽂件主要含有两部分内容:ECU的描述信息和通讯⽅式的描述信息。
⾸先A2L⽂件是采⽤ASAP2指定的⼀套类XML语⾔的描述性语⾔(采⽤开标签和关标签来描述信息)书写的⽂件,它⾥边包含了某个特定的ECU中的软件和系统信息,还包含了上位机和ECU通讯⽅式的约定,它⽤来指导上位机和ECU的通讯交互过程,让他们对交互的信息有⼀致的认识,从⽽是上位机⼯具准确且友好的将ECU中的信息展现给⽤户。
A2L⽂件是啥呢?它其实就是⼀种⽅便XCP进⾏⼯作的描述性⼀个⽂件,你可以理解为⼀个通讯矩阵,包含了项⽬信息、ECU信息、标定变量信息、测量变量信息等等如下所⽰。
/begin PROJECT /*表⽰⼀整个项⽬,⼀个⽂件⼀个项⽬*/acca是什么意思
/begin HEADER /*描述项⽬信息,包括项⽬编号,项⽬版本等信息*/
/end HEADER
/begin MODULE Device/*描述ECU需要的所有信息,⼀个ECU对应⼀个MODULE块*/
/begin MOD_PAR /*管理ECU的数据,CPU 客户编号等等,最重要的是内存的分段分页管理,类似DSP中的CMD⽂件*/
/end MOD_PAR
/begin MOD_COMMON/*⼀般性描述信息,⽐如⼤⼩端,数据的对齐⽅式*/
/end MOD_COMMON
/begin CHARACTERISTIC/*定义标定变量,包含被标定的变量的名字,地址,长度,计算公式,精度,最⼤最⼩值等信息*/
/end CHARACTERISTIC /*可定义多个*/
/begin AXIS_PTS
/end AXIS_PTS
/begin MEASUREMENT/*定义测量变量,包含了被测量的变量的名字,地址,长度,计算公式,精度,
最⼤最⼩值等信息*/
/end MEASUREMENT/*可定义多个*/
/begin COMPU_METHOD/*定义计算公式,及原始值和物理值之前的转换关系如phy = ax+b*/
/end COMPU_METHOD
/begin COMPU_TAB /*定义原始值和物理值的映射关系⼀般是枚举变量*/
/end COMPU_TAB
/begin FUNCTION
/end FUNCTION
/begin GROUP
/end GROUP
/begin RECORD_LAYOUT/*定义标定变量的物理存储结构(⼀维,⼆维表,三维表等)*/
心态决定成败/
end RECORD_LAYOUT
/end MODULE Device
/end PROJECT
A2L⽂件结构及内容
⼀个A2L⽂件只能有⼀个Project(项⽬),⽽项⽬中⾄少要有⼀个Module,A2L⽂件的注释和C语⾔的注释⽅式是⼀样的,⽀持/**/和//两种⽅式。
上边⽂件结构中,不同的⽂件块的意义:
1. HEADER这个块⾥边包含了项⽬信息,包括项⽬编号,项⽬版本等信息
2. MODULE这个块⾥边包含了在标定测量层⾯来描述ECU需要的所有信息,⼀个ECU对应⼀个MODULE块,MODULE由许多⼦块来组
成1MOD_PAR这个块⾥包含了⽤于管理ECU的数据,例如客户名,编号,CPU类型,ECU的内存分配等,其中最重要的就是ECU的内存分配,开发⼈员需要根据ECU内存分段情况定义MEMORY SEG
MENT和SEGMENT⾥边的PAGE,这⾥的SEGMENT/PAGE的概念和在线标定中的概念是⼀致的,请参考在线标定篇章,⼀个MODULE⾥边只能出现⼀次。
3. MOD_COMMON这个块⽤来指定ECU的⼀些标准的⼀般性描述信息,⽐如⼤⼩端,数据的对齐⽅式,FLOAT变量的处理⽅式等,⼀
个MODULE⾥边只能出现⼀次。
yuan怎么拼读4. CHARACTERISTIC这个块⽤来定义标定变量,⾥边包含了可以被标定的变量的名字,地址,长度,计算公式,精度,最⼤最⼩值等
信息,⼀个MODULE⾥边可以出现很多次这样的块,也就是说⼀个ECU可以有很多的标定变量。
5. AXIS_PTS这个块⽤来定义数组或查表变量对应的轴的类型,它将被RECORD_LAYOUT块来引⽤,⼀个ECU⾥边可以有很多种不同
的轴类型,⽤于实现查表和插值。
6. MEASUREMENT这个块⽤来定义测量变量,⾥边包含了可以被测量的变量的名字,地址,长度,计算公式,精度,最⼤最⼩值等信
息,⼀个MODULE⾥边可以出现很多次这样的块,也就是说⼀个ECU可以有很多的测量变量。