This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C123GE6PM:使 MPU6050准备好从中读取数据

Guru**** 2380860 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/738153/tm4c123ge6pm-making-the-mpu6050-ready-to-read-data-from

器件型号:TM4C123GE6PM

在这个有趣的帖子中:

e2e.ti.com/.../315587

用户得出结论、MPU6050不会作为 MPU6050Init 函数的一部分从复位中释放。

他提到他解决了这个问题-不幸的是、代码尚未发布。

您能否发布补充 MPU6050Init 并使传感器准备好接受读取请求的所需函数?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Shai、

    一位 TI 员工发布了该错误的记录、并希望在下一个版本中解决该错误。 鉴于这是2014年、我本以为应该解决这一问题。 您是否遇到了这个确切的问题?

    看起来 MPU6050Callback 需要检查正在执行的复位:

    //
    //发出 MPU6050器件复位
    //
    MPU6050_State_init_RES 案例:
    {
    //
    //读取状态寄存器以确认复位已完成。
    //
    psInst->uCommand.pui8Buffer[0]= MPU6050_O_PWR_Mgmt_1;
    I2CMRead (psInst->psI2CInst、psInst->ui8Addr、
    psInst->uCommand.pui8缓冲器,1,psInst->pui8数据,1,
    MPU6050Callback、psInst);
    
    psInst->ui8State = MPU6050_State_init_wait;
    中断;
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    否、

    我没有-我会尝试并查看。

    但是、如果解决了问题、则在 MPU6050Init 的代码中的某个位置、应该有一个写入命令来释放它的复位状态...

    你是否在某个地方看到它?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Shai、

    我在审阅文件后的想法是、修复程序未添加到 Init 函数、而是回调函数。 这就是我从 Callback 发布上述代码片段的原因、因为我认为这是为了解决该问题而添加的代码片段。

    但是、我有时间下拉引用的旧2.0.1版本、并对 mpu6050.c 文件执行了 diff、发现文件之间没有变化。

    编写 sensorlib 并为其提供支持的工程师不再是我们的团队成员、因此很难提供支持、因为我们对这些器件缺乏了解、 但是、根据我在代码中看到的内容、我的建议是、如果需要将复位释放到 Init、则回调中的以下代码应该很有用(sans the case statement):

    //
    //读取状态寄存器,在继续之前检查是否已完成复位。
    //
    MPU6050_State_init_wait:
    {
    //
    //检查从状态读回的值以确定设备
    //仍处于复位状态或是否就绪。 复位状态
    //寄存器为0x40、该寄存器设置了睡眠位。 器件也可以
    //在其早期阶段使用地址 NACK 进行响应
    //内部复位。 继续轮询、直到我们验证器件是否就绪。
    //
    //
    if ((psInst->pui8Data[0]!= MPU6050_PWR_Mgmt_1_SLEEP)||
    (ui8Status = I2CM_STATUS_ADDR_NACK)
    {
    //
    //器件仍处于复位状态,因此开始轮询该寄存器。
    //
    psInst->uCommand.pui8Buffer[0]= MPU6050_O_PWR_Mgmt_1;
    I2CMRead (psInst->psI2CInst、psInst->ui8Addr、
    psInst->uCommand.pui8缓冲器,1,psInst->pui8数据,1,
    MPU6050Callback、psInst);
    
    //
    //有意保持此状态以创建轮询效果。
    //
    }
    其他
    {
    //
    //器件已退出复位状态,移至空闲状态。
    //
    psInst->ui8State = MPU6050_State_Idle;
    }
    中断;
    } 

    根据我在 mpu6050.c 文件中所说的话、这似乎是处理该情况的方法。