Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

I2C interfacing problemeith eeprom 24c32a

Status
Not open for further replies.

pratheeshprm143

Newbie level 6
Joined
Oct 14, 2010
Messages
14
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Location
india
Activity points
1,440
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
 
Last edited:

If you are doing byte read then try to read with NACK..
If sequential read then all other read with ACK except last one, that one should be read with NACK...

Amit
** If you find my answer useful, please click the "Helpful? Please click" icon. **
 

try this code. It works.

**broken link removed**
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top