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一块地址;

参考页: 你可以理解为定义的逻辑地址对应Flash上的一块地址,比如逻辑地址0x0000~0x0200对应Flash上一块0x1000~0x1200这个地址;那么参考页的属性在标定过程是可读不可写;

工作页:你可以理解为定义的逻辑地址对应RAM上的一块地址,比如逻辑地址0x0000~0x0200对应RAM上一块0x0000~0x0200这个地址;注意工作页的属性是可读可写(方便标定修改嘛)

激活页:就是指选择激活的一个页,比如激活工作页或者激活参考页等。

这里再进一步说一下标定过程:首先激活参考页(仅可读),读取当前的参数,比如PID中的比例因子 P,然后切换激活页,激活工作页(可读可写),这个时候就可以在线修改参数,来获得较好的PID曲线,从而确定优化后的参数P,最后,我们还是需要将原来参考页上的P参数,写入优化后的P参数,这样就完成了一个参数的标定。

下面我们讲讲两种地址映射方式:

a.硬件方式

有些芯片是支持硬件地址映射的,比如我们现在使用的英飞凌TC27X系列,它的工作方式比较简单,就是在你切换激活的工作页时,操作寄存器,硬件完成地址映射。

举个例子 假如Reg1 = 0时,激活页是参考页,逻辑地址0x000~0x200 对应的Flash中的0x100~0x300;

切换激活页为工作页时,Reg1=1,对应逻辑地址0x000~0x200 对应Ram中的0x000~0x200;

是不是超简单,但是相应芯片价格会贵一点。

b.软件方式

其实就是加入一个offset偏移量来实现。

还是以上面的例子为例:

激活页->参考页   逻辑地址 0x000~0x200  -> Offset=0x100  Flash地址0x100~0x300 =(逻辑地址+Offset)

激活页->工作页   逻辑地址 0x000~0x200  -> Offset=0x000  Flash地址0x000~0x200 =(逻辑地址+Offset)

同样也不不复杂,但是会部分增加软件的维护工作。

激活页->参考页   逻辑地址 0x000~0x200  -> Offset=0x100  Flash地址0x100~0x300 =(逻辑地址+Offset)

5.XCP的命令简介

下面我将进行一定的分类方法来进行介绍;

Master->Slave (上位机到下位机)总共0xFF条

     名称                    PID范围

     CMD                  0xC0~0xFF

     STIM                  0x00~0xBF

Slave ->Master(下位机到上位机)总共0xFF条

     名称                    PID范围

     Response             0xFF

     Error                     0xFE

     Event                    0xFD

     Service                 0xFC

     DAQ                   0x00~0xFB  //ODT的序号

下面大致解释一下上面名称:

CMD:指的是上位机下发给下位机的一些命令,比如连接命令FF,解锁,获取状态等一些和下位机交互的命令;

STIM:你可以理解为一种上位机向下位机大量发数据的一种方式,相当于反向的DAQ;

Response:肯定应答,指的下位机答复上位机的命令;

Error:否定应答上位机的命令;

Event:事件,指下位机发生某事件时通知上位机;

Service:指下位机在某些情况下,需要上位机执行一些动作,你可以理解为请求上位机服务。

DAQ:很显然,就是下位机上传数据给上位机。

XCP数据包有两种类型CTO和DTO。

命令传输对象(CTO:Command Transfer Object)被用来传输一般的控制命令:控制命令(CMD),命令响应(RES),错误包(ERR)事件包(EV)以及服务请求数据包(SERV)。

数据传输对象(DTO:Data Transfer Object)被用于传输同步数据采集数据(DAQ)和同步数据激励数据(STIM)。

CMD: Command

