51單片機控制24C02串行E2PROM的讀寫(xiě)
讀寫(xiě)子程序如下:
;寫(xiě)串行E2PROM子程序EEPW
; R3=10100000(命令1010+器件3位地址+讀/寫(xiě)。 器件地址一個(gè)芯片,是000)
; (R4)=片內字節地址
; (R1)=欲寫(xiě)數據存放地址指針
; (R7)=連續寫(xiě)字節數n
EEPW: MOV P1,#0FFH
; R3=10100000(命令1010+器件3位地址+讀/寫(xiě)。 器件地址一個(gè)芯片,是000)
; (R4)=片內字節地址
; (R1)=欲寫(xiě)數據存放地址指針
; (R7)=連續寫(xiě)字節數n
EEPW: MOV P1,#0FFH
CLR P1.0 ;發(fā)開(kāi)始信號
MOV A,R3 ;送器件地址
ACALL SUBS
MOV A,R4 ;送片內字節地址
MOV A,R3 ;送器件地址
ACALL SUBS
MOV A,R4 ;送片內字節地址
ACALL SUBS
AGAIN: MOV A,@R1
ACALL SUBS ;調發(fā)送單字節子程序INC R1
DJNZ R7,AGAIN;連續寫(xiě)n個(gè)字節
CLR P1.0 ;SDA置0, 準備送停止信號
ACALL DELAY ;延時(shí)以滿(mǎn)足傳輸速率要求
SETB P1.1 ;發(fā)停止信號
ACALL DELAY
SETB P1.0
RET
SUBS: MOV R0,#08H ;發(fā)送單字節子程序
LOOP: CLR P1.1
RLC A
MOV P1.0,
NOP
SETB P1.1
ACALL DELAY
DJNZ R0,LOOP ;循環(huán)8次送8個(gè)bit
CLR P1.1
ACALL DELAY
SETB P1.1
REP: MOV C,P1.0
JC REP ;判應答到否,未到則
CLR P1.1
RER
DELAY: NOP
NOP
RET
;(R1)=欲讀數據存放地址指針
;; R3=10100001(命令1010+器件3位地址+讀/寫(xiě)。 器件地址一個(gè)芯片,是000)
;(R4)=片內字節地址
;(R7)=連續讀字節數
EEPR: MOV P1,#0FFH
CLR P1.0 ;發(fā)開(kāi)始信號
MOV A,R3 ;送器件地址
ACALL SUBS ;調發(fā)送單字節子程序
MOV A,R4 ;送片內字節地址
MOV A,R4 ;送片內字節地址
ACALL SUBS
MOV P1,#0FFH
CLR P1.0 ;再發(fā)開(kāi)始信號
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 ;接受單字節子程序
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 ;若是最后一個(gè)字節置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 ;應答畢,SDA置1
RET
程序中多處調用了DELAY子程序(僅兩條NOP指令),這是為了滿(mǎn)足I2C總線(xiàn)上數據傳送速率的要求,只有當SDA數據線(xiàn)上的數據穩定下來(lái)之后才能進(jìn)行讀寫(xiě)(即SCL線(xiàn)發(fā)出正脈沖)。另外,在讀最后一數據字節時(shí),置應答信號為“1”,表示讀操作即將完成。
上拉電阻相關(guān)文章:上拉電阻原理
評論