前言

本文参考了以下两篇大佬的文章

标定协议原理

为什么需要标定协议

现在一款汽车、机械臂。要有灵魂动起来,主要有机械运动部分、电子控制硬件部分、电子控制软件部分。软件部分又分为软件、和参数。比如车型A,区分高、中、低三个配置,但是其实不管是硬件还是内部代码基本都一样,不一样的是一些车型参数或者配置字。通过标定就能实现车型配置的切换,体现不一样的系统性能

标定协议是汽车控制在编写程序后,部分功能实现的部分参数是需要在实车上才能确定的,当然在实车上调试过程中也需要监测一些数据才能进行调试工作

在一些需要调试较少的系统中,可以一边调试一边优化参数重新下载程序。对于汽车这样复杂系统就变得不可能。因此诞生一种标定系统。程序工程师将程序编写架构搭建好,在编程过程中需要预知那些参数需要标定(实时修改),那些变量需要观测(实时查看)。系统程序搭建好后,标定工程师即可在实车上实时查看、调试控制器。因此诞生一种标定协议

标定协议的底层实现

汽车控制器程序本质运行在SOC(系统级芯片)上,为了性能和稳定性是无GUI的。因此需要将标定工程师手中的PC作为标定的输入和输出。标定中需要实时和友好的标定软件(电脑端软件)通信。在汽车中广泛存在CAN控制器域网。自然首要选择它作为标定的通信通道

汽车控制器的SOC使用C语言。C代码中的参数值可以在RAM(初始值本质在ROM)中,或者ROM中。我们需要标定的参数如果当变量保存在RAM中,则修改后掉电就会恢复为初始值;如果存储在ROM,则不能对其进行修改

因此大佬们想了一个办法,标定的参数在SOC上存储两份,RAM、ROM中各一份。当汽车控制器上电是将ROM标定区的数据搬移到RAM标定区,程序运行时使用RAM标定区的参数,标定过程中就能实时修改RAM标定参数,当标定参数确定以后,将RAM标定区数据拷贝到ROM标定区,这样下次上电则是最新的标定参数

theory

当然仅仅只支持标定软件监测的参数(观测量)直接是定义在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

total

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)

flow

XCP协议的帧格式

format

1.XCP帧格式由头部、数据包、尾部组成,头部尾部根据协议在不同通信方式上有所区别

2.XCP数据包包含协议的通用部分,独立于使用的传输层

3.XCP数据包由标识字段、可选时间戳字段、数据字段组成

4.CAN上的XCP来说,XCP Header和XCP Tail是不需要的

头部尾部

头部尾部根据协议在不同通信方式上有所区别

标识字段

XCP数据包基本上总是以标识字段开头,该字段作为第一个字节包含数据包标识符(PID)

主设备到从设备的标识字段

pidms

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

  • 名称 PID范围
  • CMD 0xC0~0xFF 指的是上位机下发给下位机的一些命令,比如连接命令FF,解锁,获取状态、下位机交互的命令
  • STIM 0x00~0xBF 可以理解为一种上位机向下位机大量发数据的一种方式,相当于反向的DAQ(数据采集)
从设备到主设备的标识字段

pidsm

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)用于传输通用控制命令

cto

1.识别字段仅由PID组成,其中包含CTO数据包代码。时间戳字段不可用

2.数据字段包含不同类型的CTO数据包的特定参数

CMD

CMD(Command Packet)的PID包含0xC0 <= CMD <= 0xFF范围内的代码。所有可能的命令代码都在命令代码(CMD)定义

cmd

RES

RES(Command Response packet)PID包含命令正响应包代码RES = 0xFF。如果命令成功执行,RES将作为CMD的回复发送

res

ERR

ERR(Error packet)的PID包含数据包代码ERR = 0xFE。如果命令未成功执行,ERR将作为CMD的响应发送。第二个字节包含错误代码。后续定义了错误代码

err

EV

EV(Event packet)的PID包含数据包代码EV = 0xFD。如果从设备想要报告异步事件包,则发送EV。第二个字节包含事件代码。后续定义了事件代码。实现是可选的。从设备发送到主设备的事件数据包无被确认回复,因此不能保证传输

ev

SERV

SERV(Service Request packet)的PID包含请求包代码SERV = 0xFC。SERV要求主设备执行一些操作。第二个字节包含服务请求代码。可能的服务请求代码在后续定义

serv

DTO

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),该表描述了剩余数据字节中包含哪些数据采集元素

daq

每个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),该表描述了剩余数据字节中包含哪些数据刺激元素

stim

相关代码
错误代码

errcode

