UDS学习笔记(六)——程序刷写

前言

距离上次写UDS学习笔记过去一年了,在这一年里学习到了很多知识。对UDS也有更深的理解了。其中我还通过CAPL写了一个基于UDS的程序刷写软件。其源码是基于CSDN上的文章,希望大家通过这篇文章能够对UDS有更深的理解。

在刷写前要将软件解析为二进制,由于我这边的软件为HEX文件,而那个博主只提供了CAPL对S19文件的解析,在其基础上,我写了一个对HEX文件解析。

刷写流程

下面我以那篇文章为基础,给大家介绍一下使用UDS刷写的流程。首先刷写流程分为三大状态:刷写前,刷写时,刷写后。因此在CAPL中定义了三个刷写状态:

  enum {Pre_programming,Programming,Post_Programming}programming_state;

而刷写前我们需要做的步骤为:

刷写前:切换为扩展模式(Extended_Session,10服务,03子服务)->测试是否正常(3E服务)->关闭DTC(85服务,02关闭故障储存,需要注意的是要关闭所有的ECU,因此是功能地址)->关闭总线通信(关闭各个ECU发送数据,提高刷写速度,28服务,03子服务。需要注意的是要关闭所有的ECU,因此是功能地址)->发送Security_Access_Seed->发送Security_Access_Key->切换到刷写模式。

刷写时:清除Falsh(Erase_Flash)->请求下载数据(Request_Download)->传输数据(Transfer_Data)->推出传输(Transfer_Exit)

刷写后:重置(Reset)

因此定义一下

  enum{Extended_Session=0,TesterPresent,Disable_DTC,Disable_Communication,Programming_Session,Pending_Programming,Security_Access_Seed,Security_Access_Key,Erase_Flash,Request_Download,Transfer_Data,Transfer_Exit,Reset,Stop}prog_step=Extended_Session;

由于上位机也要识别是否刷写完成,因此定义以下变量控制刷写进程。用与表示刷写还未开始、正在刷写、刷写已经结束。

  enum {PROG_NOT_STARTED,PROG_INPROGRESS,PROG_STOPED}prog_status=PROG_NOT_STARTED;

 

 

一些总结

物理地址与功能地址的区别:物理地址每个ECU都不同,功能地址ECU都相同。因此通过功能地址可以请求总线上的所有设备。

在清除Falsh的时候,请求的参数为buff起始地址以及buff的结束地址,可以一次性把要刷写的区域清空。

而在请求下载数据的时候,请求的参数为buff的起始地址以及buff的大小,可以一次性把要刷写的区域清空。

 

在github上找了好几个刷写固件的源码,那么接下来通过源码来分析刷写程序的步骤吧

https://github.com/satish77/ip_uds_bl_tool

https://github.com/GoodnightV/UDS-based-Refresher/blob/master/DiagboxSRC/src/main.cpp

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值