24C02中帶有片內(nèi)地址寄存器。每寫入或讀出一個數(shù)據(jù)字節(jié)后,該地址寄存器自動加1,以實現(xiàn)對下一個存儲單元的讀寫。所有字節(jié)均以單一操作方式讀取。為降低總的寫入時間,一次操作可寫入多達(dá)8個字節(jié)的數(shù)據(jù)。
;這是將0600H地址中以下的8個數(shù)據(jù)寫到24C02的01H為首址單元中去的匯編程序
ORG 0000H
SCL BIT P3.4;定義24C02的串行時鐘線
SDA BIT P3.5;定義24C02的串行數(shù)據(jù)線
LJMP START
START:LCALL STAR;調(diào)用
MOV R2,#08H;一個數(shù)據(jù)有8位
MOV DPTR,#0600H;定義源數(shù)據(jù)的位置
LOOP:MOV A,#00H
MOVC A,@A+DPTR
LCALL SDATA
LCALL ACK
JC LOOP
INC DPTR
DJNZ R2,LOOP
LCALL STOP;調(diào)用停止子程序
STAR:SETB SDA
SETB SCL
NOP
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
CLR SCL
RET
SDATA:MOV R0,#08H
LOOP0:RLC A
MOV SDA,C
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
DJNZ R0,LOOP0
RET
ACK:SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
MOV C,SDA
CLR SCL
RET
STOP:CLR SDA
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
RET
ORG 0600H
DB 0A0H,10H,01H,02H,03H,04H,05H,06H
END
讀寫子程序如下:
;寫串行E2PROM子程序EEPW
; R3=10100000(命令1010+器件3位地址+讀/寫。 器件地址一個芯片,是000)
; (R4)=片內(nèi)字節(jié)地址
; (R1)=欲寫數(shù)據(jù)存放地址指針
; (R7)=連續(xù)寫字節(jié)數(shù)n
EEPW: MOVP1,#0FFH
CLRP1.0;發(fā)開始信號
MOVA,R3;送器件地址
ACALL SUBS
MOVA,R4;送片內(nèi)字節(jié)地址
ACALLSUBS
AGAIN: MOVA,@R1
ACALL SUBS;調(diào)發(fā)送單字節(jié)子程序INC R1
DJNZR7,AGAIN;連續(xù)寫n個字節(jié)
CLR P1.0;SDA置0, 準(zhǔn)備送停止信號
ACALLDELAY ;延時以滿足傳輸速率要求
SETB P1.1 ;發(fā)停止信號
ACALLDELAY
SETB P1.0
RET
SUBS: MOVR0,#08H ;發(fā)送單字節(jié)子程序
LOOP: CLRP1.1
RLCA
MOVP1.0,C
NOP
SETBP1.1
ACALL DELAY
DJNZR0,LOOP ;循環(huán)8次送8個bit
CLRP1.1
ACALL DELAY
SETBP1.1
REP: MOVC,P1.0
JCREP;判應(yīng)答到否,未到則等待
CLR P1.1
RET
DELAY: NOP
NOP
RET
;讀串行E2PROM子程序EEPR
;(R1)=欲讀數(shù)據(jù)存放地址指針
;; R3=10100001(命令1010+器件3位地址+讀/寫。 器件地址一個芯片,是000)
;(R4)=片內(nèi)字節(jié)地址
;(R7)=連續(xù)讀字節(jié)數(shù)
EEPR: MOVP1,#0FFH
CLRP1.0;發(fā)開始信號
MOVA,R3;送器件地址
ACALL SUBS ;調(diào)發(fā)送單字節(jié)子程序
MOVA,R4;送片內(nèi)字節(jié)地址
ACALL SUBS
MOVP1,#0FFH
CLRP1.0;再發(fā)開始信號
MOVA,R3
SETBACC.0;發(fā)讀命令
ACALL SUBS
MORE: ACALL SUBR
MOV@R1,A
INCR1
DJNZ R7,MORE
CLRP1.0
ACALL DELAY
SETB P1.1
ACALL DELAY
SETBP1.0 ;送停止信號
RET
SUBR: MOV R0,#08H ;接受單字節(jié)子程序
LOOP2: SETB P1.1
ACALL DELAY
MOVC,P1.0
RLCA
CLRP1.1
ACALL DELAY
DJNZ R0,LOOP2
CJNE R7,#01H,LOW
SETB P1.0;若是最后一個字節(jié)置A=1
AJMP SETOK
LOW: CLRP1.0;否則置A=0
SETOK: ACALL DELAY
SETB P1.1
ACALL DELAY
CLRP1.1
ACALL DELAY
SETBP1.0;應(yīng)答畢,SDA置1
RET
程序中多處調(diào)用了DELAY子程序(僅兩條NOP指令),這是為了滿足I2C總線上數(shù)據(jù)傳送速率的要求,只有當(dāng)SDA數(shù)據(jù)線上的數(shù)據(jù)穩(wěn)定下來之后才能進(jìn)行讀寫(即SCL線發(fā)出正脈沖)。另外,在讀最后一數(shù)據(jù)字節(jié)時,置應(yīng)答信號為“1”,表示讀操作即將完成。
-
存儲芯片
+關(guān)注
關(guān)注
11文章
881瀏覽量
43050 -
AT24C02
+關(guān)注
關(guān)注
0文章
79瀏覽量
24239 -
E2PROM
+關(guān)注
關(guān)注
0文章
29瀏覽量
18564
發(fā)布評論請先 登錄
相關(guān)推薦
評論