Ajuda 8051+I2C ???

Pessoal já to há uma semana tentando implentar a comunicação do 89s52 pra 24c04... 
Testes no keil, proteus, grava 89 e testa e horas na frente do pc e do scope e ainda não consigo fazer funcionar....
A principio pelo que vi as formas de onda de leitura estão ok, o problema está na leitura, a cada vez dá uma coisa diferente...
Escrita, vão 3 bytes (dev adr, adr e dado) na leitura, vão 4 bytes (dev adr, adr, dev adr e dado lido) peguei isso do manual da memória.
Na simulação no proteus, a gravação está funcionando, e apenas a 1ª leitura da memória funciona, já na 2ª leitura, vem tudo 0xFF.
Segue o código e as fotos q tirei mandando escrever e ler.

escrita

leitura
cpp code

Testes no keil, proteus, grava 89 e testa e horas na frente do pc e do scope e ainda não consigo fazer funcionar....
A principio pelo que vi as formas de onda de leitura estão ok, o problema está na leitura, a cada vez dá uma coisa diferente...
Escrita, vão 3 bytes (dev adr, adr e dado) na leitura, vão 4 bytes (dev adr, adr, dev adr e dado lido) peguei isso do manual da memória.
Na simulação no proteus, a gravação está funcionando, e apenas a 1ª leitura da memória funciona, já na 2ª leitura, vem tudo 0xFF.
Segue o código e as fotos q tirei mandando escrever e ler.

escrita

leitura
cpp code
#include <REG52.h>
#include <stdlib.h>
#include <stdio.h>
#include <intrins.h>
#include <rtx51tny.h>
sbit SCL = P2^0;
sbit SDA = P2^1;
sbit LED = P0^0;
/* 0x02 eeprom 24C04 , 0x0E eeprom 24C08 */
#define PG 0x02
void delay5(void)
{
_nop_(); /* modificado para Keil C51 */
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/*
This function is hardware depended (CPU speed)
For fast processors you can define a loop
This concrete function written for I8051 on 12MHz (NOP=1uS)
*/
void i2c_start_tx(void)
{
SCL=1;
SDA=1;
delay5();
SDA=0;
delay5();
SCL=0;
}
void i2c_send_ack(void)
{
SDA=1;
SCL=1;
delay5();
SCL=0;
}
unsigned char i2c_read_char(void)
{
unsigned char res=0;
unsigned char cnt;
for ( cnt=0;cnt<8;cnt++ )
{
SDA=1;
SCL=1;
delay5();
res<<=1;
if (SDA) { res |= 0x01; }
SCL=0;
delay5();
LED = ~LED;
}
return res;
}
bit i2c_check_ack(void)
{
SDA=1;
SCL=1;
delay5();
if (SDA)
{
SCL=0;
return 1;
}
SCL=0;
return 0;
}
void i2c_write_char(unsigned char d)
{
unsigned char i;
for (i=0;i<8;i++)
{
SDA=(bit)(d & 0x80);
SCL=1;
delay5();
SCL=0;
d = d << 1;
}
i2c_send_ack();
}
void i2c_stop_tx(void)
{
SDA=0;
delay5();
SCL=1;
delay5();
SDA=1;
}
/* The following two functions are an entry points
* for the external calls */
void WR24C04(unsigned char index,unsigned char content)
{
unsigned char res;
res=(((unsigned char)(index>>7))& PG) | 0xA0;
i2c_start_tx();
//Send control word + page NUM
i2c_write_char(res);
i2c_write_char((unsigned char)(index&0xFF));
i2c_write_char(content);
i2c_stop_tx();
}
unsigned char RD24C04(unsigned char index)
{
unsigned char res;
//Send control word + page NUM
res=(((unsigned char)(index>>7))& PG) | 0xA1;
i2c_start_tx();
i2c_write_char(res);
i2c_write_char((unsigned char)(index&0xFF));
i2c_start_tx();
i2c_write_char(res);
res=i2c_read_char();
i2c_stop_tx();
return res;
}