//================================================ ========================
//TITLE:
// S-Record格式詳解
//AUTHOR:
// norains
//DATE:
// Friday 25-April-2008
//Environment:
// NULL
//================================================ ========================
一個完整的MOTOROLA S-Record格式數據包含如下區域:
<type> <length> <address> <data> <checksum>
各字段的意思分別如下:
<type>:標示記錄的類型,該字段佔據1-byte。它可以有如下數值:“S0”, “S1”, “S2”, “S3”, “S5”, “S7”, “S8” , “S9”
“S0” --記錄描述信息
“S1”, “S2”, “S3” --記錄存儲的數據。這三者的區別在於地址(address)的長度不同,S1為2-byte,S2為3-byte,以及S3為4-byte。
“S5” --包含了“S1”, “S2”, “S3”的信息。
“S7”, “S8”, “S9” --確定程序的開始地址。這三者的區別也在於地址(address)的長度不同,S9為2-byte,S8為3-byte,以及S7為4-byte。
<length>:標示了數據的長度,確切地說,是<address>, <data>和<checksum>這三個字段的byte的個數。該字段佔據1-byte。
<address>:標示了數據寫入的起始地址。該字段的長度取決於<type>的取值。
<data>:標示了存儲的數據。該字段佔據的byte個數可以這樣計算:<length>的值- <address>字段的長度(取值為2、3、4) - 1(<checksum>字段的長度)
<checksum>:標示校驗位,佔據1-byte。該數據可以由<address>和<data>的數據累加然後每bit取反獲得。
最後我們以一條數據記錄格式作為例子:
S30A801000930300000000CF
S3是記錄的格式(<type>)。
0A是長度(<length>),為十六進制,標識有10個byte。因為兩個十六進制才是1-byte,所以801000930300000000CF的長度為10而不是20.換句話說,這數據列應該如此表示:80 10 00 93 03 00 00 00 00 CF。
因為type是S3,所以地址(<address>)佔4-byte,因此需要寫入的地址為:0x80100093。
既然已經知道了地址,那麼數據(<data>)很顯然就是0x0300000000了。
最後的1-byte就是校驗位(<chksum>)。
例子數值由此得來:0xFF - ((0x0A + 0x80 + 0x10 + 0x00 + 0x93 + 0x03 + 0x00 + 0x00 + 0x00 + 0x00) & 0xFF)