UDS学习笔记(六)——程序刷写
前言
距離上次寫UDS學(xué)習(xí)筆記過去一年了,在這一年里學(xué)習(xí)到了很多知識。對UDS也有更深的理解了。其中我還通過CAPL寫了一個基于UDS的程序刷寫軟件。其源碼是基于CSDN上的文章,希望大家通過這篇文章能夠?qū)DS有更深的理解。
在刷寫前要將軟件解析為二進制,由于我這邊的軟件為HEX文件,而那個博主只提供了CAPL對S19文件的解析,在其基礎(chǔ)上,我寫了一個對HEX文件解析。
刷寫流程
下面我以那篇文章為基礎(chǔ),給大家介紹一下使用UDS刷寫的流程。首先刷寫流程分為三大狀態(tài):刷寫前,刷寫時,刷寫后。因此在CAPL中定義了三個刷寫狀態(tài):
enum {Pre_programming,Programming,Post_Programming}programming_state;而刷寫前我們需要做的步驟為:
刷寫前:切換為擴展模式(Extended_Session,10服務(wù),03子服務(wù))->測試是否正常(3E服務(wù))->關(guān)閉DTC(85服務(wù),02關(guān)閉故障儲存,需要注意的是要關(guān)閉所有的ECU,因此是功能地址)->關(guān)閉總線通信(關(guān)閉各個ECU發(fā)送數(shù)據(jù),提高刷寫速度,28服務(wù),03子服務(wù)。需要注意的是要關(guān)閉所有的ECU,因此是功能地址)->發(fā)送Security_Access_Seed->發(fā)送Security_Access_Key->切換到刷寫模式。
刷寫時:清除Falsh(Erase_Flash)->請求下載數(shù)據(jù)(Request_Download)->傳輸數(shù)據(jù)(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;由于上位機也要識別是否刷寫完成,因此定義以下變量控制刷寫進程。用與表示刷寫還未開始、正在刷寫、刷寫已經(jīng)結(jié)束。
enum {PROG_NOT_STARTED,PROG_INPROGRESS,PROG_STOPED}prog_status=PROG_NOT_STARTED;?
?
一些總結(jié)
物理地址與功能地址的區(qū)別:物理地址每個ECU都不同,功能地址ECU都相同。因此通過功能地址可以請求總線上的所有設(shè)備。
在清除Falsh的時候,請求的參數(shù)為buff起始地址以及buff的結(jié)束地址,可以一次性把要刷寫的區(qū)域清空。
而在請求下載數(shù)據(jù)的時候,請求的參數(shù)為buff的起始地址以及buff的大小,可以一次性把要刷寫的區(qū)域清空。
?
在github上找了好幾個刷寫固件的源碼,那么接下來通過源碼來分析刷寫程序的步驟吧
https://github.com/satish77/ip_uds_bl_tool
https://github.com/GoodnightV/UDS-based-Refresher/blob/master/DiagboxSRC/src/main.cpp
總結(jié)
以上是生活随笔為你收集整理的UDS学习笔记(六)——程序刷写的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#开发移动应用系列(2.使用WebVi
- 下一篇: greenplum vacuum清理删除