当前位置:网站首页 > 技术博客 > 正文

xcpru



XCP协议在汽车电子开发中起着重要的作用,可能每天都在用,但是确并不清除XCP协议到底是什么。 本文将说明XCP协议的前世今生,并分析其具体是如何通信的,以及XCP的功能和协议内容。 为了避免文章太长,分两个部分。

提及XCP协议,不得不从ASAM说起。

随着汽车电子的高速发展,汽车上的ECU越来越多,各控制器间协同工作,控制着不同的部件。

电子控制单元作为汽车系统中的大脑,通过采集输入信息,比如加速踏板,制动踏板,巡航,起停等,采用特定的算法计算输出,为了达到理想的控制效果,算法中包含较多的可标定参数,根据不同的输入和工况等调整。

ECU中的程序由软件工程师设计开发,而软件工程师并不能准确将这些参数设置成合理值,这些参数是需要在实验中根据我们追求的经济性、动力性、舒适性和满足排放法规等来设置,这部分工作是由标定工程师(或应用工程师)在软件开发后利用改变参数分析性能反复迭代最终测定,因此标定工程师就需要对不同参数进行获取(读操作)和标定(写操作)。这时候,就需要有个测量和标定标准来规范大家的操作。

在1990年代,几个德系OEM和TIER1—奥迪,宝马,奔驰,大众,BOSCH,ETAS和Vector等,一起成立了一个协会,叫做ASAM。

ASAM(Association for Standardisation of Automation and Measuring Systems,自动化和测量系统标准协会)是一个非营利性组织,是汽车工业中的标准协会,致力于数据模型,接口及语言规范等领域。不要小瞧这个协会,除了我们今天提到的测试和标定标准,还有诊断、ECU网络、软件开发、自动化测试、数据管理和分析、仿真等范畴都在遵循它制定的标准。

成立之初,ASAM发布的CCP(CAN Calibration Protocol)协议,它是一种基于CAN总线的ECU标定协议,采用CCP协议可以快速而有效地实现对汽车电控单元的标定。现在仍然有许多汽车厂商还在使用。

有了CCP协议后,ASAM意识到随着整车网络需求的发展,CAN总线已经无法满足整车需求,智能化和网联化要求FlexRay,以太网的加入。2003年左右,在CCP协议的基础上,ASAM又提出了XCP(Universal Measurement and Calibration Protocol)协议。“XCP”中"X"是Universal,通用的,表示能适配它能够支持多种底层网络协议和总线类型。

XCP的主要应用于测量和标定ECU内部参数。此协议能够使数据采集工作与ECU内部运行的任务和中断同步,从而保证每当ECU软件更新参数时,能快速采集到所需的参数值。基于以太网的XCP传输层协议可以使用TCP或UDP,不仅适用于物理控制单元,还可用于测量和调整虚拟控制单元。

XCP允许对内存直接进行读写访问:这样在读访问中就可以用来测量来自内存的参数数值,写访问中就可以用于调整内存中参数的数值。

为了确保传输网络的独立性,XCP被分成一个协议和一个传输层。由于XCP在功能方面增强了很多,所以不能向后兼容CAN标定协议(CCP)。同时ASAM已经对XCP协议定义了下列传输层为标准:

  • 基于CAN的XCP
  • 基于LIN的XCP
  • 基于SxI(SPI、SCI)的XCP
  • 基于以太网(TCP/UDP)的XCP
  • 基于USB的XCP
  • 基于FlexRay的XCP

XCP由ASAM 标准化并且取代了古老的CAN标定协议(CCP)。相较于CCP协议,XCP在功能上做了许多改进,包括:

  • 支持任何物理层协议,不仅限于CAN
  • 优化了控制单元资源的利用率
  • 同步数据激励
  • 支持启动测量
  • 通过块传输命令优化通信
  • 即插即用配置
  • 通过测量控件内的时间戳从而精确测量数据采集。

采用一主多从的模式,单个主机可以同时与多个从机通讯。主机通过下发命令与从机建立连接,解锁,读取数据,修改参数等操作。所有XCP通信都以名为“XCP数据包”的数据对象形式传输。

