您好!
我使用以下代码尝试与 MPU6050传感器通信:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include #include #include "driverlib/debug.h" #include "driverlib/gpio.h" #include "driverlib/pin_map.h" #include "driverlib/pwm.h" #include "driverlib/rom.h" #include "driverlib/sysctl.h" #include "inc/hw_gpio.h" #include "#include "包含"hw_map.h"#include "#include //使用 NULL 指针 #define PWM_FREQUENCY 55 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //我的 I2C 定义并包括 #include "driverlib/i2c.h" #include "driverlib/interrv.h" #include "inc/hw_i2c.h" #include "sensorlib/i2cm_drv.h" #include "sensorlib/mpu6050.h"//// /////////////////////////////////////////////////////////////#////#//////////////////////////#//////////////////////////#/////////////////////////////////////////// //我的 UART 定义并包括 #include "driverlib/uartstdio.h" #include "utils/uartstdio.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;//错误标志 void ISL29023I2CIntHandler (void) { I2CMIntHandler (&g_sI2CInst); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// int main (void) { //配置时钟 SysCtlClockSet (SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTAL_16MHz|SYSCTL_OSC_MAIN); ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //我的 I2C 初始化代码 //启用包含 I2C 2的 GPIO 外设 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE); //启用 I2C 模块2 // SysCtlPeripheralEnable (SYSCTL_Periph_I2C3); SysCtlPeripheralEnable (SYSCTL_Periph_I2C2); //为端口 E4和 E5上的 I2C2功能配置引脚多路复用。 // GPIOPinConfigure (GPIO_PD0_I2C3SCL); // GPIOPinConfigure (GPIO_PD1_I2C3SDA); GPIOPinConfigure (GPIO_PE4_I2C2SCL); GPIOPinConfigure (GPIO_PE5_I2C2SDA); //为这些引脚选择 I2C 功能。 // GPIOPinTypeI2CSCL (GPIO_PORTD_BASE、GPIO_PIN_0); // GPIOPinTypeI2C (GPIO_PORTD_BASE、GPIO_PIN_1); GPIOPinTypeI2CSCL (GPIO_Porte _BASE、GPIO_PIN_4); GPIOPinTypeI2C (GPIO_Porte _BASE、GPIO_PIN_5); IntMasterEnable(); // I2CMInit (&g_sI2CInst、I2C3_base、INT_I2C3、0xFF、 0xFF、SysCtlClockGet ()); 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、 &g_sMPU6050Inst); while (!g_bMPU6050Done){} while (1) { //如果 MPU6050DataRead 成功,USER_MPU6050Callback 会将 g_BMPU6050Done 变量修改为 true。 G_bMPU6050Done = false; //从 MPU6050请求另一个读数。 MPU6050DataRead (&g_sMPU6050Inst、USER_MPU6050Callback、0); while (!g_bMPU6050Done){} //获取新的加速计和陀螺仪读数。 MPU6050DataAccelGetFloat (&g_sMPU6050Inst、&fAccel[0]、&fAccel[1]、&fAccel[2]); MPU6050DataGyroGetFloat (&G) sMPU6050Inst、&fGyro[0]、&fGyro[1]、&fGyro[2]); } }
我使用 F6逐步运行代码并转至 MPU6050Init 函数。
当这个函数被称为 I See (使用一个示波器)时、SDA 和 SCL I2C 线路正确切换并且 MPU6050确认到地址0x68。
然而、当传输完成时、MPU6050将 SCL 线路保持在低电平并且不释放它。
根据 I2C 规范-这表示器件正在处理中断。 只有在我的情况下、它才会持续下去。
当我继续按 F6键进入 MPU6050ReadModifyWrite 函数时,将调用并完成该函数-但当我再次按 F6时 ,代码会卡在 while (!g_bMPU6050Done){}条件中。
是否有可能 MPU6050Init 不会使器件从复位状态释放 ?
与本帖子中提到的内容类似: