|
本文對(duì)AT24系列存貯器和AT89系列單片機(jī)的特征及總線狀態(tài)作為介紹,并以AT24C01與AT89C2051為例詳細(xì)描述了通用存貯器IC卡的工作原理及用單片機(jī)對(duì)其進(jìn)行讀寫(xiě)操作的基本電路連接和軟件編程方法。
通用存貯器IC卡是由通用存貯器芯片封裝而成的,由于它的結(jié)構(gòu)和功能簡(jiǎn)單,生產(chǎn)成本低,使用方便,因此在各領(lǐng)域都得到了廣泛的應(yīng)用。目前用于IC卡的通用存貯器芯片多為E2PROM,其常用的協(xié)議主要有兩線串行連接協(xié)議(I2C)和三線串行鏈接協(xié)議,其中比較常用的是ATMEL公司生產(chǎn)的AT24系列芯片。以該系列中的AT24C01為例,它具有1k的存貯容量,適用于2V~5V的低電壓/標(biāo)準(zhǔn)電壓的操作,具有低功耗和高可靠性等優(yōu)點(diǎn)。而AT89C2051雖是ATMEL公司89系列單片機(jī)的低檔型,但它具有2k的FLASH ROM(可重編閃速存貯器)、128×8位內(nèi)部RAM及全靜態(tài)操作方式,同樣也具有低功耗和較強(qiáng)的功能。下面以AT24C2051為例,對(duì)通用存貯器IC卡的工作原理及基本電路連線作一介紹,該線路簡(jiǎn)單,使用靈活,能可靠地對(duì)通用存貯器IC卡進(jìn)行讀寫(xiě)。
2、硬件特性
2.1 AT24系列存貯器的特性
AT24系列存貯器芯片采用CMOS工藝制造,內(nèi)置有高壓泵,可在單電壓供電條件下工作。其標(biāo)準(zhǔn)封裝為8腳DIP封裝形式,各引腳的功能說(shuō)明如下:
SCL:串行時(shí)鐘。在該腳的上升沿時(shí),系統(tǒng)將數(shù)據(jù)輸入到每個(gè)EEPROM器件,在下降沿時(shí)輸出。
SDA:串行數(shù)據(jù)。該引腳為開(kāi)漏極驅(qū)動(dòng),可雙向傳送數(shù)據(jù)。
A0、A1、A2:器件/頁(yè)面尋址。為器件地址輸入端。在AT24C01/02中,該引腳被硬連接。
Vcc:一般輸入+5V的工作電壓。
對(duì)于AT24系列通用存貯器IC卡來(lái)說(shuō),通常只需使用四個(gè)觸點(diǎn)。AT24C01的內(nèi)部組態(tài)為128個(gè)8位字節(jié),而對(duì)隨機(jī)字尋址則需要一個(gè)7位地址。
2.2 總線狀態(tài)及時(shí)序
A24C01的SCL及SDA兩總線可通過(guò)一個(gè)電阻上拉為高電平,SDA上的數(shù)據(jù)僅在SCL為低電平時(shí)周期才能改變。當(dāng)SCL為高電平時(shí),SDA的改變表示“開(kāi)始”和“停止”狀態(tài)。此時(shí),所有地址和數(shù)據(jù)字都以8位串行碼方式輸入輸出EEPROM。
開(kāi)始狀態(tài):SCL為高電平時(shí),SDA由高電平轉(zhuǎn)入低電平。該命令必須在其它命令前執(zhí)行。
停止?fàn)顟B(tài):SCL為高電平時(shí),SDA由低電平轉(zhuǎn)入高電平。該命令可終止所有通訊。 確認(rèn):相同總線上的設(shè)備在收到數(shù)據(jù)后,以置SDA為低電平的方式對(duì)其進(jìn)行確認(rèn)。
2.3 器件尋址
AT24系列EEPROM在開(kāi)始狀態(tài)后需緊接一個(gè)8位器件地址,以進(jìn)行應(yīng)讀寫(xiě)操作。設(shè)備尋址碼的高4位為1、0、1、0,對(duì)于AT24C01/02,尋址碼高4位后面的三位是器件尋址碼,與它們的硬連線管腳相對(duì)應(yīng)。最低應(yīng)是讀寫(xiě)選擇位,置0時(shí)可激發(fā)讀操作。 具體的格式如下:1010A2A1A0R/W
2.4 AT89C2051芯片
AT89C2051是MCS-51產(chǎn)品的兼容型,它具有2k的FLASH ROM、128字節(jié)ROM,15根I/O引線、兩個(gè)16位定時(shí)/計(jì)數(shù)器、一個(gè)五向量?jī)杉?jí)中斷結(jié)構(gòu)、一個(gè)全雙工串行口、一個(gè)精密模擬比較器以及片內(nèi)振蕩電路和時(shí)鐘電路。它的P1口和P3口是雙向I/O口,其中P1.2~P1.7、P3.0~P3.5和P3.7帶有內(nèi)部上拉電阻。在AT89C2051用作輸入端時(shí),將首先向引腳寫(xiě)“1”而使內(nèi)部MOS管截止以便引腳處于懸浮狀態(tài),從而可獲得高阻抗輸入。
3、讀寫(xiě)操作軟件
當(dāng)系統(tǒng)采用6MHz晶體振蕩器時(shí)所定義的I/O口線及器件地址如下:
SCL BIT P1.7 SDA BIT P1.6 DEVICEAD_W DATA 10100000B ;寫(xiě)卡器件地址 DEVICEAD_R DATA 10100001B ;讀卡器件地址 3.1 開(kāi)始條件(START_IC) 在開(kāi)始條件下,當(dāng)SCL為高電平時(shí),SDA由高轉(zhuǎn)為低。程序如下: START_IC:CLR SCL;SCL低電平時(shí)才允許SDA更改 NOP ;加入空指令延時(shí)以確保信號(hào)可靠 NOP SETB SDA NOP NOP SETB SCL NOP NOP CLR SDA NOP NOP CLR SCL NOP RET
3.2 停止條件(STOP_C)
在停止條件下,當(dāng)SCL為高電平時(shí),SDA由低轉(zhuǎn)為高。程序如下:
STOP_IC:CLR SCL NOP NOP CLR SDA NOP NOP SETB SCL NOP NOP SETB SDA NOP NOP CLR SCL NOP NOP CLR SDA RET
3.3 確認(rèn)信號(hào)(ACK_IC)
在接收方應(yīng)答下,每收到一字節(jié)后便將SDA電平拉低,程序如下: ACK_IC:CLR SCL NOP NOP CLR SDA NOP NOP SEIB SCL NOP NOP CLR SCL NOP SETB SDA NOP RET
3.4 寫(xiě)一字節(jié)數(shù)據(jù)到IC卡(WR_BYTE)
在下列程序中,參數(shù)A表示源數(shù)據(jù),R5表示字節(jié)位數(shù)。 WR_BYTE:MOV R5,#08 ;一字節(jié)8位數(shù)據(jù) CLR SCL NOP NOP WR_BYTE1:RLC A ;帶進(jìn)位位左移,A.8->C MOV SDA,C ;SCL低電平時(shí)改變SDA上的數(shù)據(jù) NOP SETB SCL ;拉高SCL把數(shù)據(jù)發(fā)送出去 NOP NOP CLR SCL NOP NOP DJNZ R5,WR_BYTE1;依次發(fā)送A中的8位數(shù)據(jù) SETB SDA SETB SCL JB SDA,$ ;等待IC卡確認(rèn)信號(hào) CLR SCL NOP RET 此子程序的主要作用是按照定義的時(shí)序,順序左移A中一字節(jié)8位數(shù)據(jù),并通過(guò)引腳傳送出去。當(dāng)一字節(jié)發(fā)完后,等待IC卡發(fā)回的確認(rèn)信號(hào)。
3.5 從IC卡讀一字節(jié)(RD+BYTE)
從IC卡中讀一字節(jié)的源程序如下: RD_BYTE:MOV R5,#08 SETB SDA ;設(shè)備SDA為讀狀態(tài) CLR A ;清空A寄存器 RD_BTYE1:MOV C,SDA ;讀一位數(shù)據(jù)到進(jìn)位位 RLC A ;左移數(shù)據(jù)到A.0 SETB SCL NOP NOP CLR SCL NOP NOP DJNZ R5,RD_BYTE1;依次讀出8位數(shù)據(jù)到A中 RET ;無(wú)應(yīng)答信號(hào) 利用該程序可將讀出的數(shù)據(jù)存放在A中。需要注意的是:讀數(shù)據(jù)的器件不是通過(guò)確認(rèn)狀態(tài)來(lái)應(yīng)答的,而是隨后產(chǎn)生一個(gè)停止?fàn)顟B(tài)。
3.6 字節(jié)寫(xiě)入模式寫(xiě)數(shù)據(jù)(WRITE_BYTE)
下列程序中的參數(shù)為:R6= =目的地址,A= =數(shù)據(jù);數(shù)據(jù)如下: WRITE_BYTE:PUSH ACC ;保存A中的數(shù)據(jù) LCALL START_IC ;發(fā)開(kāi)始信號(hào) MOV A,#DEVICEAD_W;寫(xiě)入器件地址 LCAL WR_BYTE MOV A,R6 ;寫(xiě)入字節(jié)地址 LCALL WR_BYTE POP ACC ;恢復(fù)A中數(shù)據(jù) LCALL WR_BYTE ;寫(xiě)入數(shù)據(jù) LCALL STOP_IC RET
在收到8位數(shù)據(jù)后,EEPROM將通過(guò)SDA來(lái)回送確認(rèn)信號(hào),而傳送設(shè)備必須用停止?fàn)顟B(tài)來(lái)終止寫(xiě)操作。這時(shí),EEPROM將進(jìn)入一個(gè)內(nèi)時(shí)固定存貯器的寫(xiě)入周期并且禁止在此其間的所有輸入,直到寫(xiě)操作完成后才對(duì)通訊應(yīng)答。其寫(xiě)入周期可自定義,最大為10ms。
3.7 頁(yè)面寫(xiě)入模式寫(xiě)數(shù)據(jù)(WRITE_PAGE)
以下程序中的參數(shù)為P0= =源指針,R6= =目的地址,R7= =頁(yè)面長(zhǎng)度。 WRITE_PAGE:LCALL START_IC MOV A,#DEVICEAD_W LCALL WR_BYTE MOV A,R6 LCALL WR_BYTE WRITE_PAGE1:MOV A,@R0 LCALL WR_BYTE INC R0 DJNZ R7,WRITE_PAGE1 LCALL STOP_IC RET
AT24C01/02可利用上述程序進(jìn)行8字節(jié)的頁(yè)面寫(xiě)入,它的操作類(lèi)似于寫(xiě)字節(jié)。不同的是,它無(wú)需在第一個(gè)字節(jié)送出后才以停止?fàn)顟B(tài),不同在收到確認(rèn)信號(hào)后,再傳送7個(gè)字節(jié)的數(shù)據(jù)碼,最后以停止?fàn)顟B(tài)來(lái)終止頁(yè)面寫(xiě)序列。AT24C04/08/16的頁(yè)面為16字節(jié)。
3.8 立即地址讀模式(READ_BYTEC)
立即地址讀模式讀一字節(jié)數(shù)據(jù)的程序如下:READ_BYTEC:LCALL START_IC MOV A,#DEVICEAD_R LCALL WR_BYTE LCALL RD_BYTE ;讀出默認(rèn)地址數(shù)據(jù) LCALL STOP_IC ;發(fā)停止?fàn)顟B(tài)應(yīng)答 RET 該程序執(zhí)行后,其內(nèi)部數(shù)據(jù)字地址指針將保持在上次讀寫(xiě)操作訪問(wèn)的最后一個(gè)地址,并按1遞增且在芯片上電期間一直有效。只有當(dāng)?shù)刂窞轫?yè)面的最末時(shí),下次訪問(wèn)才滾動(dòng)到該頁(yè)面的首地址。
3.9 隨機(jī)地址讀模式(READ_BYTER)
在下列程序中,R6= =源地址,程序如下: READ_BYTER:LCALL START_IC MOV A,#DEVICEAD_W ;執(zhí)行空字節(jié)寫(xiě)序列 LCALL WR_BYTE ;載入數(shù)據(jù)地址 MOV A,R6 LCALL WR_BYTE LCALL START_IC MOV A,#DEVICEAD_R ;立即地址讀取 LCALL WR_BYTE LCALL DR_BYTE LCALL STOP_IC RET 讀操作模式需要一個(gè)字節(jié)寫(xiě)序列載入數(shù)據(jù)地址。在器件和數(shù)據(jù)地址寫(xiě)入并得到確認(rèn)后,將再產(chǎn)生另一個(gè)開(kāi)始條件,并送出讀操作器件的地址,同時(shí)激發(fā)一個(gè)立即地址讀取。
3.10 順序地址讀取(READ_BYTES)
在下列程序中:R0= =目的指針;R7= =數(shù)據(jù)長(zhǎng)度,程序如下: READ+BYTES:LCALL START_IC MOV A,#DEVICEAD_R LCALL WR_BYTE READ_BYTES2:LCALL RD_BYTE MOV @R0,A ;存放數(shù)據(jù)到目的地址 INC R0 DJNZ R7,READ_BYTES1 LCALL STOP_IC ;讀寫(xiě)指定長(zhǎng)度后停止 RET READ_BYTES1:LCALL ACK_IC ;收到數(shù)據(jù)后發(fā)確認(rèn)信號(hào)SJMP READ_BYTES2
其中順序讀取由立即尋址讀或隨機(jī)地址讀激發(fā),并在收到一字節(jié)數(shù)據(jù)后發(fā)確認(rèn)信號(hào)應(yīng)答。當(dāng)讀數(shù)器件以停止?fàn)顟B(tài)應(yīng)答時(shí),操作被終止。
4、總結(jié)
該系統(tǒng)結(jié)構(gòu)簡(jiǎn)單,在實(shí)際運(yùn)行時(shí)具有很高的可靠性,同時(shí)具有一定的可擴(kuò)展性,并可通過(guò)單片機(jī)的串行口經(jīng)電平轉(zhuǎn)換后直接與計(jì)算機(jī)相連,以進(jìn)行數(shù)據(jù)通訊。另外,也可根據(jù)需要連接到其它引腳或卡座觸點(diǎn),如果適當(dāng)改進(jìn)電路和程序,還可讀寫(xiě)加密卡和CPU卡等。 |