Me encontré con un problema con mi proyecto. Utilizo el microcontrolador Renesas RL78 y en un bus I2C tengo dos sensores: brújula digital y acelerómetro. El tipo de acelerómetro es MMA8453 por Freescale.
Hoja de datos: enlace
No tengo ningún problema con la lectura de datos de la brújula. El acelerómetro, sin embargo, es una historia diferente. No puedo leer nada de eso, al menos supongo que no consigo nada. Lamentablemente no tengo analizador de alcance o lógica para verificar. Recibo un ACK, pero no datos.
Aquí está la función que uso para leer el registro del dispositivo I2C:
uint8_t Read_I2C_Sensor_Reg(uint8_t DevAddr, uint8_t RegAddr, uint8_t *Data, uint8_t Numbytes, uint8_t wait)
{
uint16_t status = 0;
uint16_t timeout = 1000; //approx 32uSec
DevAddr <<= 1; //Shifting left by one bit to make room for Read/Write bit
IICA0_Err = 0;
IICA0_Tx_Done |= 1;
status = IICA0_Master_Send(DevAddr, &RegAddr, 1, wait);
while(IICA0_Tx_Done)
{
while(timeout--);
iica0_master_check_status(); //<SCH> checking the transation status, in case if this fails, report andre initiate transaction.
if(IICA0_Err)
{
status = IICA0_Err ; break;
}
}
if (IICA0_Tx_Done == 0)
{
IICA0_StopCondition();
while (SPD0 == 0);
IICA0_Rx_Done |= 1;
status = IICA0_Master_Receive(DevAddr, Data, Numbytes, wait);
while(IICA0_Rx_Done)
{
while(timeout--);
iica0_master_check_status();
if(IICA0_Err)
{
status = IICA0_Err ; break;
}
}
if (IICA0_Tx_Done == 0)
{
IICA0_StopCondition();
while (SPD0 == 0);
}
}
if (status == MD_OK)
return 0;
else
return 1;
}
¿Alguien se encontró con este tipo de problema? Puedo publicar más detalles más tarde, si es necesario.