考虑以下代码部分:
... 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); } } ...
所以基本上,我想做的是一次从位于以下地址的MPU6050设备的陀螺仪寄存器中读取一堆字节 MPU6050_ADDR << 0x1 。寄存器从地址开始 0x43 并取结构中应存储的6个字节的量 gyro_t .
MPU6050_ADDR << 0x1
0x43
gyro_t
我预先配置了陀螺仪的满量程,并关闭了睡眠模式。 这些寄存器的单独读取没有任何问题。我读过一些关于BURST READING的文章,但我似乎不明白如何激活它并使用它。
如果有人曾经使用过MPU6050突发读取模式并能提供帮助,我们将不胜感激。
这是原型 HAL_I2C_Mem_Read() :
HAL_I2C_Mem_Read()
HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);
第四个参数, MemAddSize ,应该是您要读取的寄存器地址的大小(以字节为单位)。对于这个设备,地址是一个字节。因此,你应该通过 1 (或 sizeof(uint8_t) )对于 MemAddSize 参数。
MemAddSize
1
sizeof(uint8_t)