Hola que tal? Estoy empezando a trabajar con una memoria externa 24AA256 I2c y un pic 18F4620..
Estoy utilizando el proteus para simular el circuito y el debbuger I2c de este para observar los datos que pasan de pic a memoria y de memoria a pic.
Estoy escribiendo un byte (en este caso una a) en la memoria y luego se supone que leo el byte y lo imprimo en un lcd.
Este es mi codigo
#include <p18F4620.h>
#include <xlcd.h>
#include <delays.h>
#include <i2c.h>
unsigned char data_w = 'a';
unsigned char data_r;
void config_I2C(void){
OpenI2C(MASTER, SLEW_ON);// Initialize I2C module
SSPADD = 12; //400kHz Baud clock(9) @8MHz
}
unsigned char LeerBI2C(char Address) // Escribe un byte a un esclavo en I2C
{
char DATA_I2C;
IdleI2C(); // ensure module is idle
StartI2C(); // initiate START condition
while ( SSPCON2bits.SEN ); // wait until start condition is over
WriteI2C( Address ); // Selecciona el dispositivo esclavo
IdleI2C(); // Asegura que el modulo este desocupado
if ( !SSPCON2bits.ACKSTAT ) // Prueba por la condicion de ACK, si es recibida
{
DATA_I2C = ReadI2C();
IdleI2C(); // ensure module is idle
StopI2C(); // send STOP condition
while ( SSPCON2bits.PEN ); // wait until stop condition is over
}
return DATA_I2C;
}
void delayms(int tiempo) // delays en ms a 20MHz
{
int cuenta_ = 0;
while ( cuenta_ < tiempo )
{
Delay1KTCYx(2);
cuenta_++;
}
}
void main(void)
{
TRISAbits.TRISA6 = 0;
TRISAbits.TRISA7 = 0;
config_I2C();
OpenXLCD(FOUR_BIT & LINES_5X7);
EEByteWrite(0xA0,0x70, data_w);
delayms(1000);
data_r = LeerBI2C(0x70);
SetDDRamAddr(0x00);
putcXLCD(data_r);
}
La funcion EEByteWrite es de la libreria I2c del compilador C18. Y este es el codigo:
unsigned char EEByteWrite( unsigned char control, unsigned char address, unsigned char data )
{
IdleI2C(); // ensure module is idle
StartI2C(); // initiate START condition
while ( SSPCON2bits.SEN ); // wait until start condition is over
if ( PIR2bits.BCLIF ) // test for bus collision
{
return ( -1 ); // return with Bus Collision error
}
else // start condition successful
{
if ( WriteI2C( control ) ) // write byte - R/W bit should be 0
{
return ( -3 ); // set error for write collision
}
IdleI2C(); // ensure module is idle
if ( !SSPCON2bits.ACKSTAT ) // test for ACK condition received
{
if ( WriteI2C( address ) ) // write word address for EEPROM
{
return ( -3 ); // set error for write collision
}
IdleI2C(); // ensure module is idle
if ( !SSPCON2bits.ACKSTAT ) // test for ACK condition received
{
if ( WriteI2C( data ) ) // data byte for EEPROM
{
return ( -3 ); // set error for write collision
}
}
else
{
return ( -2 ); // return with Not Ack error condition
}
}
else
{
return ( -2 ); // return with Not Ack error condition
}
}
IdleI2C(); // ensure module is idle
StopI2C(); // send STOP condition
while ( SSPCON2bits.PEN ); // wait until stop condition is over
if ( PIR2bits.BCLIF ) // test for bus collision
{
return ( -1 ); // return with Bus Collision error
}
return ( 0 ); // return with no error
}
Cuando corro la simulacion lo que recibo es:
en la escritura esto: S 41 A E1 A C3 A P
que creo que esta bien..
y en la lectura esto: S E1 N Sr 41 A E1 A C3 A P
que no se si este bien por el N
Y el resultado en el lcd es nada, no escribe cuando le digo que me escriba el mensaje leido...
Realmente no se lo que pasa....
Por favor, si alguien tiene alguna idea, le agradeceria que me diera luz
Gracias...