Dificultad para leer los registros usando el I2C

1

Es necesario obtener los valores de velocidad angular del módulo de giroscopio en tablero" Amperka ". Pero incluso para leer el registro de identificador, devolvió respuestas incorrectas. Ya se pasó el día y ni siquiera lo he logrado, sin mencionar el ángulo. Utilizo la biblioteca HAL. Aquí está mi código:

    void Accel_Ini(void)
{
        uint16_t ctrl = 0x0000;
        HAL_Delay(500);
        if(Accel_ReadID()!=0x68) while(1);
        AccInit(ctrl);
}

uint8_t Accel_ReadID(void)
{
uint8_t ctrl = 0x00;
        ctrl = Accel_IO_Read(0x68,0x0F);
        return ctrl;
}

uint8_t Accel_IO_Read(uint16_t DeviceAddr, uint8_t RegisterAddr)
{
        return I2Cx_ReadData(DeviceAddr, RegisterAddr);
}

static uint8_t I2Cx_ReadData(uint16_t Addr, uint8_t Reg)
{

        HAL_StatusTypeDef status = HAL_OK;

        uint8_t value = 0;

        status = HAL_I2C_Mem_Read(&hi2c1, Addr, Reg, I2C_MEMADD_SIZE_8BIT, &value, 1, 0x10000);

        if(status != HAL_OK)
                    while(1);

        return value;

}

(la dirección del giro es 0x68)

    
pregunta Denisok

1 respuesta

1

La función 'Accel_ReadID ()' devuelve el contenido del registro 0x0f del I2C-Slave con la dirección 0x68.

En la tabla 18 de la hoja de datos (página 27) puede encontrar la descripción del registro correspondiente:

  • Nombre: WHO_AM_I
  • Dirección: 0x0f
  • Valor predeterminado: 0b11010011 (= 0xd3)

Por lo tanto, debe comparar el valor de retorno con 0xd3 (el contenido de registro predeterminado) y no con 0x68 (la dirección del esclavo).

Por lo tanto, la función Accel_Init () debe cambiarse de la siguiente manera:

void Accel_Ini(void) {
    uint16_t ctrl = 0x0000;
    HAL_Delay(500);
    if(Accel_ReadID()!=0xd3) while(1);
    AccInit(ctrl);
} 
    
respondido por el M2C8

Lea otras preguntas en las etiquetas