lectura del acelerómetro LSM6DS0 con HAL_I2C_Master

0

Intento leer el acelerómetro en LSM6DS0 con el HAL_I2C_Master. Estoy codificando con truestudio c y mi placa es STM32l476RG. Mi slaveaddress es 1101011xb así que D7 / D6 para R / W. La fecha de mi acelerómetro se puede leer en el registro de 28h a 2Dh. Desafortunadamente no funciona, no sé cómo puedo mostrar los datos en mi PC y luego guardarlos. Por favor, necesito tu ayuda. Gracias

uint8_t*  i;
int main(void)
{
for(i= (0x28); i= (0x2D); i++)
{
 HAL_I2C_Master_Transmit(&hi2c1, 0xD6, i , 1, 100);

}

// receive the 2 x 8bit data into the receive buffer
HAL_I2C_Master_Receive(&hi2c1, 0xD7,(uint8_t*)0x2f , 6, 100);
HAL_Delay(100);
    

1 respuesta

1

Tiene una comprensión errónea de cómo funciona la interfaz I2C LSM6DS0 y está utilizando las funciones I2C incorrectas de la biblioteca HAL.

Lea la sección 4.1.1 de Hoja de datos de LSM6DS0 . Preste mucha atención a las tablas 16 a 19. El LSM6DS0 implementa múltiples registros que se identifican por subdirecciones. Para leer los datos de una subdirección, el maestro debe escribir la dirección del esclavo seguida de la subdirección de registro y luego realizar un inicio repetido y leer desde la dirección del esclavo.

Las funciones HAL_I2C_Master_Transmit () y HAL_I2C_Master_Receive () no admiten el tipo de transferencia I2C que se requiere para leer datos de una subdirección. HAL_I2C_Master_Receive () no escribe una subdirección y no realiza un inicio repetido.

En su lugar, debe utilizar HAL_I2C_Mem_Write () y HAL_I2C_Mem_Read (). Intenta algo como esto:

#define DEVICE_ADDR 0xD6
#define REG_OUT_X_XL_SUB_ADDR 0x28
#define I2C_TIMEOUT 100

HAL_StatusTypeDef ReadRegister16(uint8_t reg_addr, uint16_t *out_value)
{
    uint16_t reg_value;

    HAL_StatusTypeDef hal_status = HAL_I2C_Mem_Read(&hi2c1, DEVICE_ADDR, reg_addr, I2C_MEMADD_SIZE_8BIT, &reg_value, sizeof(uint16_t), I2C_TIMEOUT);

    if (hal_status == HAL_OK)
    {
        *out_value = reg_val;
    }

    return hal_status;
}
    
respondido por el kkrambo

Lea otras preguntas en las etiquetas