1. You can now buy finished microcontroller project from us, Check out the Store for the complete list of projects.
  2. Need a custom project, Send us some details about your project. So that we can quote the price for it.

Serial EEPROM Interfacing (AT24C08 with AT89C2051)

Interfacing I2C EEPROM with 8051 microcontroller.

  1. Binu
    Introduction:

    Many designers today are implementing embedded systems that require low cost non-volatile memory. Microchip has addressed this need with a full line of serial EEPROMs, in a variety of memory configurations, using the industry-standard 2- or 3-wire communication protocols.

    Circuit Diagram
    [​IMG]
    Program
    Code (Text):
    1. SDA1        EQU        P1.1        ;SDA=PIN5
    2. SCL1        EQU        P1.0                ;SCL=PIN6
    3.  
    4. WTCMD EQU  10100000B      ;WRITE DATA COMMAND
    5. RDCMD EQU  10100001B      ;READ DATA COMMAND
    6.  
    7.  
    8. ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    9. ;                STORE A BYTE IN EEPROM  (Data 8F in address location 2AH)
    10. ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                
    11.               MOV A,#WTCMD ;LOAD WRITE COMMAND
    12.               CALL OUTS ;SEND IT
    13.               MOV A,#2AH ;GET BYTE ADDRESS
    14.               CALL OUT ;SEND IT
    15.               MOV A,#8FH ;GET DATA
    16.               CALL OUT ;SEND IT
    17.               CALL STOP ;SEND STOP CONDITION
    18. ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    19. ;                        READ A BYTE FROM EEPROM FROM ADDRESS LOCATION 4DH
    20. ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                
    21.               MOV    A,#WTCMD        ;LOAD WRITE COMMAND TO SEND ADDRESS
    22.               CALL    OUTS            ;SEND IT
    23.               MOV    A,#4DH            ;GET LOW BYTE ADDRESS
    24.               CALL    OUT            ;SEND IT
    25.               CALL    CREAD          ;GET DATA BYTE
    26.               MOV A,R1
    27.               CALL MDELAY        
    28.                     RET
    29. ;***********************************************************************
    30. ;                EEPROM ROUTINES
    31. ;***********************************************************************
    32.  
    33.  
    34. ;***********************************************************************
    35. ; THIS ROUTINE SENDS OUT CONTENTS OF THE ACCUMULATOR
    36. ; to the EEPROM and includes START condition.  Refer to the data sheets
    37. ; for discussion of START and STOP conditions.
    38. ;***********************************************************************
    39.  
    40. OUTS:  MOV    R2,#8          ;LOOP COUNT -- EQUAL TO BIT COUNT
    41.         SETB  SDA1            ;INSURE DATA IS HI            
    42.         SETB    SCL1            ;INSURE CLOCK IS HI
    43.         NOP                    ;NOTE 1
    44.         NOP                  
    45.         NOP
    46.         CLR    SDA1            ;START CONDITION -- DATA = 0
    47.         NOP                    ;NOTE 1
    48.         NOP  
    49.         NOP
    50.         CLR    SCL1            ;CLOCK = 0
    51. OTSLP:  RLC    A              ;SHIFT BIT
    52.         JNC    BITLS
    53.         SETB    SDA1            ;DATA = 1
    54.         JMP    OTSL1          ;CONTINUE
    55. BITLS:  CLR    SDA1            ;DATA = 0
    56. OTSL1:  SETB    SCL1            ;CLOCK HI
    57.         NOP                    ;NOTE 1
    58.         NOP
    59.         NOP
    60.      
    61.         CLR    SCL1            ;CLOCK LOW
    62.         DJNZ    R2,OTSLP        ;DECREMENT COUNTER
    63.         SETB    SDA1            ;TURN PIN INTO INPUT
    64.         NOP                    ;NOTE 1
    65.                            
    66.         SETB    SCL1            ;CLOCK ACK
    67.         NOP                    ;NOTE 1
    68.         NOP
    69.         NOP
    70.    
    71.         CLR    SCL1
    72.         RET
    73.  
    74. ;**********************************************************************
    75. ; THIS ROUTINE SENDS OUT CONTENTS OF ACCUMLATOR TO EEPROM
    76. ; without sending a START condition.
    77. ;**********************************************************************
    78.  
    79. OUT:    MOV    R2,#8          ;LOOP COUNT -- EQUAL TO BIT COUNT
    80. OTLP:  RLC    A              ;SHIFT BIT
    81.         JNC    BITL        
    82.         SETB    SDA1            ;DATA = 1
    83.         JMP    OTL1            ;CONTINUE
    84. BITL:  CLR    SDA1            ;DATA = 0
    85. OTL1:  SETB    SCL1            ;CLOCK HI
    86.         NOP                    ;NOTE 1
    87.         NOP
    88.         NOP
    89.    
    90.         CLR    SCL1            ;CLOCK LOW
    91.         DJNZ    R2,OTLP        ;DECREMENT COUNTER
    92.         SETB    SDA1            ;TURN PIN INTO INPUT
    93.         NOP                    ;NOTE 1
    94.    
    95.         SETB    SCL1            ;CLOCK ACK
    96.         NOP                    ;NOTE 1
    97.         NOP
    98.         NOP
    99.    
    100.         CLR    SCL1
    101.         RET
    102.  
    103.  
    104. STOP:  CLR    SDA1            ;STOP CONDITION SET DATA LOW
    105.         NOP                    ;NOTE 1
    106.         NOP
    107.         NOP
    108.    
    109.         SETB    SCL1            ;SET CLOCK HI
    110.         NOP                    ;NOTE 1
    111.         NOP
    112.         NOP
    113.    
    114.         SETB    SDA1            ;SET DATA HIGH
    115.         RET
    116. ;*******************************************************************
    117. ; THIS ROUTINE READS A BYTE OF DATA FROM EEPROM
    118. ; From EEPROM current address pointer.
    119. ; Returns the data byte in R1
    120. ;*******************************************************************
    121. CREAD:  MOV    A,#RDCMD        ;LOAD READ COMMAND
    122.         CALL    OUTS            ;SEND IT
    123.         CALL    IN              ;READ DATA
    124.         MOV    R1,A            ;STORE DATA
    125.         CALL    STOP            ;SEND STOP CONDITION
    126.         RET
    127.  
    128. ;**********************************************************************
    129. ; THIS ROUTINE READS IN A BYTE FROM THE EEPROM
    130. ; and stores it in the accumulator
    131. ;**********************************************************************
    132.  
    133. IN:    MOV    R2,#8          ;LOOP COUNT
    134.         SETB    SDA1            ;SET DATA BIT HIGH FOR INPUT
    135. INLP:  CLR    SCL1            ;CLOCK LOW
    136.         NOP                    ;NOTE 1
    137.         NOP
    138.         NOP
    139.         NOP
    140.    
    141.         SETB    SCL1            ;CLOCK HIGH
    142.         CLR    C              ;CLEAR CARRY
    143.         JNB    SDA1,INL1      ;JUMP IF DATA = 0
    144.         CPL    C              ;SET CARRY IF DATA = 1
    145. INL1:  RLC    A              ;ROTATE DATA INTO ACCUMULATOR
    146.         DJNZ    R2,INLP        ;DECREMENT COUNTER
    147.         CLR    SCL1            ;CLOCK LOW
    148.         RET
    149.  
    150. ;*********************************************************************
    151. ; This routine test for WRITE DONE condition
    152. ; by testing for an ACK.
    153. ; This routine can be run as soon as a STOP condition
    154. ; has been generated after the last data byte has been sent
    155. ; to the EEPROM. The routine loops until an ACK is received from
    156. ; the EEPROM. No ACK will be received until the EEPROM is done with
    157. ; the write operation.
    158. ;*********************************************************************
    159. ACKTST: MOV    A,#WTCMD        ;LOAD WRITE COMMAND TO SEND ADDRESS
    160.         MOV    R2,#8          ;LOOP COUNT -- EQUAL TO BIT COUNT
    161.         CLR    SDA1            ;START CONDITION -- DATA = 0
    162.         NOP                    ;NOTE 1
    163.         NOP
    164.         NOP
    165.          
    166.         CLR    SCL1            ;CLOCK = 0
    167. AKTLP:  RLC    A              ;SHIFT BIT
    168.         JNC    AKTLS
    169.         SETB    SDA1            ;DATA = 1
    170.         JMP    AKTL1          ;CONTINUE
    171. AKTLS:  CLR    SDA1            ;DATA = 0
    172. AKTL1:  SETB    SCL1            ;CLOCK HI
    173.         NOP                    ;NOTE 1
    174.         NOP
    175.         NOP
    176.    
    177.         CLR    SCL1            ;CLOCK LOW
    178.         DJNZ    R2,AKTLP        ;DECREMENT COUNTER
    179.         SETB    SDA1            ;TURN PIN INTO INPUT
    180.         NOP                    ;NOTE 1
    181.    
    182.         SETB    SCL1            ;CLOCK ACK
    183.         NOP                    ;NOTE 1
    184.         NOP
    185.         NOP
    186.      
    187.         JNB    SDA1,EXIT      ;EXIT IF ACK (WRITE DONE)
    188.         JMP    ACKTST          ;START OVER
    189. EXIT:  CLR    SCL1            ;CLOCK LOW
    190.         CLR    SDA1            ;DATA LOW
    191.         NOP                    ;NOTE 1
    192.         NOP
    193.         NOP
    194.    
    195.         SETB    SCL1            ;CLOCK HIGH
    196.         NOP
    197.         NOP
    198.         SETB    SDA1            ;STOP CONDITION
    199.         RET
    200. ;*********************************************************************
Loading...