事件代码

下表中的事件数据包代码可以作为PID = 0xFD的异步数据包发送。实现是可选的。从设备发送到主设备的事件数据包不被确认,因此不能保证传输

evcode

服务代码

下表中的服务请求数据包代码可以作为PID = 0xFC的异步数据包发送。对于从设备来说,实现是可选的,但对于主设备来说是强制性的。从设备发送到主设备的服务请求包不被确认,因此不能保证传输

servcode

命令代码
CMD-STD(标准命令)

cmdstd

CMD-CAL(标定命令)

cmdcal

CMD-PAG(页切换命令)

cmdpag

CMD-DAQ(数据采集命令)

cmddaq

CMD-PGM(储编程命令)

cmdpgm

网络和传输方式

在网络上,只要能区分“从主结点发送到从结点”和“从从结点发送到主结点”,这两种类型的通信,就能够使用XCP。在“XCP on CAN”的情况下,是通过用两个CAN ID,“从主结点发送到从结点的ID”和“从结点发送到主结点的ID”进行区分。在网络上使用区分的通信并传输一些内容时,XCP使用了三种传输模式

transport

标准传输模式
在标准通信模型中,对从机的每个请求都有一个响应。除了 XCP 在 CAN 上,不允许多个从机对主机的命令做出响应。因此,每条 XCP 消息总是可以追溯到一个唯一的从机。这种模式是通信中的标准情况

块传输模式
块传输模式是可选的,可以节省大量数据传输(例如上传或下载操作)的时间。尽管如此,在这种模式下,性能问题必须朝着从机的方向考虑。因此,必须保持两个命令之间的最小时间,命令总数必须限制在最大值的上限

交错传输模式
交错模式也是出于性能原因而提供的,在典型通讯模式中,主机在收到上一条指令的回复前不会发送下一条指令,为提高通讯的效率,交错通讯模型可以不等待回复直接再发送下一条指令。但是这种方法也是可选的,并且与块传输模式相反,它在实践中没有相关性

XCP测量

按测量方式可分为异步测量与同步测量

异步测量(Poling)

Poling不是基于DTO,而是基于CTO,对需要采集的变量进行挨个轮询;主站可以使用SHORT_UPLOAD命令从从站请求测量参数的值。这称为轮询;这是最简单的测量情况:在已接收并执行SHORT_UPLOAD命令时发送测量参数的测量值

异步测量是使用主结点发送的命令,通过指定的XCP地址来提取从结点的ECU内部的数据,并通过从结点的应答将该数据传送给主结点,如此循环往复来实现的

Poling模式特点

1.Poling模式下的时间戳机制不能使用

2.不同测量值时间上没有一致性

3.包含2条报文(上位机请求和Slave响应),影响总线负载率

DAQ测量

DAQ_Measure

为了使测量与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列表配置无效
DAQ_ALLOT

XCP标定

参考页(Reference Page):可以理解为定义的逻辑地址对应Flash上的一块地址,参考页的属性在标定过程是可读不可写
工作页(Working Page):可以理解为定义的逻辑地址对应RAM上的一块地址,工作页的属性是可读可写
激活页(Activiting Page):就是指选择激活的一个页,比如激活工作页或者激活参考页等

标定过程:激活参考页(仅可读),读取当前的参数,比如PID中的比例因子 P,然后切换激活页,激活工作页(可读可写),可以在工作页在线修改参数,来获得较好标定值,最后,需要将优化后的P参数写入到原来参考页上,这样就完成了一个参数的标定

calibration_page

地址映射

硬件映射

有些芯片是支持硬件地址映射的,比如英飞凌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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/begin PROJECT /* 表示一个项目 */

/begin HEADER /* 描述项目信息:项目编号、项目版本、厂家名称等 */
/end HEADER

/begin MODLUE /* 描述ECU信息:一个ECU一个MODULE块 */

/begin A2ML /*描述接口:包括传输命令、DAQ、传输层 */
/end A2ML

/begin MOD_PAR /* 内存的分段分页管理 */
/end MOD_PAR

/begin MOD_COMMON /* 一般性描述信息:数据的对齐方式等 */
/end MOD_COMMON

/begin IF_DATA /* 接口具体的参数 */
/end IF_DATA

/begin CHARACTERISTIC /* 标定变量:名称、地址、长度、计算公式、精度、最大最小值等 */
/end CHARACTERISTIC

/begin AXIS_PTS /* 标定变量:二维三维数据时使用 */
/end AXIS_PTS

/begin MEASUREMENT /* 观测变量:名称、地址、长度、计算公式、精度、最大最小值等 */
/end MEASUREMENT

