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卡在 MPU6050Init 上

Guru**** 2391415 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/738955/tm4c123ge6pm-mpu6050-is-stuck-at-mpu6050init

器件型号:TM4C123GE6PM
主题中讨论的其他器件:TM4C123GH6PM

您好!

我正在尝试在 TM4C123G Launchpad 和具有 MPU6050的 GY52分线板之间进行通信。
传感器的 I2C SDA 连接到 PE4、SCL 连接到 PE5。
传感器由 Launchpad 的5V 引脚供电(LDO 将5V 转换为3.3V 以为 MPU6050供电)。
请参阅随附的照片:

蓝线:SDA
黑线:SCL
红线:5V VCC
绿线:GND

我测试了电路板的 LDO 是否正常工作、我测量的电压正好是3.3V。
我使用以下代码并在 CCS 中使用 F6逐行运行。
它会卡在具有 MPU6050Init 函数的线路上。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include 
#include 
/////////////////////////////////fc/////////////////////////////////////////////fc///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fc///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////










//我的 I2C 定义并包括
#include "driverlib/i2c.h"
#include "driverlib/interrv.h"
#include "inc/hw_i2c.h"
#include
"sensorlib/i2cm_drv.h"
#include "sensorlib/mpu6050.h"////

/////////////////////////////////////////////////////////////#////#//////////////////////////#//////////////////////////#///////////////////////////////////////////


#include "definitions _mpu6050.h"
tI2CMInstance g_sI2CInst;// I2C 主驱动程序结构。 "tI2CMInstance"是在 i2cm_drv.h 文件中定义的。
tMPU6050 g_sMPU6050Inst;// MPU6050传感器驱动程序结构。 "tMPU6050"在 mpu6050.h 文件中定义。
volatile unsigned long g_vui8DataFlag;//数据就绪标志
volatile unsigned long g_vui8ErrorFlag;//错误标志

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main (void)
{

//配置时钟
SysCtlClockSet (SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTAL_16MHz|SYSCTL_OSC_MAIN);

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//我的 I2C 初始化代码

//启用包含 I2C 2的 GPIO 外设
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);

//启用 I2C 模块2
SysCtlPeripheralEnable (SYSCTL_Periph_I2C2);

//为端口 E4和 E5上的 I2C2功能配置引脚多路复用。
GPIOPinConfigure (GPIO_PE4_I2C2SCL);
GPIOPinConfigure (GPIO_PE5_I2C2SDA);

//为这些引脚选择 I2C 功能。
GPIOPinTypeI2CSCL (GPIO_Porte _BASE、GPIO_PIN_4);
GPIOPinTypeI2C (GPIO_Porte _BASE、GPIO_PIN_5);

IntMasterEnable();

I2CMInit (&g_sI2CInst、I2C2_base、INT_I2C2、0xFF、0xFF、 SysCtlClockGet ();
SysCtlDelay (SysCtlClockGet ()/3);

fAccel[3]、fGyro[3];

//如果 MPU6050Init 成功,USER_MPU6050Callback 会将 g_BMPU6050Done 变量修改为 true。
G_bMPU6050Done = false;
//初始化 MPU6050
MPU6050Init (&g_sMPU6050Inst、&g_sI2CInst、MPU6050_I2C_address、USER_MPU6050Callback、&g_sMPU6050Inst);


while (!g_bMPU6050Done){}

//如果 MPU6050ReadModifyWrite 成功,USER_MPU6050Callback 会将 g_BMPU6050Done 变量修改为 true。
G_bMPU6050Done = false;
//将 MPU6050配置为+/- 4 g 加速计范围。
MPU6050ReadModifyWrite (&G) sMPU6050Inst、MPU6050_O_ACCEL_CONFIG、~MPU6050_ACCEL_CONFIG_AFS_SEL_M、MPU6050_ACCEL_CONFIG_AFS_SEL_4G、USER_MPU6050Callback、 0);
while (!g_bMPU6050Done){}

while (1)
{
}
}

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

    您将需要使用示波器来查看发生了什么 I2C 通信。 确保正在发送正确的数据、并检查波形以确保它们是干净的。 您是否已检查与之通信的电路板是否已正确安装上拉电阻器?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    电路板上确实安装了上拉电阻器。

    我将使用示波器检查信号...

    代码怎么样?  它看起来是否合适?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我使用示波器进行了检查:
    我将触发器设置为正常、并使用 F6运行代码。
    SDA 和 SCL 引脚上的绝对没有变化...

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

    如果 SDA 和 SCL 不改变、那么在 I2C 数据被发出前会引起一个挂起。 如果您暂停代码、它会在哪里暂停?

    就您的代码而言、软件中没有什么真正让我感到错误的东西。 我确实看到您已经设置了自己的回调函数。 您能否尝试使用 sensorlib 附带的回调函数、并查看您是否通过该修改在 I2C 线路上获得了活动?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是指 mpu6050.c 中的静态 MPU6050Callback?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Shai、

    深入了解了回调 API、我所想到的实际上不是 sensorlib 本身、而是使用 sensorlib 生成的示例。

    基本上是这样的回调、但对于您的器件、而不是 MPU9150:

    //
    //
    // MPU9150传感器回调函数。 在 MPU9150传感器
    //驱动器事务结束时调用。 这是从 I2C 中断上下文中调用的。 因此、
    //我们只需设置一个标志、让 main 执行大量计算和显示。
    ////
    *****************
    void
    MPU9150AppCallback (void * pvCallbackData、uint_fast8_t ui8Status)
    {
    //
    //如果传输成功,请将数据标志设置为指示
    //应用程序,此事务已完成,数据可能已就绪。
    //
    if (ui8Status = I2CM_STATUS_SUCCESS)
    {
    G_vui8I2CDoneFlag = 1;
    }
    
    //
    //存储最近的状态,以防出现错误情况
    //
    G_vui8ErrorFlag = ui8Status;
    } 

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

    与此同时,我取得了一些进展。
    根据您的建议、我暂停了代码并发现它在中断处理程序函数中挂起。
    事情是-我将实验原稿中的引脚从 PORTD 修改为 Porte (I2C 模块#2而不是#3)。
    我对 main.c 代码的所有修改都正确-但我忘记更改 tm4c123gh6m_startup_ccs.c
    该文件仍将 I2C 模块#3作为目标...

    我更改了 tm4c123gh6m_startup_ccs.c 来处理模块#2的中断(而不是最初的#3)。
    一旦 I F6超过 MPU6050Init、它就不再挂起、我看到通过 I2C 线路发送的数据正确。

    之后我遇到了一个新问题-但让我们把它留给另一个线程。

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

    嗯、这是有道理的、我注意到您更改了端口、但不想调用 startup_ccs.c 文件作为其他检查项目。 很高兴您能够在最后调试它 同意新主题应具有新主题。