關鍵詞:AT24C02設計應用 帶I2C總線接口的E2PROM有許多型號系列,有多家生產(chǎn)廠商生產(chǎn),其中應用比較廣泛的是AT24CXX系列,AT24CXX系列E2PROM有AT24C01/02/04/08/16等其容量分別為128×8/256×8/512×8/1024×8/2048×8bit,關于AT24CXX的原理,很多書上都有介紹。這里主要闡述一下AT24C02在IC卡煤氣表中的具體應用。也算是個應用實例吧。 IC卡式煤氣表具有下列功能:預付費用氣,用氣量自動計算,低氣量提示、報警,電池欠壓提示,記憶,顯示剩余氣量,防竊氣,防磁,一表一卡及數(shù)據(jù)采集和恢復,漢字提示等功能。原理見圖(1)所示。 圖(1)AT89C2051與AT24C02的連接 1.引腳功能 AT24C02芯片DIP封裝,其中: SDA、SCL:I2C總線接口;A2~A0:地址引腳;WP:寫保護引腳,WP接VSS時,禁止寫入高位地址,WP接VDD時,允許寫入任何地址;VDD、VSS電源端、接地端。 2.電路設計 圖(1)為應用電路原理,AT24C02的SDA和SCL分別接在AT89C2051的P3.0和P3.1上。時鐘線上接了一只47pf的電容器,目的是提高器件的抗干擾能力。 3.AT24C02工作原理 由于80C51芯片內(nèi)部無I2C總線接口,因此只能采用虛擬I2C總線方式,并且只能用于單主系統(tǒng)。即80C51作為I2C總線主器件,擴展器件作為從器件,從器件必須具有I2C總線接口。主器件80C51的虛擬I2C總線接口可用通用I/O口中任一口線充任。這里的主器件為AT89C2051,從器件為AT24C02。 AT24C02具有256×8(2K)bit的存儲容量,頁寫入字節(jié)數(shù)為8。通常EEPROM器件寫入時總需要一定的時間(5ms~10ms),因此在寫入程序中無法連續(xù)寫入多個數(shù)據(jù)字節(jié)。一次寫入EEPROM的字節(jié)數(shù)不大于器件的頁寫入字節(jié)數(shù)時,可按通常RAM的寫入速度將數(shù)據(jù)裝入EEPROM的數(shù)據(jù)寄存器中,隨后啟動自動寫入定時控制邏輯,經(jīng)過5ms~10mS的時間,自動將數(shù)據(jù)寄存器中的數(shù)據(jù)同步寫入EEPROM的指定單元。這樣只要一次寫入的字節(jié)數(shù)不多于頁寫入容量,總線對EEPROM的操作可視為對靜態(tài)RAM的操作,但要求下次數(shù)據(jù)寫入操作在5ms~10ms之后進行。 AT24C02器件地址格式如圖(2)所示。其中DA3~DA0位為器件固有地址編碼,由工廠給定,為1010,不能更改。A2~A0 3位引腳地址用于相同地址器件的識別。本電路為000。R/W為數(shù)據(jù)傳送方向。R/W=1時,主機接(讀);R/W=0時,主機發(fā)送(寫)。 |
| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
| DA3 | DA2 | DA1 | DA0 | A2 | A1 | A0 | R/W |
器件固有地址編碼 器件引腳地址 讀/寫 圖(2)I2C總線器件SLA4.軟件設計 IC卡煤氣表中,購氣量和用氣量、IC卡卡型等數(shù)據(jù) (10個單元)等數(shù)據(jù)共22個字節(jié)單元的數(shù)據(jù)需要實時保存。IC卡煤氣表具有記憶功能無論是電池欠壓還是因更換電池,系統(tǒng)都會記著失電前一刻的數(shù)據(jù)待電壓恢復正常后系統(tǒng)會自動恢復正常工作,無須人工干預。并且要求準確無誤,萬無一失。 以下為用匯編語言編寫的有關AT24C02的一段程序模塊,每次讀或?qū)?8個字節(jié)單元的數(shù)據(jù)。你可改變一下寄存器“B”的值,就可讀寫整個器件的數(shù)據(jù)。
---------------------------------------------------------------------------------------------
;說明: 現(xiàn)行地址讀/寫即專指無子地址的器件,不給定子地址的讀/寫操作
;軟件占用內(nèi)部資源 R0,R1,R2,R3,ACC,Cy
;使用前須定義變量 SLA器件從地址,SUBA器件子地址,NUMBYTE讀寫的字節(jié)數(shù)
;位變量ACK
;使用前須定義SDA,SCL總線位,MTD發(fā)送數(shù)據(jù)緩沖區(qū)首址,MRD接收數(shù)據(jù)緩沖區(qū)首址
;此軟件是在標準的8051模式,12 Clock下,對主頻要求是不高于12MHz(1個機 器周期1us);若Fosc>12MHz,則相應要增加NOP指令數(shù)
;*****************************************************
;定義變量
ACK BIT 10H ;應得標志位
;(定義緩沖區(qū)的單元)
SLA DATA 50H ;器件從地址(從器件的選通地址:如0A0H)
SUBA DATA 51H ;器件子地址 (從器件的內(nèi)部存儲器地址)
NUMBYTE DATA 52H ;讀/寫的字節(jié)數(shù)(的緩存器)
SDA EQU P3.0 ;I2總線定義
SCL EQU P3.1
MTD EQU 22H ;發(fā)送數(shù)據(jù)緩沖區(qū)首址(22H~33H共18個字節(jié))
MRD EQU 22H ;接收數(shù)據(jù)緩沖區(qū)首址(22H~33H)
;定義器件地址
CSI24WCXX EQU 0A0H ;從器件固定地址
;****************************************
ORG 0000H
AJMP MAIN
ORG 0080H
MAIN:
MOV R0,#55H
CLR A
DEL1: MOV @R0,A ;預使用單元清0
DJNZ R0,DEL1
MOV SP,#60H
;測試
LCALL WR24C02 ;調(diào)寫N個字節(jié)的數(shù)據(jù)
CALL RD24C02 ;調(diào)讀N個字節(jié)的數(shù)據(jù)
SJMP $
;****************************************
;對2402指定單元進行寫操作,指定的子地址放入SUBA,
;數(shù)據(jù)依次放入MTD緩沖區(qū)
WR24C02:
MOV B,#2 ;寫入的頁數(shù)
CALL MTDX ;調(diào)寫入的數(shù)據(jù) (測試)
MOV SUBA,#00H ;指定存儲器地址
MOV R1,#MTD ;發(fā)送數(shù)據(jù)緩沖區(qū)送A
WR00:
MOV SLA,#CSI24WCXX
MOV NUMBYTE,#8 ;寫入8個字節(jié)數(shù)據(jù)
LCALL IWRNBYTE
CALL a5ms ;寫入一頁后延時5ms后再寫另一頁
MOV SUBA,#08H ;指定存儲器地址
MOV R1,#MTD+8
DJNZ B,WR00 ;2頁數(shù)據(jù)(16位)寫完否?未完繼續(xù)
MOV SUBA,#16 ;指定存儲器地址
MOV R1,#MTD+16
MOV SLA,#CSI24WCXX
MOV NUMBYTE,#2 ;寫入2個字節(jié)數(shù)據(jù)
LCALL IWRNBYTE
CALL a5ms
RET
;***** 向器件指定子地址寫N個數(shù)據(jù) ************
IWRNBYTE:
MOV A,NUMBYTE ;發(fā)送的字節(jié)數(shù)送A
MOV R3,A
LCALL START ;起動總線
MOV A,SLA ;器件從地址送A
LCALL WRBYTE ;發(fā)送器件從地址
LCALL CACK ;檢查應得位子程序
JNB ACK,RETWRN ;無應得則退出
MOV A,SUBA ;指定子地址
LCALL WRBYTE
LCALL CACK ;檢查應得位子程序(返回值ACK=1時表示有應得)
; MOV R1,#MTD ;發(fā)送數(shù)據(jù)緩沖區(qū)送A
WRDA:
MOV A,@R1
LCALL WRBYTE ;開始寫入數(shù)據(jù)
LCALL CACK
JNB ACK,IWRNBYTE
INC R1
DJNZ R3,WRDA ;判斷寫完沒有
RETWRN:
LCALL STOP ;結(jié)束總線子程序
RET
;---------------------------------------------------------------------------------------------
; 向器件指定地址讀取數(shù)據(jù)
RD24C02:
MOV B,#2 ;讀出的頁數(shù)
MOV R1,#MRD
MOV SUBA,#00H ;器件子地址
RD00:
MOV SLA,#CSI24WCXX ;器件從地址(0A0H)送入緩沖區(qū)SLA(50H)
MOV NUMBYTE,#8 ;讀取的字節(jié)數(shù)
CALL IRDNBYTE ;向器件指定的地址讀取數(shù)據(jù)
MOV SUBA,#08H ;指定存儲器地址
MOV R1,#MRD+8
DJNZ B,RD00 ;數(shù)據(jù)讀完否?未完繼續(xù)
MOV SLA,#CSI24WCXX ;器件從地址(0A0H)送入緩沖區(qū)SLA(50H)
MOV NUMBYTE,#2 ;讀取的字節(jié)數(shù)
MOV SUBA,#16 ;指定存儲器地址
MOV R1,#MRD+16
CALL IRDNBYTE ;向器件指定的地址讀取數(shù)據(jù)
RET
;******** 向器件指定地址讀取N個數(shù)據(jù) ***********
IRDNBYTE:
MOV R3,NUMBYTE ;接收字節(jié)數(shù)送R3
LCALL START
MOV A,SLA ;器件從地址送A
LCALL WRBYTE ;發(fā)送器件從地址
LCALL CACK
JNB ACK,RETRDN
MOV A,SUBA ;指定子地址
LCALL WRBYTE
LCALL CACK
LCALL START ;重新啟動總線
MOV A,SLA
INC A ;器件從地址加1,準備進行讀操作
LCALL WRBYTE
LCALL CACK
JNB ACK,IRDNBYTE ;無應重新開始
; MOV R1,#MRD ;接收數(shù)據(jù)緩沖區(qū)送A
RDN1:
LCALL RDBYTE ;讀操作開始
MOV @R1,A
DJNZ R3,SACK
LCALL MNACK ;最后一字節(jié)發(fā)NO應得信號
RETRDN:
LCALL STOP
RET
SACK:
LCALL MACK
INC R1
rdn2:
SJMP RDN1
;****** 啟動I2C總線子程序 *******
START:
SETB SDA
NOP
SETB SCL ;起始條件建立時間大于4.7us
NOP
NOP
NOP
NOP
NOP
CLR SDA
NOP ;起始條件鎖定時間大于4us
NOP
NOP
NOP
NOP
CLR SCL ;鉗著總線準備發(fā)數(shù)據(jù)
NOP
RET
;****** 結(jié)束總線子程序 ************
STOP:
CLR SDA
NOP
SETB SCL ;發(fā)送結(jié)束條件的時鐘信號
NOP ;結(jié)束總線時間大于4us
NOP
NOP
NOP
NOP
SETB SDA ;結(jié)束總線
NOP ;保證一個終止信號和起始信號的空閑時間大于4.7US
NOP
NOP
NOP
RET
;******** 發(fā)送應得信號子程序 *************
MACK:
CLR SDA ;將SDA清0
NOP
NOP
SETB SCL
NOP ;保持數(shù)據(jù)時間,即高時間大于4.7us
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
;******* 發(fā)送非應得信號子程序 **************
MNACK:
SETB SDA ;將SDA置1
NOP
NOP
SETB SCL
NOP ;保持數(shù)據(jù)時間,即SCL為高時間大于4.7us
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
;******* 檢查應得位子程序 **********
;返回值 ACK=1時表示有應答
CACK:
SETB SDA
NOP
NOP
SETB SCL
CLR ACK ;ACK標志位定義為10H
NOP
NOP
MOV C,SDA
JC CEND
SETB ACK ;判斷應答位
CEND:
NOP
CLR SCL
NOP
RET
;******** 發(fā)送字節(jié)子程序 ************
;字節(jié)數(shù)據(jù)放入ACC
;每發(fā)送一字節(jié)要調(diào)用一次CACK子程序,取應得位
WRBYTE:
MOV R0,#08H
WLP:
RLC A ;取數(shù)據(jù)
JC WR1 ;若CY=1則跳轉(zhuǎn),CY=0向下
SJMP WR0 ;判斷數(shù)據(jù)位
WLP1:
DJNZ R0,WLP
NOP
RET
WR1:
SETB SDA ;發(fā)送1
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
SJMP WLP1
WR0:
CLR SDA ;發(fā)送0
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
SJMP WLP1
;****** 讀取字節(jié)子程序 ************
;讀出的值在ACC中
;每取一字節(jié)要發(fā)送一個應答/非應答信號
RDBYTE:
MOV R0,#08H
RLP:
SETB SDA
NOP
SETB SCL ;時鐘線為高,接收數(shù)據(jù)位
NOP
NOP
MOV C,SDA ;讀取數(shù)據(jù)位
MOV A,R2
CLR SCL ;將SCL拉低,時間大于4.7us
RLC A ;進行數(shù)據(jù)位的處理
MOV R2,A
NOP
NOP
NOP
DJNZ R0,RLP ;未夠8位,再來一次
RET
A5MS:
PUSH ACC ;延時5ms子程序
PUSH B
MOV 10H,#10
DY1: MOV 11H,#0FFH
DJNZ 11H,$
DJNZ 10H,DY1
POP B
POP ACC
RET
;************* 測試數(shù)據(jù) ****************
MTDX:
MOV MTD,#01H
MOV MTD+1,#02H
MOV MTD+2,#03H
MOV MTD+3,#04H
MOV MTD+4,#5
MOV MTD+5,#6
MOV MTD+6,#7
MOV MTD+7,#8
; RET
MTDX1:
MOV MTD+8,#9
MOV MTD+9,#10
MOV MTD+10,#11
MOV MTD+11,#12
MOV MTD+12,#13
MOV MTD+13,#14
MOV MTD+14,#15
MOV MTD+15,#16
MOV MTD+16,#17
MOV MTD+17,#18
RET
END