ARM微處理器ISP升級程序設(shè)計與應(yīng)用
下面為對ISP2106讀器件ID的完整的過程: OPEN COM bps:9600, StopBits:1, Parity:No, DataBits:8
WRITE 0x3F
?
READ 0x53 0x79 0x6E 0x63 0x68 0x72 0x6F 0x6E 0x69 0x7A 0x65 0x64 0x0D 0x0A
Synchronized\
WRITE 0x53 0x79 0x6E 0x63 0x68 0x72 0x6F 0x6E 0x69 0x7A 0x65 0x64 0x0D 0x0A
Synchronized\
READ 0x53 0x79 0x6E 0x63 0x68 0x72 0x6F 0x6E 0x69 0x7A 0x65 0x64 0x0D 0x0A 0x4F 0x4B 0x0D 0x0A
Synchronized\OK\
WRITE 0x31 0x32 0x30 0x30 0x30 0x0D 0x0A
12000\
READ 0x31 0x32 0x30 0x30 0x30 0x0D 0x0A 0x4F 0x4B 0x0D 0x0A
12000\OK\
WRITE 0x55 0x20 0x32 0x33 0x31 0x33 0x30 0x0D 0x0A
U 23130\
READ 0x55 0x20 0x32 0x33 0x31 0x33 0x30 0x0D 0x0A 0x30 0x0D 0x0A
U 23130\0\
WRITE 0x4A 0x0D 0x0A
J\
READ 0x4A 0x0D 0x0A 0x30 0x0D 0x0A
J\0\
READ 0x34 0x32 0x39 0x33 0x39 0x38 0x34 0x30 0x35 0x30 0x0D 0x0A
4293984050
其中WRITE和READ是針對PC而言的。
UU編碼簡介
向FLASH中燒寫的程序代碼是通過UU編碼之后傳給微處理器的。
UU編碼算法將3字節(jié)二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成4字節(jié)可打印的ASCII字符集。因為Hex格式是將1字節(jié)二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成2字節(jié)ASCII數(shù)據(jù),所以UU編碼的效率高于Hex格式。
UU編碼的編碼方法如下:
因為3字節(jié)二進(jìn)制數(shù)據(jù)共24Bits,把它們按6Bits分成4份,這樣就變成了4個字節(jié),再把新生成的4個字節(jié)每個都加上0x20,若這樣處理后的數(shù)值為0x20,則用0x60取代。用C語言表示的UU編碼過程如下:
#define ENCODE_BYTE(b) (((b) == 0) ? 0x60 : ((b) + 0x20))
outbuf [0] = ENCODE_BYTE ((inbytep [0] 0xFC) 》 2);
outbuf [1] = ENCODE_BYTE (((inbytep [0] 0x03) 《 4) +
?。ǎ╥nbytep [1] 0xF0) 》 4));
outbuf [2] = ENCODE_BYTE (((inbytep [1] 0x0F) 《 2) +
?。ǎ╥nbytep [2] 0xC0) 》 6));
outbuf [3] = ENCODE_BYTE (inbytep [2] 0x3F);
若原數(shù)據(jù)字節(jié)數(shù)不是3的倍數(shù),則以0x00填充。
數(shù)據(jù)通過UU編碼之后,以UU編碼行的形式打包發(fā)送。
UU編碼行的第一個字節(jié)表示數(shù)據(jù)的長度,且為UU編碼。
UU編碼規(guī)定:任何UU編碼行的長度都不應(yīng)超過61個字節(jié)(字符),也就是說,一個UU編碼最多可以包含45字節(jié)原始的二進(jìn)制數(shù)據(jù)。
例如,對一個用十六進(jìn)制表示的數(shù)據(jù)“18F09FE518F09FE518F09FE518F09FE5”,(注意該數(shù)據(jù)實際長度為16字節(jié),因為顯示的問題,這里采用HEX表示。)在經(jīng)過UU編碼之后,數(shù)據(jù)變?yōu)椤癕/"?Y1CPG^48\)_E/"?Y1CPG^6`7R"Y\/\?Y1CPG^7`````0````$0```!(”。
LPC2000系列微處理器UU編碼發(fā)送規(guī)則
LPC2000系列微處理器規(guī)定:
1.發(fā)送器(通常為PC)以UU編碼行的形式發(fā)送實際數(shù)據(jù),且每個數(shù)據(jù)包都以 “\”結(jié)束,所以在UU編碼行長度為61字節(jié)的時候,發(fā)送器實際發(fā)送的數(shù)據(jù)長度為63字節(jié)(61個字節(jié)UU編碼+2字節(jié)“\”)。
2.在發(fā)送20個UU編碼行之后,應(yīng)該發(fā)送數(shù)據(jù)校驗和。
數(shù)據(jù)校驗和即為上次校驗和計算之后所有發(fā)送的原始數(shù)據(jù)的和。
數(shù)據(jù)校驗和以ASCII碼的方式發(fā)送,以 “\”結(jié)束。
接收器在收到校驗和后與它接收的數(shù)據(jù)的校驗和相比較,如果校驗和匹配,接收器就發(fā)送“OK\”,并等待下一次發(fā)送。如果校驗和不匹配,接收器就發(fā)送“RESEND\”。
3.在數(shù)據(jù)發(fā)送結(jié)束,即使不足20個UU編碼行也仍然應(yīng)該發(fā)送數(shù)據(jù)校驗和。
由于FLASH的燒寫通常是以4096字節(jié)為單位的,所以在每發(fā)送4096字節(jié)之后也必須發(fā)送一個數(shù)據(jù)校驗和。(4096字節(jié)=91個UU編碼行+1個字節(jié)=4×20個UU編碼行+11UU編碼行+1個字節(jié))
所以實際發(fā)送4096字節(jié)數(shù)據(jù)的過程如下:
WRITE 63BYTES(1)
WRITE 63BYTES(2)
WRITE 63BYTES(3)
……
WRITE 63BYTES(18)
WRITE 63BYTES(19)
WRITE 63BYTES(20)
WRITE CHECKSUM(已發(fā)送900字節(jié))
WRITE 63BYTES(21)
WRITE 63BYTES(22)
WRITE 63BYTES(23)
……
WRITE 63BYTES(38)
WRITE 63BYTES(39)
WRITE 63BYTES(40)
WRITE CHECKSUM(已發(fā)送1800字節(jié))
WRITE 63BYTES(41)
WRITE 63BYTES(42)
WRITE 63BYTES(43)
……
WRITE 63BYTES(58)
WRITE 63BYTES(59)
WRITE 63BYTES(60)
WRITE CHECKSUM(已發(fā)送2700字節(jié))
WRITE 63BYTES(61)
WRITE 63BYTES(62)
WRITE 63BYTES(63)
……
WRITE 63BYTES(78)
WRITE 63BYTES(79)
WRITE 63BYTES(80)
WRITE CHECKSUM(已發(fā)送3600字節(jié))
WRITE 63BYTES(81)
WRITE 63BYTES(82)
WRITE 63BYTES(83)
WRITE 63BYTES(84)
WRITE 63BYTES(85)
WRITE 63BYTES(86)
WRITE 63BYTES(87)
WRITE 63BYTES(88)
WRITE 63BYTES(89)
WRITE 63BYTES(90)
WRITE 63BYTES(91)
WRITE 7 BYTES
WRITE CHECKSUM(已發(fā)送4096字節(jié))
注意上面只包含的PC向微處理器寫數(shù)據(jù)的情況,實際上若沒關(guān)閉“回聲”,微處理器會將上面所有數(shù)據(jù)回發(fā)一次,另外還有校驗和響應(yīng)等。
評論