pratheeshprm143
Newbie level 6
I2C interfacing problem with eeprom 24c32a
hai
I have interfaced an EEPROM 24C32A with 89c51.
I can send data into EEPROM, but can't read the same
this is my asm & circuit. Plz help me.............
SDA EQU P1.1
SCL EQU P1.0
ORG 00H
AJMP MAIN
ORG 30H
MAIN: MOV R7,#08H //SEND COUNT//
MOV R6,#08H //RECEIVE COUNT//
SETB P3.0
MOV R2,#32H //STORE RECEIVED DATA FROM EEPROM//
LOCK1: JB P3.0,LOCK1
;SJMP LOCK2
//32 BYTES CONTINEOUS WRITE//
ACALL I2C_START //START I2C//
//WRITES THE DATA INTO SLAVE//
ACALL I2C_CONTROL_BYTE_W //START+SLAVE ADDRESS+DEVICE SELECT+ACK//
ACALL I2C_SEND //SEND DATA TO SLAVE//
ACALL SLAVE_ACK_CHECK //WAIT FOR ACK FROM SLAVE//
ACALL I2C_ADDRESS_BYTE_H //HIGHER ORDER ADDRESS BYTE//
ACALL I2C_SEND
ACALL SLAVE_ACK_CHECK
ACALL I2C_ADDRESS_BYTE_L //LOWER ORDER ADDRESS BYTE//
ACALL I2C_SEND
ACALL SLAVE_ACK_CHECK
CONTINUE_T:
ACALL I2C_DATA
ACALL I2C_SEND
ACALL SLAVE_ACK_CHECK
DJNZ R7,CONTINUE_T
ACALL I2C_STOP //STOP I2C//
LOCK2: JB P3.1,LOCK2
//READ THE DATA FROM THE SLAVE//
ACALL I2C_START
ACALL I2C_CONTROL_BYTE_W
ACALL I2C_SEND
ACALL SLAVE_ACK_CHECK
ACALL I2C_ADDRESS_BYTE_H
ACALL I2C_SEND
ACALL SLAVE_ACK_CHECK
ACALL I2C_ADDRESS_BYTE_L
ACALL I2C_SEND
ACALL SLAVE_ACK_CHECK
ACALL I2C_START
ACALL I2C_CONTROL_BYTE_R
ACALL I2C_SEND
ACALL SLAVE_ACK_CHECK
CONTINUE_R:
ACALL I2C_RECEIVE
;ACALL MASTER_ACK
DJNZ R6,CONTINUE_R
ACALL I2C_STOP
HERE: SJMP HERE
I2C_START: SETB SDA
MOV R0,#0AH
MOV R1,#0AH
SETB SCL
DJNZ R0,$
CLR SDA
DJNZ R1,$
CLR SCL
NOP
NOP
RET
I2C_CONTROL_BYTE_W: MOV A,#0A0H
RET
I2C_CONTROL_BYTE_R: MOV A,#0A1H
RET
I2C_SEND: MOV R0,#09H
OUT: CLR C
RLC A
MOV SDA,C
NOP
NOP
SETB SCL
NOP
NOP
CLR SCL
DJNZ R0,OUT
NOP
NOP
RET
I2C_RECEIVE: MOV R0,#08H
IN: CLR C
RLC A
MOV C,SDA
NOP
NOP
SETB SCL
NOP
NOP
CLR SCL
DJNZ R0,IN
MOV SDA,C
ACALL MASTER_ACK
RET
SLAVE_ACK_CHECK: JB SDA,SLAVE_ACK_CHECK
RET
MASTER_ACK: MOV R0,#05H
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
CLR SCL
NOP
NOP
DJNZ R0,$
SETB SCL
RET
I2C_ADDRESS_BYTE_H: MOV A,#00H
RET
I2C_ADDRESS_BYTE_L: MOV A,#00H
RET
I2C_DATA: MOV A,#11H
NOP
RET
I2C_STOP: CLR SDA
MOV R0,#07H
SETB SCL
DJNZ R0,$
SETB SDA
RET
ENDdesign_I2C.pdf
hai
I have interfaced an EEPROM 24C32A with 89c51.
I can send data into EEPROM, but can't read the same
this is my asm & circuit. Plz help me.............
SDA EQU P1.1
SCL EQU P1.0
ORG 00H
AJMP MAIN
ORG 30H
MAIN: MOV R7,#08H //SEND COUNT//
MOV R6,#08H //RECEIVE COUNT//
SETB P3.0
MOV R2,#32H //STORE RECEIVED DATA FROM EEPROM//
LOCK1: JB P3.0,LOCK1
;SJMP LOCK2
//32 BYTES CONTINEOUS WRITE//
ACALL I2C_START //START I2C//
//WRITES THE DATA INTO SLAVE//
ACALL I2C_CONTROL_BYTE_W //START+SLAVE ADDRESS+DEVICE SELECT+ACK//
ACALL I2C_SEND //SEND DATA TO SLAVE//
ACALL SLAVE_ACK_CHECK //WAIT FOR ACK FROM SLAVE//
ACALL I2C_ADDRESS_BYTE_H //HIGHER ORDER ADDRESS BYTE//
ACALL I2C_SEND
ACALL SLAVE_ACK_CHECK
ACALL I2C_ADDRESS_BYTE_L //LOWER ORDER ADDRESS BYTE//
ACALL I2C_SEND
ACALL SLAVE_ACK_CHECK
CONTINUE_T:
ACALL I2C_DATA
ACALL I2C_SEND
ACALL SLAVE_ACK_CHECK
DJNZ R7,CONTINUE_T
ACALL I2C_STOP //STOP I2C//
LOCK2: JB P3.1,LOCK2
//READ THE DATA FROM THE SLAVE//
ACALL I2C_START
ACALL I2C_CONTROL_BYTE_W
ACALL I2C_SEND
ACALL SLAVE_ACK_CHECK
ACALL I2C_ADDRESS_BYTE_H
ACALL I2C_SEND
ACALL SLAVE_ACK_CHECK
ACALL I2C_ADDRESS_BYTE_L
ACALL I2C_SEND
ACALL SLAVE_ACK_CHECK
ACALL I2C_START
ACALL I2C_CONTROL_BYTE_R
ACALL I2C_SEND
ACALL SLAVE_ACK_CHECK
CONTINUE_R:
ACALL I2C_RECEIVE
;ACALL MASTER_ACK
DJNZ R6,CONTINUE_R
ACALL I2C_STOP
HERE: SJMP HERE
I2C_START: SETB SDA
MOV R0,#0AH
MOV R1,#0AH
SETB SCL
DJNZ R0,$
CLR SDA
DJNZ R1,$
CLR SCL
NOP
NOP
RET
I2C_CONTROL_BYTE_W: MOV A,#0A0H
RET
I2C_CONTROL_BYTE_R: MOV A,#0A1H
RET
I2C_SEND: MOV R0,#09H
OUT: CLR C
RLC A
MOV SDA,C
NOP
NOP
SETB SCL
NOP
NOP
CLR SCL
DJNZ R0,OUT
NOP
NOP
RET
I2C_RECEIVE: MOV R0,#08H
IN: CLR C
RLC A
MOV C,SDA
NOP
NOP
SETB SCL
NOP
NOP
CLR SCL
DJNZ R0,IN
MOV SDA,C
ACALL MASTER_ACK
RET
SLAVE_ACK_CHECK: JB SDA,SLAVE_ACK_CHECK
RET
MASTER_ACK: MOV R0,#05H
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
CLR SCL
NOP
NOP
DJNZ R0,$
SETB SCL
RET
I2C_ADDRESS_BYTE_H: MOV A,#00H
RET
I2C_ADDRESS_BYTE_L: MOV A,#00H
RET
I2C_DATA: MOV A,#11H
NOP
RET
I2C_STOP: CLR SDA
MOV R0,#07H
SETB SCL
DJNZ R0,$
SETB SDA
RET
ENDdesign_I2C.pdf
Last edited: