This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

AT24Cxx

Hi everyone. Iam having a problem with interfacing an AT24C04 to the AT89C2051 microcontroller. On the display , I don't get the number I sent to the eeprom. Can anyone help?
This is my code. I downloaded the code from the internet and modified it a little bit.
The compiler is KEIL.
Thanks in advance.
Now here is the code that won't work.

;********************************************************************** ; THE FOLLOWING CODE SHOWS AN INTERFACE BETWEEN AN 8051 MICROCONTROLLER ; AND CATALYST'S I2C FAMILY OF EEPROMS. ; ; IT DEMONSTRATES A BYTE WRITE/BYTE READ ROUTINE AND A PAGE MODE ; WRITE/SEQUENTIAL READ ROUTINE. IT USES TWO LINES FROM PORT 1 ; (P1.0 AND P1.1) OF THE 8051 TO COMMUNICATE WITH THE CAT24CXX. ; ; THIS PROGRAM WILL WORK WITH THE CAT24WC02/04/08/16 DEVICES.
;NOTE: ; THE 24WC02 HAS AN 8 BYTE PAGE BUFFER AND 24WC04/08/16 HAVE A ; 16-BYTE PAGE BUFFER.
;*********************************************************************

SCL BIT P3.4 ;SCL BIT IS PORT 1,BIT 0

SDA BIT P3.5 ;SDA BIT IS PORT 1,BIT 1

SLV_ADDR EQU 0101B ;FIXED SLAVE ADDRESS BITS

DATAOUT EQU R5 ;DATA READ FROM DEVICE

ACK_READ EQU 10000101B ;READ FOR ACK POLLING

DSEG ORG 0030H

PAGE_DATA: DS 1 BLK_ADDR: DS 1 BYTE_ADDR: DS 1 BYTE_DATA: DS 1

ORG 40H STACK: DS 31

CSEG ORG 0040H LJMP BEGIN

ORG 0100H BEGIN: MOV SP,#STACK ;INITIALIZE STACK POINTER

MOV BLK_ADDR,#000B ;INITIALIZE 2K BLOCK

MOV BYTE_DATA,#05H ;BYTE DATA MOV BYTE_ADDR,#00H ;BYTE ADDRESS MOV PAGE_DATA,#0AAH ;PAGE DATA

; ACALL PAGE_WR ;CALL PAGE WRITE ROUTINE

;ACALL SEQ_RD ;CALL SEQ. READ ROUTINE

ACALL BYTE_WR ;CALL BYTE WRITE ROUTINE

ACALL SELECT_RD ;CALL BYTE READ ROUTINE MOV A,DATAOUT ACALL DISPLAY

DONE: LJMP DONE ;LOOP UNTIL RESET OCCURS

;*******************************************

;************** BYTE WRITE *****************

BYTE_WR: ACALL START_BIT ;SEND START BIT MOV A,#SLV_ADDR ;FIRST 4 SLAVE ADDRESS MOV R7,#4H ;BITS ACALL SHFTO MOV A,BLK_ADDR ;2K BLOCK ADDRESS MOV R7,#3H ACALL SHFTO

MOV A,#00H ;R/W BIT SET TO 0 FOR MOV R7,#1H ; WRITE ACALL SHFTO ACALL SLAVE_ACK

MOV A,BYTE_ADDR ;BYTE ADDRESS MOV R7,#8H ACALL SHFTO ACALL SLAVE_ACK MOV A,BYTE_DATA ;BYTE DATA MOV R7,#8H ACALL SHFTO ACALL SLAVE_ACK ACALL STOP_BIT ;STOP BIT ACALL ACK_POL ;CALL ACK POLLING,WAIT RET ;FOR END OF WRITE CYCLE

;*******************************************

;************** PAGE WRITE *****************

PAGE_WR: ACALL START_BIT ;SEND START BIT MOV A,#SLV_ADDR ;FIRST 4 SLAVE ADDRESS MOV R7,#4H ;BITS ACALL SHFTO MOV A,BLK_ADDR ;2K BLOCK ADDRESS MOV R7,#3H ACALL SHFTO MOV A,#00H ;R/W BIT SET TO 0 FOR MOV R7,#1H ;WRITE ACALL SHFTO ACALL SLAVE_ACK MOV A,BYTE_ADDR ;BYTE ADDRESS MOV R7,#8H ACALL SHFTO ACALL SLAVE_ACK MOV R4,#0FH NEXT_DATA: ;WRITE 16 BYTES TO MOV A,PAGE_DATA ;EEPROM MOV R7,#8H ACALL SHFTO ACALL SLAVE_ACK DJNZ R4,NEXT_DATA ACALL STOP_BIT ACALL ACK_POL ;CALL ACK POLLING,WAIT