RES: Response

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 /*表示一整个项目,一个文件一个项目*/
 
    /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 SEGMENT和SEGMENT里边的PAGE,这里的SEGMENT/PAGE的概念和在线标定中的概念是一致的,请参考在线标定篇章,一个MODULE里边只能出现一次。
  3. MOD_COMMON这个块用来指定ECU的一些标准的一般性描述信息,比如大小端,数据的对齐方式,FLOAT变量的处理方式等,一个MODULE里边只能出现一次。
  4. CHARACTERISTIC这个块用来定义标定变量,里边包含了可以被标定的变量的名字,地址,长度,计算公式,精度,最大最小值等信息,一个MODULE里边可以出现很多次这样的块,也就是说一个ECU可以有很多的标定变量。
  5. AXIS_PTS这个块用来定义数组或查表变量对应的轴的类型,它将被RECORD_LAYOUT块来引用,一个ECU里边可以有很多种不同的轴类型,用于实现查表和插值。
  6. MEASUREMENT这个块用来定义测量变量,里边包含了可以被测量的变量的名字,地址,长度,计算公式,精度,最大最小值等信息,一个MODULE里边可以出现很多次这样的块,也就是说一个ECU可以有很多的测量变量。
  7. COMPU_METHOD用于定义计算公式,及原始值和物理值之前的转换关系,这些公司可以被标定变量和测量变量来引用,从而将原始值转换成便于用户阅读和使用的物理值。
  8. COMPU_TAB这个块用来定义原始值和物理值的映射关系,是一种特殊的转换关系,它一般应用于枚举变量,例如我们想采集一个代表XCP状态机的变量,分别为0对应DISCONNECTED,1对应CONNECTED,2对应RESUME,那么我们就可以把这样的映射关系定义层一个COMPU_TAB,然后关联到对应的变量上,这时候如果上位机采集到1这样的原始值,它就可以将当前的状态显示成“CONNECTED”字样,方便用于阅读和使用。
  9. FUNCTION这个块不是必须。
  10. GROUPS这个块这个把标定变量和测量变量按照一定的逻辑(比如功能模块)组织起来,在上位机工具中形成一个下拉菜单,使得用于可以从中选择变量,这个块不是必须的。
  11. RECORD_LAYOUT这个块用来定义标定变量的物理存储结构(单个变量,二维表,三维表等)。

上述的这些信息块可以分为两类:

  • 一类是随着ECU和XCP实施完成以后就确定的,这类信息一经确定以后再后续的使用过程中是不需要修改的,例如大小端,MEMORY SEGMENT内存分配等,上述HEADER/MOD_PAR/MOD_COMMON属于这一类,另外一类是当ECU软件有所调整的时候就会变化的,例如已有的标定变量和测量变量的地址,甚至变量名,或者可能会新增变量,上述CHARACTERISTIC/AXIS_PTS/MEASUREMENT/COMPU_METHOD/COMPU_TAB/FUNCTION
    /GROUPS/RECORD_LAYOUT属于这一类。
  • 在第二类中改动最多的尤其是CHARACTERISTIC和MEASUREMENT快中的变量地址信息,因为每次软件变化重新编译都会造成这部分信息的更新,地址更新导致的块信息更新需要手动的更改A2L文件才能使得A2L和当前的软件配置起来,只有两者相匹配才能实现正确的标定和测量。

 A2L块示例

测量变量vechicle_speed可以进行如下定义,该变量处于RAM中,对应的地址是0xD0001234,它的范围是[0-230] ,它在ECU中以一个UWORD类型来表示,原始值和物理值的转换关系为:Phy = 0.003 X Raw ,即Ax+B中A=0.003,B=0;

测量变量xcp_state代表XCP的状态,可以进行如下定义,它处于RAM中,在ECU中的地址是0xD0005678,它是一个枚举量,0对应DISCONNECTED,1对应CONNECTED,2对应RESUME;

标定变量Current_threshold可以进行如下定义,它处在FLASH标定区域,在ECU中的地址是0x00012345,它的范围是[-20,20],是一个有符号量,精度为0.125,即Phy = 0.125 X Raw我们前边提到的,在每次软件有更新重新编译以后,会导致这些变量在ECU中的地址有变化,

那么上边这些变量对应的ECU ADDRESS条目的内容就需要随着改变,变量的地址信息可以从编译生成的MAP文件中获得,然后手动更新到A2L中。

  • 10
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值