Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
04/04/07 15:37
Read: times


 
#136607 - Working code...
Responding to: ???'s previous message
Hello Asif,
Here is a piece of working code which was used along with C, hope it solves your problem.This was used with an AT89C51 and AT24C04.

If I can recall correctly, I put this together from Philips and Atmel application notes.

You can you use the assembler portion alone with modificaton.


$NOMOD51
$INCLUDE (REG515.INC)
NAME    I2C                                     ;name of the program module
;FILE NAME - I2C.A51

;-----------------------------------------------------------------------------
;  THIS MODULE CONTAINS THE I2C DRIVER ROUTINES                              
;  27/08/98,07/12/98                                                        
;-----------------------------------------------------------------------------
?PR?ReadWriteI2c?I2C SEGMENT CODE             ;segment for program code
?DT?ReadWriteI2c?I2C SEGMENT DATA OVERLAYABLE ;segment for local variables
?BI?ReadWriteI2c?I2C SEGMENT BIT  OVERLAYABLE ;segment for local bit var 

PUBLIC  _ReadWriteI2c                           ;public symbols
PUBLIC  ?_ReadWriteI2c?BYTE                   ;for 'C'            
PUBLIC  ?_ReadWriteI2c?BIT                    ;function calls

        RSEG    ?DT?ReadWriteI2c?I2C          ;segment for local variables
?_ReadWriteI2c?BYTE:                          ;start of parameter passing
                                                ;segment
i2c_slave_address:      ds      1               
i2c_register_address:   ds      1
write_i2c_data:         ds      1

        RSEG    ?BI?ReadWriteI2c?I2C          ;segment for local bit var
?_ReadWriteI2c?BIT:                           ;start of parameter passing
                                                ;segment
read_write_flag:        dbit    1



;----------------------------------------------------------------------------
;       I2C PORT PIN DEFINITIONS                                  
;----------------------------------------------------------------------------

SDA                     EQU     P3.6                                    
SCL                     EQU     P3.7                                    

        RSEG    ?PR?ReadWriteI2c?I2C
        USING   0
            
_ReadWriteI2c:
;----------------------------------------------------------------------------
;       08/12/98
;       CHECK WHETHER READ OR WRITE
;       IF CY = 1 THEN IT IS READ, IF CY = 0 THEN IT IS WRITE
;----------------------------------------------------------------------------
        JB      CY, READ_I2C_REGISTER
        JMP     WRITE_I2C_REGISTER


;----------------------------------------------------------------------------
;       LOW LEVEL I2C MACROS
;----------------------------------------------------------------------------
SET_SCL         MACRO
                SETB    SCL
                JNB     SCL,$
                BIT_DELAY
                ENDM

CLEAR_SCL       MACRO
                CLR     SCL                
                BIT_DELAY
                ENDM

EMIT_CLOCK      MACRO
                SET_SCL
                CLEAR_SCL
                ENDM

START           MACRO
                SETB    SDA
                SET_SCL
                CLR     SDA
                BIT_DELAY
                CLEAR_SCL
                ENDM

STOP            MACRO
                CLR     SDA
                SET_SCL
                SETB    SDA
                BIT_DELAY
                ENDM

BIT_DELAY       MACRO
                NOP
                NOP
                ;NOP     ;04/02/2003 for 24Mhz
                ENDM 
        
;----------------------------------------------------------------------------
;       I2C SUBROUTINES
;----------------------------------------------------------------------------

XMIT_BYTE:

        ;ACC CONTAINS BYTE TO TRANSMIT
        ;CY= 0 IF SEQUENCE COMPLETES
        ;CY= 1 IF UNABLE TO TRANSMIT
        

        MOV     R1,#8                           ;8 BITS TO SEND

XB1:
        RLC     A                                                                               
        MOV     SDA, C                          ;PUT BIT ON PIN
        EMIT_CLOCK                              ;EMIT CLOCK PULSE
        DJNZ    R1,XB1                          ;LOOP UNTIL DONE

        ;SETUP TO ACK FROM SLAVE DEVICE

        SETB    SDA                             ;RELEASE DATA PIN
        SET_SCL                                 ;SCL HIGH
        JNB     SDA,XB2                         ;JUMP IF ACK SEEN
        CLEAR_SCL                               ;DROP SCL
        SETB    C                               ;SET ERROR CODE
        RET

XB2:
        CLEAR_SCL                               ;DROP SCL
        CLR     C                               ;SET COMPLETION CODE
        RET
;----------------------------------------------------------------------------

REC_BYTE:

        ;RECEIVE A BYTE OVER THE I2C BUS
        ;ACC CONTAINS RECEIVED BYTE
        ;CY IS DUMMIED UP WITH A 0

        MOV     R1,#8                           ;8 BITS TO RECEIVE

RB1:
        SET_SCL                                 ;SCL HIGH
        MOV     C,SDA                           ;PICK BIT OFF A PIN
        RLC     A
        CLEAR_SCL                                 ;SCL LOW
        DJNZ    R1,RB1                          ;MORE BITS TO RECEIVE?
        CLR     C                               ;MUST COMPLETE OK
        RET
                                                        
;----------------------------------------------------------------------------
;       TRANMIT ADDRESS AND DATA REGISTERED BYTE OVER I2C BUS
;       R7 CONTAINS SLAVE ADDRESS
;       R5 CONTAINS REGISTER ADDRESS
;       R3 CONTAINS DATA BYTE
;       CY = 0 IF SEQUENCE COMPLETES
;       CY = 1 IF UNABLE TO TRANSMIT
;----------------------------------------------------------------------------

XD_FAULT:                                       ;BUS FAULTL

        SETB    C                               ;SET ERROR CODE            
        RET

WRITE_I2C_REGISTER:

        JNB     SCL,XD_FAULT
        JNB     SDA,XD_FAULT                    ;JUMP IF BUS FAULT
        MOV     A,R7                            ;SETUP SLAVE ADDRESS
        CLR     ACC.0                           ;INDICATE WRITE OPERATION
        START                                   ;SET START CONDITION
        ACALL   XMIT_BYTE                       ;SEND SLAVE ADDRESS
        JC      XD2                             ;JUMP ON ERROR
        MOV     A,R5                            ;SETUP REGISTER ADDRESS
        ACALL   XMIT_BYTE                       ;SEND REGISTER ADDRESS
        JC      XD2                             ;JUMP ON ERROR
        MOV     A,R3                            ;SETUP DATA BYTE
        ACALL   XMIT_BYTE                       ;GO SEND

;       SET STOP CONDITION, RETURN CODE IS ALREADY IN CY

XD2:     
        STOP                                    ;SET STOP CONDITION
        RET
;----------------------------------------------------------------------------
;       TRANSMIT ADDRESS AND RECEIVE REGISTERED DATA BYTE OVER I2C BUS
;       R7      CONTAINS SLAVE ADDRESS
;       R5      CONTAINS REGISTER ADDRESS
;       CY      = 0 IF SEQUENCE COMPLETES
;       CY      = 1 IF UNABLE TO RECEIVE
;       R3      CONTAINS RECEIVED BYTE IF CY = 0
;----------------------------------------------------------------------------

RD_FAULT:

        SETB    C                               ;SET ERROR CONDITION
        RET

READ_I2C_REGISTER:

        JNB     SCL,RD_FAULT
        JNB     SDA,RD_FAULT                    ;JUMP IF BUS FAULT
        MOV     A,R7                            ;SETUP SLAVE ADDRESS
        CLR     ACC.0                           ;INDICATE READ OPERATION
        START
        PUSH    ACC
        ACALL   XMIT_BYTE                       ;SEND SLAVE ADDRESS
        POP     ACC
        JC      RD3                             ;JUMP ON ERROR
        XCH     A,R5                            ;SET UP REGISTER ADDRESS
        ACALL   XMIT_BYTE                       ;SEND REGISTER ADDRESS
        JC      RD3                             ;JUMP ON ERROR
        START                                   ;SET REPEATED START
        MOV     A,R7                            ;SETUP SLAVE ADDRESS
        SETB    ACC.0                           ;INDICATE READ OPERATION
        ACALL   XMIT_BYTE                       ;SEND SLAVE ADDRESS AGAIN
        JC      RD3                             ;JUMP ON ERROR

RD1:    
        ACALL   REC_BYTE                        ;GO RECEIVE
        MOV     R7,A                            ;STORE DATE BYTE 

;SEQUENCE COMPLETE, RETURN CODE IS ALREADY IN CY

RD2:
        SETB    SDA                             ;SET SDA IDLE
        EMIT_CLOCK                              ;EMIT CLOCK PULSE

RD3:
        STOP                                    ;SET STOP CONDITION
        RET

        END


John.


List of 74 messages in thread
TopicAuthorDate
How To Write the Data to EEPROM (Seial)            01/01/70 00:00      
   Slow the i2c clock            01/01/70 00:00      
      Well i am using 12 MHz with 8051            01/01/70 00:00      
         Speed            01/01/70 00:00      
         this is upon you to determine            01/01/70 00:00      
   the poor developer's "logic analyzer"....            01/01/70 00:00      
   What happens in the real hardware?            01/01/70 00:00      
      writing IS broken - but in several ways            01/01/70 00:00      
         I I Sir, i will use spaces for next, :-)            01/01/70 00:00      
            delay for write plus the real error            01/01/70 00:00      
      Sir i'v used P1 to see that data is written or not            01/01/70 00:00      
         Order of magnitude!            01/01/70 00:00      
         is it 100kHz or 1000kHz?            01/01/70 00:00      
      I dont have osciloscop :-(            01/01/70 00:00      
   In real world the P1 is High,            01/01/70 00:00      
   Code Comments            01/01/70 00:00      
      again "I I SIR", well sir i have got your Point,            01/01/70 00:00      
         to Asif (and others)            01/01/70 00:00      
   I2C Part number ...            01/01/70 00:00      
   Even the NOPs and delay wont working            01/01/70 00:00      
   I have Codded this in C,But still not working :-(            01/01/70 00:00      
      not a good idea            01/01/70 00:00      
      Asif,s C Code for I2C            01/01/70 00:00      
         You missed the point            01/01/70 00:00      
            Point taken            01/01/70 00:00      
   are you sure they are IIC, not SMB            01/01/70 00:00      
      To be very Honest i dont know tha its IIC or SMB            01/01/70 00:00      
         try this            01/01/70 00:00      
   Have you looked here?            01/01/70 00:00      
      Working code...            01/01/70 00:00      
         advice to Asif            01/01/70 00:00      
            i know that i dont have to Copy Paste,, :-)            01/01/70 00:00      
               WoW i have EEPROM Programmer,            01/01/70 00:00      
                  is it working at all?            01/01/70 00:00      
            What about the A0, A1... pins on the 24C04            01/01/70 00:00      
   Well sir Here are Comparision of C and ASM(My Way)            01/01/70 00:00      
      I few I2C questions            01/01/70 00:00      
         it is not uncommon to list IIC addresses this way,            01/01/70 00:00      
            I was askin for schematics...            01/01/70 00:00      
               Here is the Schematics,            01/01/70 00:00      
                  Pardon??            01/01/70 00:00      
                     Well sir it means this ckt is Dummy            01/01/70 00:00      
                        OK            01/01/70 00:00      
                           Well i am straight forward programmer :-)            01/01/70 00:00      
                           Well the Hardware Circuit is Exactly same as it.            01/01/70 00:00      
                              Not at all!            01/01/70 00:00      
                     Recheck it Sir i have added labels, :-)            01/01/70 00:00      
                        but            01/01/70 00:00      
                        and blinkey?            01/01/70 00:00      
                           It really worked :-) MCu is stucked at ACK            01/01/70 00:00      
                              Stuck at ACK            01/01/70 00:00      
                              Stuck in no ACK            01/01/70 00:00      
                                 Sorry i havent understood, forgive my dumbness            01/01/70 00:00      
                                    Stuck in ACK (Reminds me of work)            01/01/70 00:00      
                                    Still Stuck?            01/01/70 00:00      
                                       Sir i am gonna use the Acknowledge polling tech:-)            01/01/70 00:00      
                                          one note            01/01/70 00:00      
                                             Nice note:-) but it Clocking was wrong,            01/01/70 00:00      
                                       Sir i am gonna use the Acknowledge polling tech:-)            01/01/70 00:00      
   Here is working Code, :-)            01/01/70 00:00      
      for your benefit and others            01/01/70 00:00      
         Havent Gotten your Idea ?            01/01/70 00:00      
            The idea is            01/01/70 00:00      
               WoW i have Gotten the IDEA , thanks            01/01/70 00:00      
   The Problem Solved Successfully,Thanks everybody            01/01/70 00:00      
      You have the code working now            01/01/70 00:00      
         Thanks David            01/01/70 00:00      
         Partially agree            01/01/70 00:00      
            100% agreed            01/01/70 00:00      
            I was rying to help !!            01/01/70 00:00      
               true and untrue            01/01/70 00:00      
                  C Loops are not Perfect, agreed            01/01/70 00:00      
                  C timing loops            01/01/70 00:00      
                     then don't call it C            01/01/70 00:00      

Back to Subject List