代码之家  ›  专栏  ›  技术社区  ›  Glitch

为什么HAL_I2C_Mem_Read返回HAL_I2C_ERROR_TIMEOUT?

  •  1
  • Glitch  · 技术社区  · 7 月前

    考虑以下代码部分:

    ...
    
    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 .

    我预先配置了陀螺仪的满量程,并关闭了睡眠模式。 这些寄存器的单独读取没有任何问题。我读过一些关于BURST READING的文章,但我似乎不明白如何激活它并使用它。

    如果有人曾经使用过MPU6050突发读取模式并能提供帮助,我们将不胜感激。

    1 回复  |  直到 7 月前
        1
  •  1
  •   pmacfarlane    7 月前

    这是原型 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 参数。