Hi, I am looking for simple read and write routines for I2C interface between Atmel low-end 89C55 microcontroller and 24C04 serial EEPROM.(esp. assembly code) Any help would be great . Thanks in Advance.
Check Philips appnotes, all you want (and more) Erik
hi,i have contacted u as i need help i am interfacing 24c04 to 89c52 microcontroller as an external ram can u help me in it.i will be thankful to u. emmad_satti@hotmail.com
What exactly is your problem? Stefan
Have you followed Erik's advice?
If you are interested in improving your knowledge follow what others have mentioned above...but if you just need the code... ;RAM LOCATION USED IN THIS MODULE 70H ;THIS IS A WORKING PROGRAM, TESTED ON 24C04 SERIAL MEMORY IC ;THE SAME CODE CAN BE USED FOR OTHER I2C IC'S WITH MODIFICATION. WTCMD EQU 10100000B ;24C04 WRITE COMMAND RDCMD EQU 10100001B ;24C04 READ COMMAND ADDRS EQU 70H SCL EQU P3.6 ;SERIAL CLOCK PIN SDA EQU P3.7 ;SERIAL DATA PIN ORG 0000H LJMP START ORG 0030H START: MOV P1,#01H MOV R1,#55H ; MOV A,#00 ;WRITE THE DATA IN R1 REGISTER INTO MOV ADDRS,A ;ADDRESS POINTED BY ADDRS INTO TEH 24C04 LCALL WRITE ; LCALL L_DELAY MOV A,#00 ; MOV ADDRS,A ;READ THE DATA FROM 24C04 FROM THE MEMORY LCALL READ ;LOCATION POINTED BY ADDRS AND STORE IN R2 MOV A,R2 ; MOV P1,A ;MOVE THE RED BACK DATA ONTO P0 LCALL L_DELAY LJMP START ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;THIS IS USED TO WRITE INTO 24C04 ;ARGUMENTS1 --> ADDRS => ADDRESS TO BE WRITTEN INTO,IN 24C04 MEMORY ;ARGUMENTS2 --> R1 ==> DATA TO BE WRITTEN ;RETURN --> NONE WRITE: MOV A,#WTCMD CALL OUTS MOV A,ADDRS CALL OUT MOV A,R1 CALL OUT CALL STOP RET ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;THIS SUB ROUTINE IS USED TO READ DATA FROM THE 24C04 ;ARGUMENTS --> ADDRS ==> ADDRESS IN 24C04,THE DATA SHOULD BE READ FROM. ;RETURN --> R2(DATA THAT WAS READ) READ: MOV A,#WTCMD CALL OUTS MOV A,ADDRS LCALL OUT MOV A,#RDCMD LCALL OUTS LCALL IN MOV R2,A LCALL STOP RET ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ OUTS: MOV B,#8 SETB SDA SETB SCL NOP CLR SDA NOP CLR SCL OSLOOP: RLC A MOV SDA,C SETB SCL NOP CLR SCL DJNZ B,OSLOOP SETB SDA NOP SETB SCL NOP CLR SCL RET ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ OUT: MOV B,#8 OLOOP: RLC A MOV SDA,C SETB SCL NOP CLR SCL DJNZ B,OLOOP SETB SDA NOP SETB SCL NOP CLR SCL RET ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IN: MOV B,#8 SETB SDA INLOOP: CLR SCL NOP SETB SCL MOV C,SDA RLC A DJNZ B,INLOOP CLR SCL RET ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ STOP: CLR SDA NOP SETB SCL NOP SETB SDA LCALL DLAYms RET ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ DLAYms: MOV R6,#150 MOV B,#00 MS1: DJNZ B,$ ;((2*255)+(2*255)*150 DJNZ B,$ ;=153 MILLI SECONDS DJNZ R6,MS1 RET ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ L_DELAY: MOV R7,#0AH ;153 MILLISECONDS * 10 LLL: LCALL DLAYms ;1.53 SECONDS DJNZ R7,LLL RET ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ END
;RAM LOCATION USED IN THIS MODULE 70H ;THIS IS A WORKING PROGRAM, TESTED ON 24C04 SERIAL MEMORY IC ;THE SAME CODE CAN BE USED FOR OTHER I2C IC'S WITH MODIFICATION. WTCMD EQU 10100000B ;24C04 WRITE COMMAND RDCMD EQU 10100001B ;24C04 READ COMMAND ADDRS EQU 70H SCL EQU P3.6 ;SERIAL CLOCK PIN SDA EQU P3.7 ;SERIAL DATA PIN ORG 0000H LJMP START ORG 0030H START: MOV P1,#01H MOV R1,#55H ; MOV A,#00 ;WRITE THE DATA IN R1 REGISTER INTO MOV ADDRS,A ;ADDRESS POINTED BY ADDRS INTO TEH 24C04 LCALL WRITE ; LCALL L_DELAY MOV A,#00 ; MOV ADDRS,A ;READ THE DATA FROM 24C04 FROM THE MEMORY LCALL READ ;LOCATION POINTED BY ADDRS AND STORE IN R2 MOV A,R2 ; MOV P1,A ;MOVE THE RED BACK DATA ONTO P0 LCALL L_DELAY LJMP START ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;THIS IS USED TO WRITE INTO 24C04 ;ARGUMENTS1 --> ADDRS => ADDRESS TO BE WRITTEN INTO,IN 24C04 MEMORY ;ARGUMENTS2 --> R1 ==> DATA TO BE WRITTEN ;RETURN --> NONE WRITE: MOV A,#WTCMD CALL OUTS MOV A,ADDRS CALL OUT MOV A,R1 CALL OUT CALL STOP RET ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;THIS SUB ROUTINE IS USED TO READ DATA FROM THE 24C04 ;ARGUMENTS --> ADDRS ==> ADDRESS IN 24C04,THE DATA SHOULD BE READ FROM. ;RETURN --> R2(DATA THAT WAS READ) READ: MOV A,#WTCMD CALL OUTS MOV A,ADDRS LCALL OUT MOV A,#RDCMD LCALL OUTS LCALL IN MOV R2,A LCALL STOP RET ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ OUTS: MOV B,#8 SETB SDA SETB SCL NOP CLR SDA NOP CLR SCL OSLOOP: RLC A MOV SDA,C SETB SCL NOP CLR SCL DJNZ B,OSLOOP SETB SDA NOP SETB SCL NOP CLR SCL RET ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ OUT: MOV B,#8 OLOOP: RLC A MOV SDA,C SETB SCL NOP CLR SCL DJNZ B,OLOOP SETB SDA NOP SETB SCL NOP CLR SCL RET ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IN: MOV B,#8 SETB SDA INLOOP: CLR SCL NOP SETB SCL MOV C,SDA RLC A DJNZ B,INLOOP CLR SCL RET ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ STOP: CLR SDA NOP SETB SCL NOP SETB SDA LCALL DLAYms RET ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ DLAYms: MOV R6,#150 MOV B,#00 MS1: DJNZ B,$ ;((2*255)+(2*255)*150 DJNZ B,$ ;=153 MILLI SECONDS DJNZ R6,MS1 RET ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ L_DELAY: MOV R7,#0AH ;153 MILLISECONDS * 10 LLL: LCALL DLAYms ;1.53 SECONDS DJNZ R7,LLL RET ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ END
hi. actually i am using c51 language for this job of interfacing 24C04 with 89c52 microcontroller can u give me a code in c51 language for that.i will be thankful to u.thanks.
"i will be thankful to u" That's not good enough, I want MONEY. Stefan
does anyone have any debug/signal functions for this kind of bit-level I2C code? Keil have an app note for I2C signal functions that respond to byte-registered I2C hardware blocks, but not I2C devices which the C51 controls directly, by programming the 2 pins, bit at a time, clock at a time.
Hi, look on my homepage (http://www.c51.de). I have written a complete I²C-Bus DLL with some simulations (RAM, EEPROM, RTC, I/O-Expander, ..) Mike
Michael Your I2C add-on for simulating serial eeproms worked very nicely. It clearly showed the 2-wire physical layer signalling, and nicely simulated responses to the application layer commands. It was much more than I was expecting! Thanks, Peter.