Listing 1--I2C EEPROM-uC-Interface Routine DEVADDR equ 0a0h ; EPROM I2C device address scl bit p3.4 sda bit p3.5 ; register usage ; r0 buf_ptr ; pointer to internal RAM buffer for block transfers ; r1 count ; byte count for block transfers ; r2 addr_lo ; 2-byte memory address (up to 11 bits used) ; r3 addr_hi ; r4 scratch ; used internally write_block: ; write block from RAM to EEPROM acall send_full_address jc fin wblop: mov a, @r0 inc r0 acall shift_out jc stop djnz r1, wblop sjmp stop write_byte: ; write single byte from ACC to EEPROM push acc acall send_full_address pop acc jc fin acall shift_out sjmp stop read_block: ; read block from EEPROM to RAM ; 342 + 102 * nbytes acall send_full_address jc fin acall send_devaddr_rd jnc rb1 ret rblop: mov a, #0ffh ; input data from SDA and send ACK acall shift setb SDA mov @r0, a inc r0 rb1: djnz r1, rblop ; 2 + 102 * nbytes acall shift_in_nak mov @r0, a inc r0 sjmp end_read read_random: ; read random byte from EEPROM to ACC ; 448 C acall send_full_address jc fin read_current: ; read next byte from active EEPROM page to ACC ; 224 C acall send_devaddr_rd jc fin acall shift_in_nak end_read: ; 10 C clr c stop: ; Send STOP ; 9 C clr SDA setb SCL nop nop nop nop setb SDA ; 4.7us after SCL ; SCL & SDA high. ret send_full_address: ; 220 C clr c acall send_devaddr ; send device address jc fin ; send byte address mov a, r2 sjmp soasc send_devaddr_rd: ; 112 C setb c send_devaddr: ; 111 C ; Send START setb SCL jnb SCL, bbsy ; Check if bus available jnb SDA, bbsy clr SDA ; min. 4.7 us after SCL high mov a, r3 rlc a orl a, #DEVADDR clr SCL ; min. 4.0 us after SDA low ; SCL & SDA low. ; send device id, 3 msbits of address and rw bit (from c) soasc: ; 101 C acall shift_out jc stop fin: ret bbsy: ; bus not available setb c ret ; Shift out/in a byte from/to A, msb first and ACK bit from/to C. ; SCL low, SDA high on entry and exit. shift_in_nak: ; 96 C mov a, #0ffh ; all ones - input data from SDA shift_out: ; 95 C setb c ; 9th bit - output NAK/release SDA for ACK shift: ; 94 C mov r4, #9 ; 8 bits + ack shlop: ; 3.5 us CLK low to data valid rlc a ; move bit into C mov SDA, c setb SCL nop nop mov c, SDA clr SCL ; min. 4 us djnz r4, shlop ret ; ACK in C end