MMA8453 problema I2C acelerómetro

0

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.

    
pregunta Rainy

1 respuesta

0

Basado en el hecho de que puedes comunicarte con un sensor i2c pero no con otro, comenzaría a invertir lo siguiente:

Céntrese en leer el registro de WHO_AM_I porque es una prueba simple para lecturas y la respuesta 0x3A es fija.

  • Verifique que la dirección I2C del esclavo coincida con el hardware, es decir, ¿el pin SA0 está alto o bajo? ¿Está utilizando la dirección de esclavo 0x1C o 0x1D?
  • Verifique que está terminando sus lecturas con NACK. Una secuencia de lectura maestra debe terminar en un NACK de acuerdo con I2C, pero no todos los proveedores se preocupan demasiado. IIRC Freescale hace.
  • Verifique la longitud del bus I2C y los pullups, es decir, si tiene más de unos pocos cm de cable, sus pullups deberían ser, por ejemplo, 1k en lugar de 10k. Esto dependerá de las características de sincronización, etc. del dispositivo.

Hace un tiempo escribí una publicación en el blog sobre I2C en la que también describí problemas comunes de I2C y proporcioné más detalles: enlace

    
respondido por el Mikko Virkkilä

Lea otras preguntas en las etiquetas