Considere esta parte do código:
...
typedef struct gyro_s
{
int16_t x;
int16_t y;
int16_t z;
} gyro_t;
...
/*
Configuration of:
- Gyroscopes' Full Scale Range.
- Deactivated Sleep Mode
*/
...
int main()
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C2_Init();
MX_USART3_UART_Init();
gyro_t gyro = {0};
int hal_ret = 0;
while (1)
{
hal_ret = HAL_I2C_Mem_Read(&hi2c2, (MPU6050_ADDR << 1) | 0x1, 0x43, 6, (uint8_t *) (&gyro), sizeof(gyro), 1000);
printf("%d %d %d %d %d %ld \n\r", gyro.x, gyro.y, gyro.z, hal_ret, hi2c2.ErrorCode);
HAL_Delay(1000);
}
}
...
Então, basicamente, o que estou tentando fazer é ler um monte de bytes de uma vez dos registradores do giroscópio do meu dispositivo MPU6050 localizado no endereço MPU6050_ADDR << 0x1
. Os registradores começam no endereço 0x43
e ocupam a quantidade de 6 bytes que deve ser armazenada na struct gyro_t
.
Eu pré-configurei o alcance de escala total dos giroscópios e desativei o modo sleep. A leitura individual desses registros é feita sem problemas. Eu li algo sobre BURST READING, mas não consigo entender como ativá-lo e trabalhar com ele.
Se alguém já trabalhou com o modo de leitura em burst do MPU6050 e puder ajudar, ficaria muito grato.
Aqui está o protótipo para
HAL_I2C_Mem_Read()
:O quarto parâmetro,
MemAddSize
, deve ser o tamanho, em bytes, do endereço do registrador que você quer ler. Para este dispositivo, o endereço é um único byte. Portanto, você deve passar1
(ousizeof(uint8_t)
) para oMemAddSize
parâmetro.