前几期文章讲到了ECU软件更新的时候用到的几个服务,今天就来介绍一下,在具体升级过程中,我们是如何将C代码编译出来的文件下载进ECU的。
常见的S-Record文件有.s19/.s28等,在下载的时候主要用TransferData (0x36)服务将解析到的数据下载到ECU中。下面就来介绍S-Record文件的格式。
S-Record文件中的数据都是以ASCII码的格式存储的,一行数据个数不超过78个,例如下面这个例子:
图1 S-Record示意
下面对这种格式进行解释:
图2 S-Record格式示意
type:类型,占两个字符,如上图1所示的"S0"等,一共有8种type的划分(S0, S1, S2, S3, S5, S7, S8, S9);
count:数据长度,占两个字符,两个字符组合成十六进制数,即为一行数据个数(包含address data checksum),例如图1第一行所示"06",组合起来即为0x06;
address:占4,6或者8个字符,这和type有关,指的是这一行数据存储的Memory起始地址;
data:占0-64个字符,这部分数据就是往0x36服务里填充的数据;
checksum:每一行最后两个字符。
不同type对应不同的address长度:
type | address |
---|---|
S0 Record | 没有address |
S1 Record | 2个字节的地址,占4个字符 |
S2 Record | 3个字节的地址,占6个字符 |
S3 Record | 4个字节的地址,占8个字符 |
S5 Record | 没有数据域,可以不用管这个类型的 |
S7 Record | 没有数据域,可以不用管这个类型的 |
S8 Record | 没有数据域,可以不用管这个类型的 |
S9 Record | 没有数据域,可以不用管这个类型的 |
示例:
图3 S-Record文件解析示例
假设上图一个S-Record文件,用notepad 打开如图所示。
文件包含S0,S1,S5,S9类型的Record,S0,S5,S9 Record里面没有需要填充的数据,故跳过。
文件第二行:
- S1表示type
- 后面的"13"表示这一行数据的长度0x13,2个byte的address,16个byte的数据,1个byte的checksum
- "0000",表示存储数据的内存地址为0x0000
- address后面跟每两个ASCII码组合起来的十六进制数,有16个byte,例如,"28"表示0x28,"5F"表示0x5F
- 最后两个ASCII码组合成1个byte的checksum,例如,"2A"表示checksum = 0x2A
最后我们用代码将画红色框部分的数据提取出来,用TransferData (0x36)进行数据传输即可。
--------------------------------------------------------------------------------------
参考资料:http://www.amelek.gda.pl/avr/uisp/srecord.htm