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