Hola a todos, estoy usando el lenguaje C18 y estoy tratando de guardar y leer datos en una memoria I2C para ser mas exactos la 24LC1025, para ello me estoy basando en la nota de aplicacion de microchip AN991.
no he modificado las funciones de leer y escribir de esta nota de aplicacion, ya que al final esta memoria de 1 Megabit que uso, es como tener 2 de 512.
lo unico es tener en cuenta luego que el control byte es ligeramente diferente a las de menor capacidad de almacenamiento.
el caso es que me escribe, pero a la hora de la lectura siempre me saca un 0xFF, haya lo que haya guardado.
y me pasa algo bastante curioso, el caso es que si el control byte en lectura lo pongo como 0xA0 en lugar de 0XA1 que es el de lectura, si que me lee
estas son muy funciones de lectura y escritura:
unsigned char ByteWriteI2C( unsigned char ControlByte, unsigned char HighAdd, unsigned char LowAdd, unsigned char data )
{
IdleI2C2(); // ensure module is idle
StartI2C2(); // initiate START condition
while ( SSP2CON2bits.SEN ); // wait until start condition is over
WriteI2C2( ControlByte ); // write 1 byte - R/W bit should be 0
IdleI2C2(); // ensure module is idle
WriteI2C2( HighAdd ); // write address byte to EEPROM
IdleI2C2(); // ensure module is idle
WriteI2C2( LowAdd ); // write address byte to EEPROM
IdleI2C2(); // ensure module is idle
WriteI2C2 ( data ); // Write data byte to EEPROM
IdleI2C2(); // ensure module is idle
StopI2C2(); // send STOP condition
while ( SSPCON2bits.PEN ); // wait until stop condition is over
while (EEAckPolling2(ControlByte)); //Wait for write cycle to complete
return ( 0 ); // return with no error
}
unsigned char ByteReadI2C( unsigned char ControlByte, unsigned char HighAdd, unsigned char LowAdd, unsigned char *data, unsigned char length )
{
IdleI2C2(); // ensure module is idle
StartI2C2(); // initiate START condition
while ( SSP2CON2bits.SEN ); // wait until start condition is over
WriteI2C2( ControlByte ); // write 1 byte
IdleI2C2(); // ensure module is idle
WriteI2C2( HighAdd ); // WRITE word address to EEPROM
IdleI2C2(); // ensure module is idle
while ( SSP2CON2bits.RSEN ); // wait until re-start condition is over
WriteI2C2( LowAdd ); // WRITE word address to EEPROM
IdleI2C2(); // ensure module is idle
RestartI2C2(); // generate I2C bus restart condition
while ( SSP2CON2bits.RSEN ); // wait until re-start condition is over
WriteI2C2( ControlByte | 0x01 ); // WRITE 1 byte - R/W bit should be 1 for read
IdleI2C2(); // ensure module is idle
getsI2C2( data, length ); // read in multiple bytes
NotAckI2C(); // send not ACK condition
while ( SSP2CON2bits.ACKEN ); // wait until ACK sequence is over
StopI2C2(); // send STOP condition
while ( SSP2CON2bits.PEN ); // wait until stop condition is over
return ( 0 ); // return with no error
}
alguien me podria decir que estoy haciendo mal?
saludos