ECU软件UDS刷写概述

您所在的位置:网站首页 什么叫7766格式 ECU软件UDS刷写概述

ECU软件UDS刷写概述

2023-12-29 03:58| 来源: 网络整理| 查看: 265

解决故障诊断问题时,经常需要刷写软件,常用的ECU软件刷写有几种方法,包括UDS刷写,XCP刷写和调试工具Lauterbach刷写等。对于非底层软件工程师,一般只会用到前两种,更多的是UDS刷写,即通过UDS有关服务实现软件刷写到ECU非易失性存储器中。接下来,本文将主要介绍与软件刷写相关的服务,包括例程控制服务($31)、请求下载服务($34)、数据传输服务($36)和请求传输退出服务($37)。本文将首先了解下刷写文件的格式与内容,然后介绍利用这些服务如何进行软件刷写,同时也会根据ISO14229标准对这些服务做些补充说明。

1 刷写文件的格式与内容

软件刷写是指将软件程序烧录到ECU芯片内存的特定地址段,然后ECU就会运行该软件程序,去实现其特有的功能。常用的ECU刷写文件格式有:Hex, s19和bin等其他格式,这些文件的具体解释可参考以下博文:

s19文件格式详解_xxxl的专栏-CSDN博客_s19文件

hex文件说明_xiaohu1996的博客-CSDN博客_hex文件

STM32编译生成的BIN文件详解_sh的博客-CSDN博客

总的来说,不管是哪种格式,这些文件都必须包含:存储地址,数据,校验和(checksum),记录类型和记录长度等信息。

为什么必须需要这些信息?因为我们是需要将软件刷写到芯片内存规定的区域,假设要刷写到PFlash的空间1,2,如下图所示。

那么刷写时就必须知道要刷到哪里(即起始地址和结束地址),刷写空间够不够大,刷写是否正确完成(即通过校验和校验)。所以刷写文件就必须要包含这些信息,才能保证刷写的质量。下面再通过一个hex格式文件来了解一下,将其导入Hexview后,可以发现原来Hex文件的内容具体代表了什么内容,如下所示:

当要进行刷写时,Hex文件的内容所包含的这些信息都会通过专用的工具解析出来,比如使用Canape脚本进行刷写时,那么就可使用Canape相应函数去解析,然后将解析的信息通过UDS服务来刷写。

2 UDS刷写过程

UDS刷写的前提是要先进入编程会话模式,然后在此模式下请求种子和钥匙进行ECU解锁,以此来获得读写权限,再开始进行刷写操作,根据ISO14229协议可知,ECU软件的基本刷写步骤是:

·         先请求例程控制($31),

·         然后请求下载($34),

·         再进行数据传输($36),

·         最后数据传输完毕,则请求数据传输退出($37),验证校验和。

下面就开始介绍这些基本的步骤过程,首先看例程控制($31)。

例程控制是指客户端请求服务端开始,停止一个例程或请求例程结果,主要用来擦除内存、复位或学习自适应值,或运行一个self-test等功能。

·         例程控制的请求格式为:SID+SF+RID+非必须选项;

·         例程控制的正响应格式为:(SID+40)+SF+RID+非必须选项。

这里开始以一个基本的刷写过程为例:假设需擦除内存的从地址0xA0000000开始,大小为0x00010000的信息,执行完例程控制后,目标位置的信息成功擦除。那么如下所示:

这里:

·         0x01表示开始一个例程,

·         0xFE00为RID(RoutineIdentifier),该RID具体如何使用由用户自定义,比如这里0xFE00应该由系统供应商来定义,定义的是擦除动作;

·         0xA0000000为擦除的起始地址,0x00010000为擦除的大小;

·         服务端响应的第5个字节表示擦除的状态,0x01表示擦除成功。

当擦除成功后,接着就请求下载($34),即从客户端发起一个数据传输到服务端,服务端接收到请求后,将会做一系列的动作,检查是否能下载,一切都ok的话则正响应给客户端。请求下载的请求和正响应格式如下所示:

接着上述的请求例程,请求下载服务通信如下所示:

这里,

·         0x00为数据格式标识符,表示通用刷写(刷写还有压缩刷写和加密刷写等方式);

·         0x44为长度格式标识符,前面4表示内存大小所占的字节数,即对应的0x0001000的长度,4个字节,后面4表示内存地址所占的字节数,即对应的0xA0000000的长度。0x20同样为长度格式标识符,表示0xF000的长度;

·         0xF000为数据传输时,每次所允许最大的数据块,即指36 01 xx xx xx.......xx的大小。

当客户端接收到请求下载的正响应,则说可以开始传输数据,那么客户端将按照每次0x0F00的数据量传输数据($36),如下所示。

这里,刷写文件的数据就会按照一一对应的地址逐块地被刷写到内存中,当数据刷写完毕,则请求传输退出($37),验证校验和。

这里,

·         0xFE01为RID,表示校验和验证;

·         0xDAE51241为预期的校验和;

·         0x80008000为校验和的起始地址,0x0000FF00为校验和地址的大小,即软件将根据起始地址和地址大小来获取这块空间的数据,通过既定的算法计算得到一个实际的校验和,比较实际的和预期的校验和,两者说明刷写的数据正确,这时服务端就会正响应。

3 总结

以上就是介绍如何使用UDS服务,包括例程控制服务($31)、请求下载服务($34)、数据传输服务($36)和请求传输退出服务($37)来实现一个软件刷写的基本步骤。关于这些服务具体是如何实现其规定的功能,本质上是这些服务映射了相应功能的函数或函数组,也就是说当请求该服务时,会将服务中的参数传递给映射的函数,然后这些函数去运行实现该服务的功能,比如下载服务,相应的函数将会根据地址信息找到NvM的地址,请求Nvm的写函数,将下载服务传递的数据写入到NvM,这样来实现一条服务数据的刷写。当然上述只是较为简单地概述了利用UDS刷写相关的服务进行基本的刷写过程,若要了解更为详细的刷写服务定义和刷写例程,一方面可以参考ISO14229-1 UDS协议,另一方面也可以记录一个软件刷写的整个过程,以此真切看到刷写都有用到哪些UDS服务以及各服务的执行顺序。

Reference:

[1]ISO14229-1: Road vehicles — Unified diagnostic services (UDS) —Part 1: Specification and requirements

作者:谦益行 文章来源:上汽零束SOA开发者论坛  原文链接:https://bbs.z-onesoft.com/omp/community/front/api/page/mainTz?articleId=7766



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3