XCP数据包有两种类型。

命令传输对象(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

XCP实现测量与控制设备中的事件同步进行,从而确保测得值具有相关性。待测量的信号可以在每次重启系统时预先选定。

写访问要求待调整的参数位于RAM内。XCP的用户需要知道测量和调整值在内存中的确切地址。该地址可以通过控制单元说明文件(A2L文件)获得。XCP的一大优势是它能够从与控制单元内的程序或事件同步变化的内存上获取测量数据,从而使用户能够识别控制单元中的时间次序与这些变化值之间的直接关联,这被称为事件同步测量。

主、从设备之间每次传输的数据都采用XCP帧的格式,包含一个XCP报头、XCP数据包和XCP报尾。XCP帧支持的传输层可将这三个帧元素映射到相应的传输帧格式。

XCP数据包包含独立于所选传输机制的协议数据,携带标识、时间戳和实际数据。PID是标识字段的一部分,用于标记数据包及数据包内部的数据值。

基于以太网的XCP既可以使用TCP也可以使用UDP。这两种结合方式各有优缺点。

选择使用哪一种可根据使用场景决定。例如,如果要记录完整的跟踪数据,需要接收来自网络的每一个帧数据,若是在传输过程中有任何丢失,则必须重传,并保证其顺序正确如初。这种场景下必须使用TCP。

与此相反,在对设备进行实时测量时,它的信号数据仅在获得下一个样本时才有效。如果测得的数据在传输过程中丢失,但下一个样本证实丢失的数据无效,那么就没有必要重传先前的报文,这种场景使用UDP即可。

XCP报头包含长度信息和一个可用于检测数据包丢失情况的计数器。主设备每发送一个数据包,就将计数器的值増加一,从设备的做法也是如此。两个计数器相互独立。多个XCP数据包可以合并到同一个UDP数据包中,但一个XCP数据包不可以分成多个数据包。UDP和TCP的XCP报尾为空。

XCP使用时总是与ECU说明文件配合使用,这个文件就是ASAP2(A2L)文件。该文件包含使用XCP所需的必要信息,包括关于ECU参数、内存变量和ECU内存详细地址信息以及如何解锁访问XCP功能的安全信息。XCP还可以从ECU上传数据,向ECU下载数据以及对ECU重新编程。为了实现这些功能,XCP Master必须知晓ECU不同内存区的详细信息。

A2L是基于ECU软件生成的,ECU软件的对象包含在A2L文件中,源代码更改后A2L文件也会进行更改。A2L文件的结构如下图。

标定数据记录文件使用MDF格式,全称(Measurement Data Format),即测量数据格式,是ASAM(自动化及测量系统标准协会)定义的。INCA、CANape等工具录制的测量数据,都是MDF格式。

1991年发布的第一个公开版本是MDF 2.0(.dat);MDF 3.0(.mdf)于2002年发布,多年来,逐步扩展。当前的非ASAM版本MDF 3.3仍完全向后兼容所有MDF 2.x和3.x版本。但是,由于文件内部链接使用32位数据类型,因此专有MDF 3.x格式的文件大小限制为4GB。

2009年发布了ASAM MDF 4.0(.mf4),克服了先前MDF3.x版本的大小限制,并提供了一系列新功能,例如通过XML的灵活可扩展性,自定义信号分组,事件或附件。但是,由于诸如链接的64位数据类型之类的根本更改,MDF 4.x不再与MDF 3.x 兼容。当前最新版本为2012年ASAM MDF 4.1。

来源:汽车ECU设计

推荐阅读:

XCP协议是什么?一文看懂,保证明白(下)

2020年线束行业软件及现状分析

CAN总线基础,网络架构学习精品读物

本文继续前文XCP协议是什么?一文看懂,保证明白(上)  来解读XCP协议具体是如何通信的,以及XCP的功能和协议内容。

在XCP中,测量/校准的工具侧是“XCP主结点”,被测量的ECU侧是“XCP从结点”,采用所谓的“主从通信方式”。这种通信方式中,必定是从主结点发送命令来开始,从结点在接收到后,再向主结点发送应答,以这样的顺序进行通信。如图7所示,1个网络上主结点必定只有一个,而从结点可以有多个。

图7:使用XCP的网络示例

在这个情况下,主结点向每个从结点发送命令,并接收从结点返回的应答(图8)。

图8:一主多从的通信示例

通过这种通讯方式,车载网络上连接一个测量/校准工具(= XCP主结点)后,可以通过XCP协议访问作为测量对象的各个ECU(= XCP从结点)。

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

图9:XCP的传输模式

对于传输模式而言,可以在主结点侧和从结点侧,分别决定使用哪种模式。例如,主结点为“块传输模式”,从结点为“标准模式”,这样的使用方式也是可行的。因此,尽管主结点的工具侧的性能强大,但是当从结点的ECU只能使用有限的资源时,也可以实现简化的传输模式。

在XCP中,除了主结点和从结点之间的传输方向的差异之外,要传输的内容还被分为“与XCP本身的控制相关的通信”和“与数据相关的通信”两种类型,以及定义在每个网络上传输的报文的格式。作为对比,前者被称为“命令传送对象(CTO:Command Transfer Object)”,后者被称为“数据传送对象(DTO:Data Transfer Object)”。

CTO:Command Transfer Object的缩写

CTO是与XCP自身的控制命令和应答等相关的对象。控制命令从主结点发送,对命令的应答是从从结点发送。

DTO:Data Transfer Object的缩写

DTO是与同步从结点(ECU)获取数据测量结果以及进行数据变更相关联的对象。同步数据变更被称为“激励(Stimulation)”,但由于是测量/校准以外的功能,因此省略详细说明(详情请参照XCP标准文件)。

图10展示了,从XCP标准文件的“Part2 1.1.1 The XCP Packet Types”章节中,抽取的XCP主结点与从结点之间的CTO和DTO的关系。

图10:XCP主结点/从结点间的对象

如上所述,CTO和DTO是不同报文格式(图11),可以分别设置主从设备的最大报文长度。

图11:CTO和DTO的报文结构

所有的XCP报文都在这个最大报文长度内,命令和响应等内容都在一个报文中完成的。而且在报文格式中,每个字段按两种类型分配给CTO和DTO报文。此外,报文的第一个字节是被称为“PID”的标识符,是被用来区分是怎样的报文。

主结点对从结点进行XCP控制时使用“命令(CMD)”,此时的PID在“0xC0”到“0xFF”的范围内。从结点对这个命令返回肯定应答的情况下,使用“应答(RES)”,此时PID变为“0xFF”(图12)。

图12:报文的标识符(PID)

除了测量/校准的同步数据交换之外,所有其它的都是通过主结点发送命令,从结点将返回肯定应答来完成的。在此,以XCP on CAN为例来说明,其中主结点发送到从结点的CAN ID是“1”,从结点发送到主结点的CAN ID是“2”。在这种情况下,XCP通信按以下顺序执行。

  • 主结点发送的CAN ID为“1”,其中第一个字节指定为“0xFF”,第二个字节指定为“命令参数”。
  • 从结点接收第1行的连接命令,并通过PID识别该命令。
  • 从结点发送的CAN ID为“2”,其中第一个字节指定为“0xFF”,第二个字节开始指定为“应答值”。
  • 主结点接收第3行的应答命令。

图13显示了实际通信的跟踪结果。第1行的“0xFF”是命令“CONNECT”,从而在主结点和从结点之间建立逻辑连接,并接收后续命令。

图13:CONNECT命令和应答

XCP的测量/校准,是通过对ECU内部的软件的访问来实现的。具体而言,针对要测量/校准的对象的内存区间,通过指定对应的“XCP地址”的方式进行访问。

XCP地址与普通的微控制器中的地址几乎相同,但XCP使用了32位的XCP地址和8位的扩展地址。也就是说,主结点对从结点的访问,可以有32 + 8 = 40位的地址空间。这个地址与XCP的实际ECU内存不需要完全匹配,其字节序(Endian)也可以针对每个从结点来选择。因此,在车载网络上可以连接到多个ECU,即使存在不同的地址空间(16位,32位),或者不同的地址字节序,主结点都可以经过适当处理,使得所有的都可以测量/校准。

XCP除了同步测量,还可以做异步测量。异步测量是使用主结点发送的命令,通过指定的XCP地址来提取从结点的ECU内部的数据,并通过从结点的应答将该数据传送给主结点,如此循环往复来实现的。为了取出数据,使用PID为“0xF4”的命令“SHORT_UPLOAD”。这个命令和应答的格式如下所述。

SHORT_UPLOAD命令:

CTO 0字节位置,指定为PID“0xF4”
CTO 1字节位置,指定为取出字节数。最大为MAX_CTO – 1字节
CTO 2字节位置,保留字段
CTO 3字节位置,指定为要读出的8位扩展地址
CTO 4~7字节位置,指定为要读出的32位地址

SHORT_UPLOAD应答:

CTO 0字节位置,指定为PID“0xFF”
CTO 1~MAX_CTO字节位置,指定为取出的数据
图14是主结点使用“SHORT_UPLOAD”,在XCP扩展地址为“0”、XCP地址为“0x00124A5C”的位置,每100ms取出4字节的过程的跟踪结果。

图14:通过SHORT_UPLOAD命令的测量

在上述异步测量的情况下,主结点决定了测量时间。为了使测量与ECU的控制相匹配,有必要由ECU确定测量时机,并在数据取出来后由从结点发送到主结点。这种数据通信是通过DTO来完成的。

主结点在进行同步测量之前,通过命令指定要取出的数据的XCP地址,从结点在等到同步测量开始命令后,使用DTO发送到主结点。因此,在同步测量的情况下,不是通过命令和应答的组合,而是通过测量周期或事件,由从结点发送DTO报文到主结点。

图15展示了,由“START_STOP_SYNCH”命令开始的测量同步,从结点持续地将测量数据通过DTO报文发出,直到收到“START_STOP_SYNCH”命令才停止的实际的跟踪结果。

图15:同步测量的开始和停止

当到达测量的控制周期,或者事件发生时,进行处理并通知到XCP从结点。

主结点:

确定要同步测量的内存及其测量周期,指定同步测量的XCP地址,并使用命令启动和停止同步测量。

从结点:

它管理从主结点指定的同步测量的XCP地址。然后,从检测的开始同步测量后,直到停止之前,会根据上述ECU的控制应用程序传达的被管理的XCP地址,从取出内存值并发送DTO报文。

关于同步测量,在XCP标准文档中使用了各种术语。这里我们解释一下主要的术语和概念。

元素(Element):

通过XCP地址来指定的一个测量对象的内存。

对象描述表(ODT:Object Description Table): 

归并元素的测量内存,在一个DTO报文中聚集最多的可发送的内存的表。

ODT条目(Entry):

为创建ODT的元素的测量对象的XCP地址。

DAQ列表(List):

这是一个ODT的集合。这决定了在一个同步测量的周期或者事件触发时要测量的内存数量。ODT与一个DTO报文相关联,由MAX_DTO - PID决定了最大的大小,但由于实际测量的内存可能会大于此值,因此分为了ODT和DAQ列表。

事件通道(Event Channel):

在同步测量的控制周期和事件触发的通道,也即是“种类”的意思。同步测量的时序都是基于这个事件通道的。

同步测量的处理

下面将说明,在同步测量中,ECU的控制应用程序向从结点发送测量的时机,将执行怎样的处理。

(1)控制应用程序要通知从结点测量时机。这个通知通常是将事件通道作为参数,来调用从结点的驱动过程来实现的。
(2)针对主结点以ODT条目来指定的测量对象的内存地址,从结点使用缓冲区来管理,在每次被控制应用程序调用时,都会根据该缓冲区来读取指定地址的内存。
(3)读取的内存以ODT为单位合并,并以DAQ列表来生成DTO报文。
图16展示了,元素和ODT条目、DAQ列表和ECU控制应用程序之间的关系。当ECU的控制应用程序集成了Vector的从结点驱动程序后,调用C语言函数“XcpEvent(事件通道)”,就会根据ODT条目的缓冲区,从ECU内存中读出元素的值来创建出DTO报文。

图16:XCP和控制应用程序的关系

图17展示了,作为测量对象的元素从在ECU内存,到在网络上传输的DTO报文之间的关系。


图17:元素和DTO报文的关系

在图17中,是根据ODT条目测量的七个元素的结果,取出的“0x19”“0x6C”“0xF0”“0xBF”“0xC0”“0xA9”“0x02”,作为一个ODT的DTO报文就创建好了。在这个DTO报文中,PID包含在第一个字节,测量时元素的内容被包括从第二个开始的字节中。像这样的,PID的值是从“0”到“0xFB”的DTO报文被称为“DAQ”。

就像这样,从作为测量对象的ECU内存、管理测量对象的ODT的DAQ列表、决定测量时机的控制应用应用程序和用于区分测量时机的事件通道开始,到最后使用DTO报文将测量数据发送到主结点,就实现了同步测量。

除了上面描述的那些之外,根据测量的规模和用途,还有XCP同步测量的各种使用形式。下面将介绍这些使用形式中比较典型的例子。

通过增加管理测量目标的DAQ列表中的ODT及其条目的数量,可以增加测量的测量点的数量。而且通过维持与要测量的事件通道数量一样多的DAQ列表,可以对ECU的所有测量时机进行测量。但是这些数量的增加会增大ECU中的管理缓冲区,因此会消耗ECU的内存。

而且如果ECU具有10ms和25ms的控制周期,有的10ms的控制周期中测量的测量点的数量很大,别的25ms的控制周期中测量的测量点的数量也很大,根据测量的场景不同,测量点的数量会有不同。对于这样的应用程序,有一种称为“动态DAQ”的功能,可以允许从结点动态更改每次测量的DAQ列表、ODT和ODT条目的数量。相反的,如果在集成XCP驱动程序时,这些数量是预先确定的,则称为“静态DAQ”。一个从结点将具有静态或动态DAQ功能。

在主从结点间的通信中,如果因为加入网关而造成时间差,又或者因为使用无线通信,使得通信时间出现波动的情况下,同步测量中的测量时间对于主结点来说是“不确定”的。为了防止这种情况,要使用“带时间戳的DAQ”。在从结点侧,包含测量时间的时间戳的DAQ,通过DTO报文传送给主结点。而收到这个报文的主结点,可以读出所添加的时间戳来知道正确的测量时间。

校准是为了重写ECU内部软件中的参数,而从主结点发送指定XCP地址的命令和重写数据的命令,从结点会对应的导出适当的参数地址、执行重写,并返回一个应答。图18显示了,根据XCP主结点发送的XCP扩张地址“0”、XCP地址“0x0041D5C8”,将该地址开始的2字节的参数,重写为“0x0064”的示例的跟踪结果。

图18:通过DOWNLOAD命令的校准

XCP仅在测量/校准方面就还有很多的功能。除了这次我们介绍的之外,还包括诸如对ECU中的闪存之类的非易失性存储器的访问功能、对ECU的访问保护的功能等许多功能。

推荐阅读:

汽车48V系统架构设计与电磁兼容等全解析

软件定义汽车时代电子电气架构的思考

版权声明


相关文章:

  • pcap_open2024-12-17 07:01:01
  • 检测网络连接问题windows网络诊断2024-12-17 07:01:01
  • python中与或非2024-12-17 07:01:01
  • linux中chmod是什么意思2024-12-17 07:01:01
  • 五大推荐系统算法2024-12-17 07:01:01
  • 若快网络科技游戏开发的游戏2024-12-17 07:01:01
  • 一句话木马教程2024-12-17 07:01:01
  • 程序员如何接私活2024-12-17 07:01:01
  • 左移右移运算符号2024-12-17 07:01:01
  • 串口调试助手使用说明2024-12-17 07:01:01