利用串口與并口實(shí)現51內核單片機的在線(xiàn)編程
摘要:詳細說(shuō)明利用并口模擬I2C總線(xiàn)協(xié)議,實(shí)現Myson MTV230芯片的在線(xiàn)編程(ISP)過(guò)程,以及利用PC機的串口通信實(shí)現Winbond W78E516B的在線(xiàn)編程(ISP)過(guò)程;闡述PC機的串口與并口在單片機開(kāi)發(fā)中的應用。
關(guān)鍵詞:并口編程 串口通信 在線(xiàn)編程 ISP MTV230 W78E516B
引 言
1 在線(xiàn)編程簡(jiǎn)介
51內核的單片機在線(xiàn)編程模式一般分為兩大類(lèi)。一類(lèi)是使用JTAG協(xié)議的在線(xiàn)編程模式。這類(lèi)模式一般由廠(chǎng)家提供在線(xiàn)編程工具,使用方便。使用這一類(lèi)模式的單片機價(jià)格往往較高,使用的廠(chǎng)商也不多,故不在本文的討論之列。另一類(lèi)在線(xiàn)編程模式是使用一條特殊的指令,使單片機進(jìn)入在線(xiàn)編程模式。在進(jìn)入在線(xiàn)編程模式后,要自己控制對單片機的擦除寫(xiě)入邏輯。這一類(lèi)模式又可細分為兩種不同的模式:一是進(jìn)入在線(xiàn)編程模式后,單片機只是提供一個(gè)接口,不再運行用戶(hù)的程序,擦寫(xiě)邏輯全由上位機(PC)提供,如以下要討論的MTV230就屬于這種模式;另一類(lèi)是進(jìn)入在線(xiàn)編程模式以后,芯片會(huì )運行在某一區域的用戶(hù)編寫(xiě)的程序,芯片的編程邏輯都由芯片中這段程序控制,上位機(PC)只是作為單片機的一個(gè)數據源,向單片機傳輸要擦寫(xiě)的數據,如以下要討論的W78E516B。
2 利用并口對MTV230在線(xiàn)編程的實(shí)現
2.1 MTV230簡(jiǎn)介
MTV230是由Myson公司出品的一塊集成OSD功能的基于51內核的芯片。它使用12MHz晶振時(shí)可以設置為倍頻工作,同時(shí)還集成了4路A/D和4路PWM DAC。其中最具競爭力的便是它使用了Flash OSD字庫。與一般的OSD芯片不同,它的字庫不是掩膜在芯片中,用戶(hù)可以自己定制。該款芯片可以滿(mǎn)足視頻應用中的控制需求,因而被廣泛應用于視頻類(lèi)產(chǎn)品中。
2.2 MTV230在線(xiàn)編程模式的進(jìn)入
要使MTV230具有在線(xiàn)編程的功能,可以添加一段程序在主應用程序中。該程序用來(lái)響應特定的單片機狀態(tài),如某一特定引腳的電平變化,或是串口接收到特定的字符以確定是否要進(jìn)入在線(xiàn)編程模式。在執行以下程序后,MTV230可以進(jìn)入在線(xiàn)編程模式[1]:
① 清看門(mén)狗,以防止在編程期間單片機被復位;
② 單片機的在線(xiàn)編程模式是在空閑狀態(tài)(idle)下進(jìn)行的,所以要關(guān)閉所有中斷,防止單片機被喚醒;
③ 由于MTV230在線(xiàn)編程時(shí)是作為I2C的從設備,因而要配置單片機的I2C從地址;
④ 向ISPEN寫(xiě)入0x93,使能在線(xiàn)編程功能;
⑤ 進(jìn)入51的空閑模式,在線(xiàn)編程開(kāi)始。
具體程序如下:
WDT=0; //1
IE=0; //2
ISPSLV=0x7C; //3
ISPEN=0x93; //4
PCON=0x01; //5
以上程序中1~5與上述說(shuō)明對應。以上將I2C地址設置為0x7C。值得注意的是,設置I2C從地址時(shí),最低兩位無(wú)效[1]。執行完以上程序,單片機已經(jīng)變?yōu)橐粋€(gè)I2C從設備,將I2C中SCL與芯片的15腳相連,SDA與芯片的16腳相連,就可以用I2C協(xié)議,按一定的命令格式對芯片進(jìn)行在線(xiàn)編程。命令格式詳見(jiàn)參考文獻[1],在此不再贅述。
2.3 PC機I2C接口的實(shí)現
對MTV230進(jìn)行在線(xiàn)編程,就要實(shí)現I2C通信協(xié)議。作為對MTV230進(jìn)行編程的上位機PC來(lái)說(shuō),實(shí)現I2C有三種方法:
① 使用串口與單片機通信,再由單片機模擬I2C協(xié)議,成本高,I2C速度視使用的單片機而定;
② 對計算機的并口編程,模擬I2C協(xié)議,成本低,I2C速度一般;
③ 使用USB接口實(shí)現I2C協(xié)議,成本高,I2C速度快市場(chǎng)上可以買(mǎi)到。
由于MTV230進(jìn)行編程時(shí),I2C時(shí)鐘速度最高為140kHz,速度要求不高,同時(shí)考慮到成本,決定使用方案②。
2.4 并口I2C硬件的實(shí)現
由于并口的每個(gè)引腳都是單向的,只能單向輸出或者單向輸入;而I2C又是一個(gè)雙向協(xié)議,SDA與SCL都要求既能輸入又能輸出(有時(shí)要獲取SCL當前狀態(tài)),所以,SDA與SCL要分別各由一個(gè)輸出引腳與一個(gè)輸入引腳構成。為了增加并口的驅動(dòng)能力與可靠性,設計電路如圖1所示。其中并口的2、12引腳構成SDA腳,并口的3、10引腳構成SCL腳。
2.5 并口I2C軟件的實(shí)現
在Win98中對并口的編程非常簡(jiǎn)單,通過(guò)在VC中內嵌匯編,使用IN與OUT指令訪(fǎng)問(wèn)與并口相對應的端口,設置相對應端口的值中的位就可以控制相應并口引腳的高低電平值。
例如:要將計算機并口1的第2引腳先置高再置低,匯編語(yǔ)言可以這樣寫(xiě):
MOV DX , 0x378 ;設置端口地址
MOV AL , 1 ;將待寫(xiě)入的位0的值寫(xiě)入AL中
OUT DX , AL ;將值送到相應端口
MOV AL , 0
OUT DX , AL
但在Win2000/XP中,由于系統加強了對硬件設備的保護,假如在程序中直接用IN與OUT指令訪(fǎng)問(wèn)并口,則會(huì )引發(fā)系統的非法操作;而并口訪(fǎng)問(wèn)又不像串口,直接可以使用Windows API函數,因而就必須使用驅動(dòng)程序??梢缘絯ww.sstnet.com網(wǎng)站上去下載DriverLINX Port I/O Driver并口驅動(dòng)程序。該程序可以免費復制與分發(fā)。有了這個(gè)驅動(dòng)程序,在Win2000/XP下編寫(xiě)并口程序就十分方便。安裝該驅動(dòng)程序后,在程序中包含相應的dlportio.h與dlportio.lib后就可以用DlPortReadPortUchar(IN ULONG Port)來(lái)讀取端口的值(相當于匯編中的IN指令),用DlPortWritePortUchar(IN ULONG Port,IN UCHAR Value)來(lái)向一個(gè)端口寫(xiě)一個(gè)特定的值(相當于匯編中的OUT指令)。利用改變端口值中的一個(gè)位的值,可以使相應并口引腳輸出高低電平,從而可以用其來(lái)模擬I2C協(xié)議,實(shí)現并口與單片機間的I2C通信。關(guān)于I2C協(xié)議,網(wǎng)上有很多資料,在此不再贅述。
2.6 程序說(shuō)明
如前文所述,MTV230在進(jìn)入在線(xiàn)編程模式后,就相當于一個(gè)I2C從設備,編程邏輯全都由在PC上運行的程序來(lái)實(shí)現。該程序采用VC6.0編寫(xiě)。編程程序的主界面如圖2所示,主要模塊如表1所列。由于用并口模擬I2C對單片機編程,會(huì )使該線(xiàn)程暫時(shí)處在阻塞狀態(tài),假如在主線(xiàn)程(UI)中實(shí)現該過(guò)程,則在對芯片編程時(shí),程序的主界面就無(wú)法響應用戶(hù)退出命令,所以采用了多線(xiàn)程程序結構,在一個(gè)工作線(xiàn)程實(shí)現該過(guò)程,使用戶(hù)可以隨時(shí)退出編程過(guò)程。
表1所列的頭三個(gè)類(lèi)采用了層次設計結構:上層類(lèi)調用下層類(lèi),下層類(lèi)為上層類(lèi)提供接口,這樣設計保證了代碼的最大可重用性。舉例來(lái)說(shuō),假如有另一芯片同樣是使用I2C接口進(jìn)行在線(xiàn)編程,則只要重寫(xiě)MTVISP這個(gè)芯片的在線(xiàn)編程協(xié)議類(lèi)就可以了;如果使用前面所述的并口實(shí)現方案1或3,只要重寫(xiě)最底層的Parallel類(lèi)便可。
程序工作線(xiàn)程的大致流程如圖3所示。
程序的特色:
① 可以自己設置I2C速度的高低,模擬I2C的并口地址,以及使用并口的引腳。
② 可以選擇簡(jiǎn)單校驗和完全校驗,即對編程后的芯片是進(jìn)行內部校驗寄存器值的簡(jiǎn)單校驗,還是將
芯片中的內容全部讀出與編程文件進(jìn)行比較的完全校驗。
③ 可以對芯片內的程序區、OSD區進(jìn)行編程,還可以讀出這兩區的數據(只有對可以設定進(jìn)入在線(xiàn)編 程模式的程序才可以)。
④ 進(jìn)行燒寫(xiě)的文件支持二進(jìn)制文件格式(*.bin)與Intel的Hex文件格式(*.hex)。
3 利用串口對W78E516B在線(xiàn)編程的實(shí)現
3.1 W78E516B簡(jiǎn)介
W78E516B是由Winbound公司出品的基于52內核的高性能芯片,外部晶振可以達到40MHz,內部具有64KB的程序區與4KB的引導程序區,以及256B的RAM區和256B的AUX-RAM區。AUX-RAM區相當于外部存儲區,進(jìn)行寄存器設置后,用MOVX指令進(jìn)行訪(fǎng)問(wèn)。在Keil編譯器中,進(jìn)行相應的設置便可使用pdata類(lèi)型變量訪(fǎng)問(wèn)。
3.2 W78E516B在線(xiàn)編程模式的進(jìn)入
W78E516B在線(xiàn)編程模式的進(jìn)入可以分為兩種模式:一種為軟件模式,另一種為硬件模式。當芯片進(jìn)入在線(xiàn)編程模式后,芯片會(huì )從現在的64KB程序區跳轉到4KB的引導區的0x00地址處去執行程序。如前文所述,該類(lèi)型芯片的在線(xiàn)編程邏輯都是由在這4KB引導區中的程序決定的,而上位機(PC)只是為在線(xiàn)編程提供一個(gè)數據源。
(1)軟件進(jìn)入模式
① 向CHPERN寄存器依此寫(xiě)入0x87,0x59開(kāi)啟CHPCON寄存器的寫(xiě)模式。
② 關(guān)閉中斷。
③ 向CHPCON寫(xiě)入0x03表示進(jìn)行程序區編程。
④ 向CHPCRN寫(xiě)入0x00關(guān)閉CHPCON寄存器寫(xiě)模式。
⑤ 設置好定時(shí)器為延時(shí)12μs引發(fā)中斷。
⑥ 將單片機轉入空閑模式,開(kāi)啟中斷。
例如:將以下程序嵌入主循環(huán)中,當串口收到字符“A”時(shí)便進(jìn)入在線(xiàn)編程模式:
if(B_Temp==‘A’{//B_Temp中存放從串口接收到的數
TR0=0; //停止定時(shí)器
TH0=TL0=256-250; //設置定時(shí)器定時(shí)值
CHPENR = 0x87; //開(kāi)啟CHPCON寫(xiě)模式
CHPENR = 0x59;
CHPCON|=0x03; //開(kāi)啟編程功能
CHPENR=0x00; //關(guān)閉CHPCON寫(xiě)模式
TR0=1; //開(kāi)啟定時(shí)器
PCON=0x01; //轉入空閑模式
}
(2)硬件進(jìn)入模式
如表2所列,將相應引腳設置為相應電平,在進(jìn)行復位以后也可進(jìn)入在線(xiàn)編程模式。值的注意的是,在芯片正常工作時(shí)應避免誤入在線(xiàn)編程模式,否則后果不堪設想。表2中L代表低電平,X代表任意電平。
3.3 W78E516B在線(xiàn)編程的實(shí)現
(1)單片機引導區程序
W78E516B在線(xiàn)編程邏輯主要在這部分程序中實(shí)現。在參考文獻[2]中的最后有一個(gè)示例程序,它是從外部的SRAM中讀取數據對64KB程序區進(jìn)行編程。將其改寫(xiě)一下,變?yōu)閺拇谧x入數據。對程序區進(jìn)行更新,大致流程與示例程序相同,代碼也大致相同。有興趣的朋友可以自行閱讀文獻[2]中的程序源文件,在此只列出關(guān)鍵的更改處:
;使用24MHz晶振
;使用WAVE編譯程序
;其中R3存有待寫(xiě)入數據字節數-1的高16位
;其中R4存有待寫(xiě)入數據字節數-1的低16位
JMP PROG_D_64K
PADJUEST:
INC R2 ;將低位地址增加1
CJNE R2,#00H,PROG_D_64K
INC R1 ;低位進(jìn)位時(shí)將高位增加1
MOV SFRAH,R1 ;改變高位地址
PROG_D_64K:
MOV SFRAL,R2 ;將低位地址放入
JNB RI,$ ;從串口接收一個(gè)待寫(xiě)入的字節
MOV A,SBUF
CLR RI
MOV SFRFD,A ;將待寫(xiě)入的值放入
MOV TCON,#10H ;開(kāi)啟定時(shí)器
MOV PCON,#01H ;CPU進(jìn)入IDLE狀態(tài)(進(jìn)行編程)
CLR C ; 比較R3、R4,看是否寫(xiě)入完成
MOV A,R4
SUBB A,R2
JNZ PADJUEST
CLR C
MOV A,R3
SUBB A,R1
JNZ PADJUEST
(2)PC機程序
PC機程序為單片機提供一個(gè)數據源。該數據是通過(guò)PC機的串口進(jìn)行數據傳輸的。程序由VC6.0編寫(xiě),串口通信使用的是VC自帶的串口控件MSCOMM。由于MSCOMM的接收數據是以消息形式,同時(shí)在該程序中接收的數據量很小,而發(fā)送數據為阻塞模式,所以新開(kāi)一個(gè)工作線(xiàn)程用于發(fā)送數據,而接收數據與主線(xiàn)程合并。程序整體采用狀態(tài)機模式。單片機進(jìn)行擦除、編程、校驗等各個(gè)狀態(tài)時(shí),都通過(guò)串口向PC機發(fā)送狀態(tài)字,PC機通過(guò)接收狀態(tài)字來(lái)決定單片機現在的工作狀態(tài),并決定要向單片機提供的數據。同時(shí)主線(xiàn)程中有一定時(shí)器,假如在特定時(shí)間內單片機無(wú)應答,或應答有誤,則報錯,停止單片機的編程過(guò)程。值得注意的是,由于使用了MSCOMM控件,在未裝VC6.0的機器上運行該程序要將源文件SYSTEM目錄中的三個(gè)文件拷貝到system32系統目錄下。程序主界面如圖4所示。PC機與單片機通信的工作流程如圖5所示。
程序特色:
① 可以設定使用的串口與通信的波特率。(與其相應的4KB引導區中的程序也要相應修改)。
② 可以設定使單片機進(jìn)入在線(xiàn)編程模式的字符命令。
③ 進(jìn)行燒寫(xiě)的文件支持二進(jìn)制文件格式(*.bin)與Intel的Hex文件格式(*.hex)。
4 結 論
使用并口模擬I2C程序可以方便地對板上的MTV230芯片進(jìn)行在線(xiàn)編程,使用串口為W78E516B提供數據源也可方便地對其進(jìn)行編程,兩者均經(jīng)過(guò)實(shí)踐檢驗,程序完全達到預期目的。使用芯片的在線(xiàn)編程技術(shù),方便了芯片程序的更新,降低了產(chǎn)品的維護成本。
評論