/begin COMPU_METHOD /* 定义计算公式 */
/end COMPU_METHOD

/begin COMPU_TAB /* 定义原始值和物理值的映射关系 */
/end COMPU_TAB

/begin RECORD_LAYOUT /* 定义标定变量的物理存储结构 */
/end RECORD_LAYOUT

/end MODLUE

/end PROJECT

PROJECT

一个A2L文件只能有一个PROJECT,而PROJECT中至少要有一个Module,A2L文件的注释和C语言的注释方式是一样的,支持 /* 和 // 两种方式

这个部分主要包含项目编号、项目版本等信息,可以没有

1
2
3
4
/begin HEADER ""
VERSION "1.0.0.0"
PROJECT_NO AUTOSAR_111
/end HEADER

A2ML

这个部分主要是描述接口数据格式。例如将XCP协议支持的某种模式全部在该部分定义出来,会在后面的接口具体的参数部分直接使用

MOD_PAR

MOD_PAR部分管理控制器数据,最重要的信息是内存的分段分页管理会在标定时用到

MOD_COMMON

MOD_COMMON部分主要是数据的对齐方式的描述信息

1
2
3
4
/begin MOD_COMMON  ""
DEPOSIT ABSOLUTE
BYTE_ORDER MSB_LAST
/end MOD_COMMON

IF_DATA

这块是A2L文件的主要内容。Timeout、支持的命令等等。OPTIONAL_CMD就是选择可选。指令,列出控制器支持的指令,必实现的指令不在此处。控制器是一定要实现的

这块还有DAQ的配置,DAQ类型(动态/静态)、数量,用到的事件等等

还有CAN的配置信息,ID、波特率、采样设置等等

CHARACTERISTIC

标定量部分,包含了被标定的变量的名称、地址、长度、计算公式、精度,最大最小值等信息

1
2
3
4
5
6
7
8
9
10
11
12
13
/begin CHARACTERISTIC

CAL_MPC_IsCutOffFrq_f32 /*Name 变量名字*/
"CAL_MPC_IsCutOffFrq_f32" /*Long Identifier(类似Comment)*/
VALUE /*Type*/
0x8014305C /*地址*/
Scalar_FLOAT32_IEEE /*Record Layout*/
0 /*Maximum Difference精度(分辨率)*/
BSW_A2L_Ident_Float /*Conversion Method计算公式*/
-3.4E+38 /*Lower Limit最小值*/
3.4E+38 /*Upper Limit最大值*/

/end CHARACTERISTIC

MEASUREMENT

定义观测量,包含了被观测量的名称、地址、长度、计算公式、精度,最大最小值等信息

1
2
3
4
5
6
7
8
9
10
11
12
13
/begin MEASUREMENT

VAR_AdcInitSBC_u16 /*Name 变量名字*/
"VAR_AdcInitSBC_u16" /*Long identifier(类似Comment)*/
UWORD /*Data type 值类型*/
BSW_A2L_Ident_Int /*Conversion method 计算公式*/
1 /*Resolution 分辨率*/
100 /*Accuracy 准确度*/
0 /*Lower limit 最小值*/
65535 /*Upper limit 最大值*/
ECU_ADDRESS 0x700094AA /*ECU_Address 地址*/

/end MEASUREMENT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
FLOAT32_IEEE:IEEE 754 格式的 32 位浮点数。
FLOAT64_IEEE:IEEE 754 格式的 64 位浮点数。
UBYTE:无符号 8 位整数。
SBYTE:有符号 8 位整数。
UWORD:无符号 16 位整数。
SWORD:有符号 16 位整数。
ULONG:无符号 32 位整数。
SLONG:有符号 32 位整数。
CHAR:字符。
STRING:字符串。
ENUM:枚举类型,通常用于定义属性的可选值。
STRUCT:结构类型,用于组织多个数据元素到一个数据结构中。
ARRAY:数组类型,用于定义相同数据类型的多个元素的集合。
COUNTER:计数器类型,用于描述一个值在时间内的变化。
BOOLEAN:布尔类型,表示真(TRUE)或假(FALSE)。
RECORD:记录类型,通常用于组合不同数据类型的元素。
CURVE:曲线类型,用于描述参数随输入变化的关系。
MAP:地图类型,用于描述两个输入参数和一个输出参数之间的关系。

COMPU_METHOD

用于定义计算公式,即原始值和物理值之间的转换关系,将原始值通过相应的计算方法转换成便于用户阅读和使用的物理值

RECORD_LAYOUT

用来定义标定变量的物理存储结构