51單片機(jī)控制24C02串行E2PROM的讀寫
讀寫子程序如下:
;寫串行E2PROM子程序EEPW
; R3=10100000(命令1010+器件3位地址+讀/寫。 器件地址一個芯片,是000)
; (R4)=片內(nèi)字節(jié)地址
; (R1)=欲寫數(shù)據(jù)存放地址指針
; (R7)=連續(xù)寫字節(jié)數(shù)n
EEPW: MOV P1,#0FFH
; R3=10100000(命令1010+器件3位地址+讀/寫。 器件地址一個芯片,是000)
; (R4)=片內(nèi)字節(jié)地址
; (R1)=欲寫數(shù)據(jù)存放地址指針
; (R7)=連續(xù)寫字節(jié)數(shù)n
EEPW: MOV P1,#0FFH
CLR P1.0 ;發(fā)開始信號
MOV A,R3 ;送器件地址
ACALL SUBS
MOV A,R4 ;送片內(nèi)字節(jié)地址
MOV A,R3 ;送器件地址
ACALL SUBS
MOV A,R4 ;送片內(nèi)字節(jié)地址
ACALL SUBS
AGAIN: MOV A,@R1
ACALL SUBS ;調(diào)發(fā)送單字節(jié)子程序INC R1
DJNZ R7,AGAIN;連續(xù)寫n個字節(jié)
CLR P1.0 ;SDA置0, 準(zhǔn)備送停止信號
ACALL DELAY ;延時以滿足傳輸速率要求
SETB P1.1 ;發(fā)停止信號
ACALL DELAY
SETB P1.0
RET
SUBS: MOV R0,#08H ;發(fā)送單字節(jié)子程序
LOOP: CLR P1.1
RLC A
MOV P1.0,
NOP
SETB P1.1
ACALL DELAY
DJNZ R0,LOOP ;循環(huán)8次送8個bit
CLR P1.1
ACALL DELAY
SETB P1.1
REP: MOV C,P1.0
JC REP ;判應(yīng)答到否,未到則
CLR P1.1
RER
DELAY: NOP
NOP
RET
;(R1)=欲讀數(shù)據(jù)存放地址指針
;; R3=10100001(命令1010+器件3位地址+讀/寫。 器件地址一個芯片,是000)
;(R4)=片內(nèi)字節(jié)地址
;(R7)=連續(xù)讀字節(jié)數(shù)
EEPR: MOV P1,#0FFH
CLR P1.0 ;發(fā)開始信號
MOV A,R3 ;送器件地址
ACALL SUBS ;調(diào)發(fā)送單字節(jié)子程序
MOV A,R4 ;送片內(nèi)字節(jié)地址
MOV A,R4 ;送片內(nèi)字節(jié)地址
ACALL SUBS
MOV P1,#0FFH
CLR P1.0 ;再發(fā)開始信號
MOV A,R3
SETB ACC.0 ;發(fā)讀命令
ACALL SUBS
MORE: ACALL SUBR
MOV @R1,A
INC R1
DJNZ R7,MORE
CLR P1.0
ACALL DELAY
SETB P1.1
ACALL DELAY
SETB P1.0 ;送停止信號
RE
SUBR: MOV R0,#08H ;接受單字節(jié)子程序
LOOP2: SETB P1.1
ACALL DELAY
MOV C,P1.0
RLC
CLR P1.1
ACALL DELAY
DJNZ R0,LOOP2
CJNE R7,#01H,LOW
SETB P1.0 ;若是最后一個字節(jié)置A=1
AJMP SETOK
LOW: CLR P1.0 ;否則置A=0
SETOK: ACALL DELAY
SETB P1.1
ACALL DELAY
CLR P1.1
ACALL DELAY
SETB P1.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)文章:上拉電阻原理
評論