UDS协议:与刷写程序相关的功能单元

发布于 2023-2-15 15:41
浏览
0收藏

欢迎来到《UDS协议详解系列》的第4篇文章,本文主要介绍与软件刷写相关的服务,包括例程控制服务($31)、请求下载服务($34)、数据传输服务($36)和请求传输退出服务($37)。首先了解下刷写文件,然后介绍利用这些服务如何进行软件刷写,同时也会根据ISO14229标准对这些服务做些补充说明。

UDS协议:与刷写程序相关的功能单元-汽车开发者社区

刷写文件

软件刷写是指将软件程序烧录到ECU芯片内存的特定地址段,然后ECU就会运行该软件程序,去实现其特有的功能。常用的ECU刷写文件格式有:Hex, s19, bin等其他格式。


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


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

UDS协议:与刷写程序相关的功能单元-汽车开发者社区

图1


那么刷写时就必须知道要刷到哪里(即起始地址和结束地址),刷写空间够不够大,刷写是否正确(即通过校验和校验)。所以刷写文件就一定包含了这些信息。通过一个hex格式文件导入Hexview来具体感受下。

UDS协议:与刷写程序相关的功能单元-汽车开发者社区

图2 Hex内容的解析示意


而这些信息在刷写时会通过专用的工具解析出来,比如用Canape脚本刷写,那么就可使用Canape相应函数去解析。然后将解析的信息供UDS服务使用。

刷写过程

由前面文章不难发现,刷写程序前应该要做一些准备工作:先进入到编程会话模式,然后进行ECU解锁,以获得读写权限,再开始刷写,根据ISO14229标准可知,基本刷写步骤是:


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


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


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


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


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


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


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


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


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

UDS协议:与刷写程序相关的功能单元-汽车开发者社区

这里:


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


  • 0xFE00为RID(RoutineIdentifier),该RID具体如何使用由用户自定义,比如这里

     0xFE00应该由系统供应商来定义,定义的是擦除动作;


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


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


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

UDS协议:与刷写程序相关的功能单元-汽车开发者社区

UDS协议:与刷写程序相关的功能单元-汽车开发者社区

图3 引自[1]


接着上述请求例程,请求下载如下所示:

UDS协议:与刷写程序相关的功能单元-汽车开发者社区

这里,


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


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


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


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

UDS协议:与刷写程序相关的功能单元-汽车开发者社区

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

UDS协议:与刷写程序相关的功能单元-汽车开发者社区

这里,


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


  • 0xDAE51241为预期的校验和;


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


以上就是介绍如何使用UDS协议实现一个刷写过程的基本步骤,关于这些服务的具体定义和刷写例程的例子可参考ISO14229-1标准。


文章转载自公众号:汽车电子与软件


分类
标签
1
收藏
回复
举报
回复
相关推荐