按平臺模式設計的虛擬I2C總線(xiàn)軟件包VIIC
關(guān)鍵詞:平臺模式虛擬I2C總線(xiàn)VIIC應用程序設計
一、I2C總線(xiàn)及其虛擬應用
目前,單片機應用系統的外圍擴展已從并行方式為主過(guò)渡到以串行方式為主的時(shí)代。許多新型外圍器件都帶有串行擴展接口。通常的串行擴展接口和串行擴展總線(xiàn)有UART的移位寄存器方式、MOTOROLA公司的SPI、NS公司的Microwire、Dallas公司的1Wire和Philips公司的I2C總線(xiàn)等。其中,I2C總線(xiàn)提供了較完善的總線(xiàn)協(xié)議、最簡(jiǎn)單的串行連接方式,并提供了總線(xiàn)操作的狀態(tài)處理軟件包,因而得到了廣泛的應用。但廠(chǎng)家并未提供完善的平臺模式應用軟件包。因此,用戶(hù)在擴展I2C總線(xiàn)外圍器件時(shí),還要在了解I2C總線(xiàn)協(xié)議、操作原理的基礎上,采用直接方式進(jìn)行I2C總線(xiàn)外圍器件的應用程序設計。迄今為止,許多期刊的文章中還是以這種方式來(lái)介紹I2C總線(xiàn)的擴展應用。由于I2C總線(xiàn)協(xié)議的復雜性和操作管理的特殊性,從I2C總線(xiàn)結構原理到I2C總線(xiàn)應用的直接設計方式難度較大,使I2C總線(xiàn)推廣應用較慢。因此,迫切呼喚推出I2C總線(xiàn)的應用軟件平臺,使人們不必了解I2C總線(xiàn)就能設計I2C總線(xiàn)應用程序。
2. 廣泛使用的主工作方式
I2C總線(xiàn)是1個(gè)十分完善的多主系統總線(xiàn),總線(xiàn)上可以?huà)旖佣鄠€(gè)MCU,因此有4種工作方式,即主發(fā)送、主接收、從發(fā)送、從接收。但實(shí)際的單片機應用系統絕大多數都是單個(gè)MCU系統,只用到I2C總線(xiàn)的主方式,即主發(fā)送與主接收。
3. 虛擬I2C總線(xiàn)的廣泛需求
目前,有許多外圍器件帶有I2C總線(xiàn)接口,然而,帶有I2C總線(xiàn)接口的MCU只有少數廠(chǎng)家的個(gè)別型號,致使I2C總線(xiàn)難以推廣。因此,人們便使用MCU通用的I/O口來(lái)虛擬I2C總線(xiàn)接口。早期東芝公司在彩電中就在自己的MCU中虛擬I2C總線(xiàn)接口,實(shí)現I2C總線(xiàn)外圍器件擴展的虛擬應用。
采用虛擬I2C總線(xiàn)后,任何1個(gè)廠(chǎng)家的單片機都可以無(wú)障礙地使用I2C總線(xiàn)外圍器件。同樣,虛擬I2C總線(xiàn)的應用也呼喚平臺模式。
二、VIIC1.0軟件包設計
VIIC1.0是物化形式為軟件包文檔的廣義平臺,適合在80C51單片機系列單主系統中應用。
按照廣義平臺設計內容,VIIC有最佳包容性設計、后歸一化設計、前歸一化設計、物化設計和應用界面設計。
1.最佳包容性設計
最佳包容性設計是廣義平臺適用范圍的最佳選擇性設計。完整的I2C總線(xiàn)有4種操作方式,并且有指定的端口,有地址寄存器(S1ADR)來(lái)設定MCU的地址。在VIIC的包容性設計中規定為主方式下的通用I/O口虛擬。規定為主方式后,避免了多主方式下極大難度的總線(xiàn)沖突仲裁處理程序設計,又保證了能滿(mǎn)足絕大多數I2C總線(xiàn)擴展應用。采用通用I/O口的虛擬,使用戶(hù)可隨意規定虛擬I2C總線(xiàn)端口,擴大了虛擬I2C總線(xiàn)應用的靈活性。
2.后歸一化設計
后歸一化設計是確定應用范圍的相關(guān)設計。VIIC的后歸一化設計有:
(1) 應用范圍指定為帶I2C總線(xiàn)的外圍器件擴展;
(2) 所有I2C總線(xiàn)外圍器件的操作方式歸一化為外圍器件N個(gè)字節的讀寫(xiě)操作;
(3) 總線(xiàn)節點(diǎn)通信方式歸一化為SLAW/SLAR節點(diǎn)尋址后的點(diǎn)對點(diǎn)的讀寫(xiě)操作。
3.前歸一化設計
前歸一化設計是從I2C總線(xiàn)協(xié)議原理、操作方式、時(shí)序規則出發(fā),實(shí)現后歸一要求的設計。VIIC的前歸一化設計有:
(1) 時(shí)序的指令模擬即模擬I2C總線(xiàn)操作時(shí)序。I2C總線(xiàn)操作的典型時(shí)序信號有起始位(STAR)、停止位(STOP)、發(fā)送應答位(MACK)、發(fā)送非應答位(MNACK)。
(2) 數據傳送操作虛擬即模擬I2C數據傳送過(guò)程。例如,應答位檢查(CACK)、發(fā)送1個(gè)字節數據(WRBYT)、接收1個(gè)字節數據(RDBYT)。
(3) 外圍器件讀寫(xiě)操作虛擬。要求虛擬1個(gè)I2C總線(xiàn)讀寫(xiě)操作過(guò)程(RDNBYT、WRNBYT)。
4.VIIC1.0的結構設計
(1) VIIC1.0的組成。 根據歸一化設計,主方式下虛擬I2C總線(xiàn)由下列9個(gè)子程序組成: 時(shí)序模擬子程序STAR,STOP,MACK,MNACK; 操作模擬子程序CACK,WRBYT,RDBYT; 數據讀寫(xiě)子程序RDNBYT,WRNBYT。 由于篇幅所限,本文中省略了VIIC1.0軟件包中這9個(gè)子程序的虛擬設計方法。需要詳細了解的讀者可參看文尾參考資料2中7.3節“I2C總線(xiàn)的串行擴展技術(shù)”的有關(guān)部分。
(2) 軟件包的出口界面 軟件包VIIC實(shí)現非介入性操作,出口界面是軟件包應用時(shí)惟一的觸及面。VIIC1.0中的出口界面為數據讀寫(xiě)子程序 RDNBYT/WRNBYT。
(3) 軟件包的符號單元 VIIC中的符號標記有發(fā)送數據緩沖區MTD、接收數據緩沖區MRD、傳送字節數存放單元NUMBYT以及尋址字節SLAW/SLAR存放單元SLA。這些符號單元都采用了標準I2C總線(xiàn)狀態(tài)處理軟件包中規定的字符標記。
5.應用界面設計
VIIC1.0軟件包規定了讀寫(xiě)子程序RDNBYT/WRNBYT的惟一出口界面,因此RDNBYT/WRNBYT的調用操作命令,以及滿(mǎn)足調用操作的初始化操作的三條命令為VIIC的應用界面,即:
MOV SLA,#SLAR/SLAW ;總線(xiàn)上節點(diǎn)尋址并確定傳送方向
MOV NUMBYT,#N ;確定傳送字節數N
LCALL RDNBYT/WRNBYT ;讀/寫(xiě)操作調用
三、VIIC1.0軟件包清單
VIIC1.0軟件包清單如下。
①STAR:SETB VSDA;啟動(dòng)I2C總線(xiàn)
SETB VSCL
NOP
NOP
CLR VSDA
NOP
NOP
CLR VSCL
RET
②STOP: CLR VSDA ;停止I2C總線(xiàn)數據傳送
SETB VSCL
NOP
NOP
SETB VSDA
NOP
NOP
CLR VSDA
CLR VSCL
RET
③MACK: CLR VSDA ;發(fā)送應答位
SETB VSCL
NOP
NOP
CLR VSCL
SETB VSDA
RET
④MNACK: SETB VSDA ;發(fā)送非應答位
SETB VSCL
NOP
NOP
CLR VSCL
CLR VSDA
RET
⑤CACK: SETB VSDA ;應答位檢查
SETB VSCL
CLR F0
MOV C,VSDA
JNC CEND
SETB F0 CEND: CLR VSCL
RET
⑥WRBYT: MOV R0,#08H ;向VSDA線(xiàn)上發(fā)送1個(gè)數 ;據字節 WLP: RLC A
JC WR1
AJMP WR0 WLP1: DJNZ R0,WLP
RET WR1: SETB VSDA
SETB VSCL
NOP
NOP
CLR VSCL
CLR VSDA
AJMP WLP1 WR0: CLR VSDA
SETB VSCL
NOP
NOP
CLR VSCL
AJMP WLP1
⑦RDBYT: MOV R0,#08H ;從VSDA線(xiàn)上讀取1個(gè)數 ;據字節 RLP: SETB VSDA
SETB VSCL
MOV C,VSDA
MOV A,R2
RLC A
MOV R2,A
CLR VSCL
DJNZ R0,RLP
RET
⑧WRNBYT: MOV R3,NUMBYT ;虛擬I2C總線(xiàn)發(fā)送N個(gè) ;字節數據
LCALL STA
MOV A,SLA
LCALL WRBYT
LCALL CACK
JB F0,WRNBYT
MOV R1,#MTD WRDA: MOV A,@R1
LCALL WRBYT
LCALL CACK
JB F0,WRNBYT
INC R1
DJNZ R3,WRDA
LCALL STOP
RET ⑨RDNBYT: MOV R3, NUMBYT ;模擬I2C總線(xiàn)接收n個(gè) ;字節數據
LCALL STA
MOV A,SLA
LCALL WRBYT
LCALL CACK
JB F0,RDNBTY RDN: MOV R1,#MRD RDN1: LCALL RDBYT
MOV @R1,A
DJNZ R3,ACK
LCALL MNACK
LCALL STOP
RET ACK: LCALL MACK
INC R1
SJMP RDN1
四、VIIC1.0應用指南
1.適用范圍
VIIC1.0適用于80C51系列單主系統中I2C總線(xiàn)外圍器件擴展的應用程序設計。由于時(shí)序模擬基于6MHz時(shí)鐘設計,在高速時(shí)鐘下,可適當增加時(shí)序模擬子程序中的空操作指令。
2. 資源占用
VIIC使用了R0,R1,R2,R3,F0,C等資源。
3.符號單元
PVIIC中有許多符號標記,這些符號標記有:
VSDA 虛擬I2C總線(xiàn)數據線(xiàn);
VSCL虛擬I2C總線(xiàn)時(shí)鐘線(xiàn);
SLA尋址字節存放單元;
NUMBYT傳送字節數存放單元;
MTD發(fā)送數據緩沖區;
MRD接收數據緩沖區。
4.歸一化操作命令
不論總線(xiàn)上擴展什么外圍器件,都只須使用以下三條指令:
MOV SLA,#SLAW/SLAR
MOVNUMBYT,#N
LCALLWRNBYT/RDNBYT
5.VIIC的裝載
由于WRNBYT/RDNBYT都使用長(cháng)調用命令LCALL,故VIIC1.0可放在程序存儲器的任意空間。 圖1
6.通用的應用界面
VIIC1.0的應用界面如圖1所示。與VIIC1.0有關(guān)的只是3條歸一化操作命令;與硬件電路相關(guān)的是器件地址與引腳地址構成的尋址字節和由器件規定的數據操作格式。
五、VIIC1.0應用示例
在本文參考文獻2中給出了一些基于VIIC軟件包的外圍串行擴展應用實(shí)例?,F就帶I2C總線(xiàn)接口LED顯示驅動(dòng)器SAA1064擴展8位LED顯示電路來(lái)示范VIIC1.0的應用。
1.硬件電路與尋址字節
用2片SAA1064擴展的8位LED顯示電路如圖2(b)所示,圖2(a)為SAA的引腳排列圖。設80C51用P1.1/P1.0來(lái)虛擬SDA/SCL口線(xiàn)。兩片SAA1064的ADR引腳分別接地和VCC。SAA1064(1)、(2)的器件地址為0111,引腳地址為000和111,因此它們的尋址字節SLAW/SLAR分別為70H/71H和76H/77H。
2.顯示原理與數據操作格式
在I2C總線(xiàn)外圍器件的數據手冊中,都給出了實(shí)現器件功能的數據操作格式,以及實(shí)現功能的控制命令與寄存器的管理模式。
(1) SAA1064的數據操作格式 80C51只須對SAA1064進(jìn)行寫(xiě)操作,便實(shí)現了LED的顯示驅動(dòng)控制。SAA1064的寫(xiě)數據操作格式如下:
S | SLAW | A | SUBADR | A | COM | A | data1 | A | data2 | A | data3 | A | data | A | P |
只須對SAA1064中首地址為SUBADR的5個(gè)寄存器單元中依次寫(xiě)入控制命令COM和4個(gè)LED共陰極段碼datal~data4,SAA1064的SUBADR=00H。
控制命令COM格式及位功能規定如下:
D7 D0
―― | C6 | C5 | C4 | C3 | C2 | C1 | C0 |
C0 靜、動(dòng)態(tài)顯示選擇。C0=1,動(dòng)態(tài)顯示。
C1 顯示位1,3暗亮選擇。C1=1,選擇亮。
C2 顯示位2,4暗亮選擇。C2=1,選擇亮。
C3 測試位。C3=1,所有段點(diǎn)亮。
C4,C5,C6 驅動(dòng)電流控制位。C4,C5,C6為 “1”時(shí),驅動(dòng)電流分別為3mA,6mA,12mA;皆為1時(shí)輸出驅動(dòng)電流最大,達21mA。
3.應用程序設計
按下列步驟完成圖2(b)的8位LED顯示程序設計。
(1) 將VIIC1.0裝入程序存儲器中。
(2) 根據硬件電路及資源分配,將VIIC1.0中的符號單元賦值如下:
VSDA EQU P1.1 ;用P1.1虛擬SDA
VSCL EQU P1.0 ;用P1.0虛擬SCL
SLA EQU 50H ;50H為尋址字節存放單元
NUMBYT EQU 51H ;51H為傳送字節數據存放單元
MTD EQU 30H ;30H為發(fā)送緩沖區首地址
(3) 8位LED顯示子程序設計
這里介紹1個(gè)在圖2(b)LED顯示器上顯示“bUAA0706”固定字符的子程序。
根據SAA1064的數據操作格式,點(diǎn)亮4個(gè)LED只須依首地址SUBADR順序送入控制命令COM和4個(gè)LED共陰極段選碼data1~data4。
設LED驅動(dòng)電流為18 mA(C6,C5為高電平;C4為低電平)動(dòng)態(tài)顯示要求(C2,C1,C0為高電平)故COM=67H。SAA1064(1)顯示“0706”的段碼依次是7DH,3FH,07H,3FH;SAA1064(2)顯示“bUAA”的段碼依次為77H,77H,3EH,7CH。因此,SAA1064(1),(2)的數據操作格式具體化為
設顯示“bUAA0706”的子程序名為VSAA8。VSAA8的程序清單如下:
VSDA EQU P1.0
VSCL EQU P1.1
SLA EQU 50H
NUMBYT EQU 51H
MTD EQU 30H
VSAA8: MOV 30H,#00H;將SUBADR,COM,LED共 ;陰極段碼data1~data4 ;依次裝入發(fā)送緩沖區
MOV 31H,#67H
MOV 32H,#7DH
MOV 33H,#3FH
MOV 34H,#07H
MOV 35H,#3FH
MOV SLA,#70H;尋址SAA104(1)并為發(fā)送 ;狀態(tài)
MOV NUMBYT,#06H;確定發(fā)送字節數
LCALL WRNBYT;調用VIIC1.0中N個(gè)字節寫(xiě) ;入子程序
MOV 30H,#00H;將SUBADR,COM,data1~ ;data4依次裝入發(fā)送緩沖區
MOV 31H,#67H
MOV 32H,#77H
MOV 33H,#77H
MOV 34H,#3EH
MOV 35H,#7CH
MOV SLA,#76H ; 尋址SAA1064(2)并為發(fā) ;送狀態(tài)
MOV NUMBYT,#06H ;確定發(fā)送字節數
MOV WRNBYT;調用VIIC1.0中N個(gè)字節寫(xiě) ;入子程序
RET
如果要隨意顯示內存中的8個(gè)BCD碼,可開(kāi)辟顯示緩沖區DISRAM,設計1個(gè)子程序,將顯示緩沖區中的8個(gè)BCD碼轉換成共陰極段碼再和SUBADR和COM一道送入MTD中,然后使用VIIC1.0的三條操作命令即可。
從上述應用可看出,使用VIIC軟件包后,編寫(xiě)應用程序不必了解I2C總線(xiàn)原理、協(xié)議和時(shí)序,只要了解VIIC的應用操作即可。
評論