Stm32 MPU6050在地址0x68上没有响应,但在I2C扫描地址中显示

Stm32 MPU6050在地址0x68上没有响应,但在I2C扫描地址中显示,stm32,i2c,hal,mpu6050,Stm32,I2c,Hal,Mpu6050,当我在STM32F303上运行I2C扫描仪时,我看到两个设备都连接到总线。在地址0x3C(OLED)和地址(0x68)MPU6050上命名设备。两个地址都与数据表上的内容一致 然而,当我尝试使用HAL\u I2C\u isdevicerady读取地址0x68上的WHO\u AM\u i寄存器时,我意识到它甚至超时 int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_I2C1_

当我在STM32F303上运行I2C扫描仪时,我看到两个设备都连接到总线。在地址0x3C(OLED)和地址(0x68)MPU6050上命名设备。两个地址都与数据表上的内容一致

然而,当我尝试使用HAL\u I2C\u isdevicerady读取地址0x68上的WHO\u AM\u i寄存器时,我意识到它甚至超时

int main(void)
{
    HAL_Init();
    SystemClock_Config();

    MX_GPIO_Init();
    MX_I2C1_Init();
    MX_SPI1_Init();
    MX_TIM6_Init();
    MX_USART1_UART_Init();

    I2C_Scanner();
    SSD1306_Init();

    HAL_Delay (2000);

    MPU6050_Init();

    while (1)
    {

    }
}
函数(MPU6050_Init)检查设备是否准备就绪

static void MPU6050_Init(void)
{
    HAL_Delay(1);
    SSD1306_Clear();
    SSD1306_GotoXY (0, 0);
    char OutputArray[50] = {0};

    if(HAL_I2C_IsDeviceReady(&hi2c1, MPU6050_I2C_ADDR, 10, HAL_MAX_DELAY) != HAL_OK)
    {
        sprintf(OutputArray, "0x%02x : Not ready", MPU6050_I2C_ADDR);
    }
    else
    {
        HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_SET);

        uint8_t check;

        HAL_I2C_Mem_Read(&hi2c1, MPU6050_I2C_ADDR, WHO_AM_I_REG, 1, &check, 1, HAL_MAX_DELAY);

        sprintf(OutputArray,"0x%02x", (uint16_t)check);
    }
    HAL_Delay(1);
    SSD1306_Puts (OutputArray, &Font_7x10, SSD1306_COLOR_WHITE);
    SSD1306_UpdateScreen();
}
功能(I2C_扫描器)扫描可用设备的I2C总线

static void I2C_Scanner(void)
{
    HAL_StatusTypeDef result;
    uint8_t i;
    for (i = 1; i < 128; i++)
    {
        result = HAL_I2C_IsDeviceReady(&hi2c1, (uint16_t)(i << 1), 1, HAL_MAX_DELAY);
        char* period = ".";
        char OutputArray[5];

        if (result != HAL_OK) // HAL_ERROR or HAL_BUSY or HAL_TIMEOUT
        {
              HAL_UART_Transmit(&huart1, (uint8_t*)period, sizeof(period), HAL_MAX_DELAY);
        }

        if (result == HAL_OK)
        {
            sprintf(OutputArray, "0x%02x", i); // Received an ACK at that address
            HAL_UART_Transmit(&huart1, (uint8_t*)OutputArray, sizeof(OutputArray), HAL_MAX_DELAY);
        }

        HAL_Delay(1);
    }
}

预期的结果将是检查设备是否可用、准备就绪,并传回谁是我登记簿的内容

找到了解决方案。问题是我对MPU6050地址的定义如下

#define MPU6050_I2C_ADDR    0x68
正确的定义应该是

#define MPU6050_I2C_ADDR    0x68 << 1
#定义MPU6050_I2C_地址0x68
#define MPU6050_I2C_ADDR    0x68 << 1