Hola a todos,
Soy CheKeBo, es la primera vez que hablo en este foro, tengo un problema a ver si alguien puede solucionarmelo.
Trabajo con un dsPIC 30F6012, tengo problemas con la lectura de datos a traves del bus I2C en modo MASTER, el envio de datos es correcto, comprobandolo en el osciloscopio todo funciona correctamente, pero a la hora de recibirlos creo que tengo el problema en la configuración de los registros.
Mi rutina es la siguiente:
unsigned char Read_I2C_dato (unsigned char device, unsigned int address)
{
unsigned char add_hi, add_lo, read_data;
add_hi=(address>>8) & 0xff; // direccion parte alta
add_lo=(address&0xff); // direccion parte baja
RETARDO_I2C; // retardo entre tramas
I2CCONbits.SEN=1; // enviamos el start
// enviamos la trama de direccion de lectura
if (I2C_Out(device)) //enviamos DEV_SEL
{
STOP_I2C; // stop bus
return(1);
}
if (I2C_Out(add_hi)) // enviamos BYTE_ADDRESS_HI
{
STOP_I2C; // stop bus
return(1);
}
if (I2C_Out(add_lo)) // enviamos BYTE_ADDRESS_LO
{
STOP_I2C; // stop bus
return(1);
}
// vamos a leer y enviamos primero el CONTROL_BYTE
device|=0b00000001; // le decimos que vamos a leer, poniendo el bit R/W a 1
I2CCONbits.RSEN=1; // enviamos el re-start
if (I2C_Out(device)) // enviamos DEV_SEL
{
STOP_I2C; // stop bus
return(1);
}
read_data=I2C_In_Nack();
STOP_I2C; // enviamos el stop
return (read_data);
}
Creo que el problema lo tengo en la rutina I2C_In_Nack cuyo codigo es el siguiente:
unsigned char I2C_In_Nack (void)
{
I2CCONbits.RCEN=1; // comienza la recepción de información
I2CCONbits.ACKDT=1;
I2CCONbits.ACKEN=1 // enviamos un nack, al final de la lectura
while (I2CCONbits.RCEN); // esperamos a que se haya recibido el byte
while (I2CCONbits.ACKEN); // esperamos al nack
return(I2CRCV); // devolvemos el dato leido
}
He probado muchas combinaciones de lectura, pero estoy perdido.
¿Alguna pista? gracias de antemano.
Buenas Vacaciones