RET ;FOR END OF WRITE CYCLE

;*******************************************

;************** ACK_POL ********************

ACK_POL: MOV R3,#40H ;# OF TIMES TO POLL ACK_LOOP: DJNZ R3,DONE_YET ;DEVICE SJMP DN_ACKPOL DONE_YET: ACALL START_BIT ;SEND START BIT MOV A,#ACK_READ ;SEND READ MOV R7,#8H ACALL SHFTO ACALL SLAVE_ACK ;SEND ACKNOWLEDGE JC ACK_LOOP ;LOOP IF NO ACK RCVD, ;JUMP IF ACK RCVD DN_ACKPOL: ACALL STOP_BIT ;SEND STOP BEFORE RETURN

RET
;*******************************************

;************** SHFTO **********************

SHFTO: CLR SCL NXTSHF: CLR SCL RRC A ;ROTATE DATA INTO CARRY

MOV SDA,C ;SEND CARRY TO SDA SETB SCL DJNZ R7,NXTSHF RET ;*******************************************

;************** START BIT ******************

START_BIT: SETB SCL ;START BIT NOP SETB SDA NOP CLR SDA NOP CLR SCL RET ;*******************************************

;************** STOP BIT *******************

STOP_BIT: CLR SDA ;STOP BIT NOP SETB SCL NOP SETB SDA RET ;*******************************************

;************** SLAVE ACKNOWLEDGE **********

SLAVE_ACK: NOP NOP CLR SCL ;SLAVE ACKNOWLEDGE BIT

NOP SETB SDA NOP NOP SETB SCL NOP NOP NOP MOV C,SDA ;READ STATE OF SDA, CLR SCL ;SAVE TO CARRY RET

;*******************************************

;************** MASTER ACKNOWLEDGE *********

MSTR_ACK: CLR SCL ;MASTER ACKNOWLEDGE BIT

NOP CLR SDA NOP NOP SETB SCL NOP CLR SCL NOP SETB SDA RET ;*******************************************

;************** NO ACKNOWLEDGE *************

NO_ACK: SETB SDA ;NO ACKNOWLEDGE NOP SETB SCL NOP CLR SCL RET ;*******************************************

;************** SELECTIVE READ *************

SELECT_RD: ACALL START_BIT ;START BIT

MOV A,#SLV_ADDR ;DUMMY WRITE TO FIRST MOV R7,#4H ;2K BLOCK ACALL SHFTO MOV A,BLK_ADDR ;2K BLOCK ADDRESS MOV R7,#3H ACALL SHFTO MOV A,#00H ;R/W BIT SET TO 0 MOV R7,#1H ;FOR WRITE ACALL SHFTO ACALL SLAVE_ACK ;SEND ACKNOWLEDG MOV A,BYTE_ADDR ;ADDRESS TO READ MOV R7,#8H ACALL SHFTO ACALL SLAVE_ACK

ACALL START_BIT ;NEW START BIT

MOV A,#SLV_ADDR MOV R7,#4H

ACALL SHFTO MOV A,BLK_ADDR ;2K BLOCK TO READ MOV R7,#3H ACALL SHFTO MOV A,#1H ;R/W BIT SET TO 1 MOV R7,#1H ;FOR READ ACALL SHFTO ACALL SLAVE_ACK

MOV R7,#8H CLOCK8: SETB SCL ;CLOCK IN DATA NOP MOV C,SDA CLR SCL MOV A,DATAOUT RLC A ;ROTATE NEXT BIT MOV DATAOUT,A ;SAVE ROTATED DATA DJNZ R7,CLOCK8 ;READ 8 BITS OF DATA ACALL NO_ACK ACALL STOP_BIT CLR P3.7 ; Indicate Read RET ;*******************************************

DISPLAY:
MOV DPTR,#07E0h
MOVC A,@A+DPTR
CPL A
Mov P1,A
SETB P3.0
SETB P3.1
CLR P3.2
RET

ORG 07E0h ; Reserve code memory space to hold the following DATA NUMBER_DOT: DB 02h,09Eh,024h,0Ch,098h,048h,040h,01Eh,00h,08h ; "Array1"

END

0