Autor Tema: Problemas al leer datos I2C en modo Master  (Leído 1960 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado CheKeBo

  • PIC10
  • *
  • Mensajes: 18
Problemas al leer datos I2C en modo Master
« en: 28 de Julio de 2006, 09:20:14 »
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


 

anything