hola estoy intentando escribir dos bytes (y leer) en una memoria 24lcxx (de 1Mbit). La memoria es i2c y el codigo que utilizo es el siguiente (voy a poner solo el trozo relevante que es donde me falla:
//------------------------------configuración de entradas salidas digitales en puerto a para el lcd
PCFG3=0;
PCFG2=1;
PCFG1=1;
// PCFG0=x; no influye
//------------------------------------puertos a y b como output----------------------------
TRISA=0x00;
TRISB=0x00;
//---------------------inicializamos i2c--------------------------------
TRISC3=1; //ponemos los tris de scl y sda a 1 para el i2c (al estar en colector abierto necesitan resistencia pullup)
TRISC4=1;
SSPADD=0x13; //baudrate 100khz
SSPM3=1; //i2c master mode
SSPM2=0;
SSPM1=0;
SSPM0=0;
SSPEN=1; //habilitamos sda y scl como puertos serie i2c
//-----------------------inicializar lcd--------------------------------
lcd_init();
lcd_clear();
lcd_puts("hola");
//----------------------------------escritura-------------------------------
SEN=1; //start condition (se borra automáticamente)
SSPBUF=0xa0; // se envía codigo de inicio + block select + chip address (la dirección se configura en los pines del integrado)+ codigo de escritura
while (STAT_BF==1); //buffer enviado
while (ACKSTAT==1); //ack ok
while (STAT_RW==1); //transmisión/recepción finalizada
SSPBUF=0x00; //se envia address high
while (STAT_BF==1);
while (ACKSTAT==1);
while (STAT_RW==1);
SSPBUF=0x00; //se envía addrss low
while (STAT_BF==1);
while (ACKSTAT==1);
while (STAT_RW==1);
SSPBUF=0x41; //se envía dato a escribir en memoria
while (STAT_BF==1);
while (ACKSTAT==1);
while (STAT_RW==1);
PEN=1;
do
{
SEN=1; //start condition (se borra automáticamente)
SSPBUF=0xa0; // se envía codigo de inicio + block select + chip address (la dirección se configura en los pines del integrado)+ codigo de escritura
while (STAT_BF==1); //buffer enviado
}
while (ACKSTAT==1); //ack ok ************************************* aquí se bloquea, nunca recibe el ack
while (STAT_RW==1); //transmisión/recepción finalizada
SSPBUF=0x00; //se envia address high
while (STAT_BF==1);
while (ACKSTAT==1);
while (STAT_RW==1);
SSPBUF=0x01; //se envía addrss low
while (STAT_BF==1);
while (ACKSTAT==1);
while (STAT_RW==1);
SSPBUF=0x41; //se envía dato a escribir en memoria
while (STAT_BF==1);
while (ACKSTAT==1);
while (STAT_RW==1);
PEN=1;
la primera escritura la realiza bien (lo he comprobado leyendo la memoria)
la segunda no pasa del primer do while, ya que nunca recibe el ack.
no se si sabreis decirme si está correcto o hay algún error en el código para el proceso de lectura.
un saludo.