Freescale公司的MC68HC908JB8(簡稱“JB8”)是HC908系列中的一種,。它包括USB接口,,是專為計算機(jī)人機(jī)接口設(shè)備設(shè)計的,。
諸如鼠標(biāo),、鍵盤等應(yīng)用,。JB8包含8KB的Flash用戶存儲區(qū)和16字節(jié)的中斷復(fù)位向量,使用它內(nèi)部產(chǎn)生的升壓泵就可以實現(xiàn)F1ash的燒寫和擦除,,而不需要高電壓,。
ICP是一種在實際的目標(biāo)電路板上燒寫和擦除芯片的方法,無需從目標(biāo)板上將芯片卸下來再編程實現(xiàn)用戶程序的修改,。這種方法適用于產(chǎn)品開發(fā)和代碼升級,。目前市面上很多芯片(如Philips公司的P89C51、P89V51和LPC932A1,,STC89C51和STC89L516RD+,,以及AVR公司的ATmega8系列等)都支持串口ICP方式。本文采用USB接口的ICP方法,,燒寫速度快,,無需專用的電平轉(zhuǎn)換芯片,硬件通過微處理器JB8的USB接口與計算機(jī)USB口連接即可,。
1 底層軟件實現(xiàn)方法
1.1 Flash配置
為使用ICP通信連接的USB接口,,必須修改JB8中的用戶代碼以識別預(yù)先為ICP定義的USB命令。因此在出廠前,,必須將ICP代碼燒入JB8中,。JB8的Flash配置如圖1所示。
圖1中,,用戶Flash區(qū)范圍為$DC00~$FBFF,,用戶Flash向量區(qū)是從$FFFO到$FFFF,。ICP的配置中:ICP的代碼是從$F800到 $FBFF。用戶Flash向量區(qū)在ICP操作中是不能再編程的,,這兩個區(qū)是JB8事先寫入的,ICP操作可以對$DCOO~$F7FF的Flash區(qū)(圖1中陰影區(qū))進(jìn)行擦除和燒寫,。
1.2 向量重定位
因為ICP的操作只能對用戶代碼進(jìn)行編程和燒寫,,不能擦除用戶Flash向量,且用戶F1ash向量是固定的,,因此在用戶代碼中的中斷服務(wù)子程序地址必須重新定位到合適的地址,。這種重新定位是通過“假”向量來實現(xiàn)的,3字節(jié)的假向量包括JMP指令和在用戶代碼中的中斷服務(wù)子程序的絕對地址,。圖2中指出了假向量是如何重定位的,。只有復(fù)位向量沒有重新定位,總是指向$F800(ICP代碼的入口地址),。
表1列出了中斷向量地址和重定位“假”向量地址,。
1.3 安全密鑰防止非法訪問
$FFF6~$FFFD的8字節(jié)內(nèi)容用于進(jìn)入JB8的監(jiān)控模式。監(jiān)控軟件能完全訪問F1ash區(qū),,正常情況下,,8字節(jié)的安全密鑰是不可能被猜出的,因為這些中斷服務(wù)程序的起始地址是被固化到用戶代碼區(qū)中的,。
1.4 在ICP期間防止掉電的措施
配置ICP時必須考慮到ICP子程序運(yùn)行過程中有可能掉電,,系統(tǒng)必須能夠恢復(fù)和完成ICP程序。ICP_FLAG字的設(shè)計正是基于此目的,。復(fù)位后讀ICP_FLAG字,,決定JB8是進(jìn)入正常的工作模式還是ICP模式。該字地址是$F7FE,,在用戶代碼區(qū)的最后2個字節(jié),。復(fù)位之后,復(fù)位向量地址$FFFE~$FFFF指向ICP程序入口地址$F800,,一旦初始化完成,,檢查進(jìn)入ICP模式或用戶模式的條件。在以下2種情況下JB8進(jìn)入ICP模式:
?、?ldquo;假”向量的高字節(jié)$FF7C是無效的,,即不在$DC和$F7之間;
?、贗CP_FLAG字不等于校驗和,。否則,JB8進(jìn)入正常的工作模式,。
1.5 ICP編程
ICP編程流程圖如圖3所示,。
一旦用戶代碼被燒入芯片,,而“假”向量的高字節(jié)在無效的范圍($DC~$F7),同時ICP_FLAG被寫入校驗和(不能是$0000),,則在插撥USB設(shè)備后,,ICP代碼跳轉(zhuǎn)到正常操作的用戶模式。
進(jìn)入JB8 ICP模式有2種方式:ICP_FLAG被寫入$0000,,或者PTA0被下拉成低電平,。用戶代碼包括特別的命令來編寫ICP_FLAG,一旦ICP_FLAG被寫入零,,則再次插撥上電后,,JB8進(jìn)入ICP模式。ICP指令支持有限的USB標(biāo)準(zhǔn)協(xié)議,,如讀取描述符和狀態(tài)字,,設(shè)置地址和配置字,以及清特征字,。
本文使用了一些必要的擦除,、編程、校驗Flash命令,,如表2所列,。
在使用讀取狀態(tài)命令后,程序返回1字節(jié)的應(yīng)答命令來表示Program Row(行編程命令),、Erase Block(塊擦除命令)和Verify Row(行校驗命令)命令是否成功,。字節(jié)$01表示命令執(zhí)行成功,字節(jié)$04表示命令執(zhí)行失敗,。
1.6 ICP_FLAG的編程
由于JB8是為HID應(yīng)用設(shè)計的,,最好使用HID命令來編寫ICP_FLAG,這樣可以無需額外的驅(qū)動,。本文使用8字節(jié)的Set_Feature指令來設(shè)置ICP_FLAG,,使用8字節(jié)的Get_Ack指令(只有1字節(jié)是有用的)來校驗設(shè)置是否正確(響應(yīng)為$0O表示命令成功,為$01表示命令失敗),。設(shè)置8字節(jié)足出于安全的考慮,,如果這8字節(jié)與JB8中$FFE6~$FFED的8字節(jié)相匹配,那么命令才是有效的,。只有命令有效,,ICP_FLAG才會被寫入0。指令使用格式如表3所列,。
2 應(yīng)用軟件
USB ICP驅(qū)動程序的安裝與普通的硬件驅(qū)動程序安裝一樣,,需要安裝USB ICP.SYS文件和注冊表文件USBICP.INF。USB ICP的Windows運(yùn)行界面如圖4所示,。
選擇燒寫文件(.SX格式),,擦除Flash(Erase Flash)后執(zhí)行空檢查(Blank Check),,然后選擇燒寫(Program)芯片,最后執(zhí)行校驗(Verify),。
結(jié)語
本文采用集成USBl.1協(xié)議的MC68HC908JB8,,擴(kuò)展了ICP在串行口的應(yīng)用方式用于開發(fā),調(diào)試方便,,實際運(yùn)行效果很好,,有一定的應(yīng)用價值。