//================================================ ========================
//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)



 

    全站熱搜

    立你斯 發表在 痞客邦 留言(0) 人氣()