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.

TM4C123连接MPU9250的问题,初始化通不过

最近研究MPU9250,一参考www.deyisupport.com/.../59723.aspx

码。现在在MPU6050Init(&sMPU6050, &sI2CInst, 0x68, MPU6050Callback, 0); 这一条通不过。。。程序卡在i2cm_drv.c 的

if(ui8Enabled)
{
MAP_IntEnable(psInst->ui8Int);
}

处。

谢谢指教~

若能给一个完整的测试程序最好了。邮箱 2731263864@qq.com

我的程序如下:

#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "driverlib/i2c.h"
#include "utils/uartstdio.h"
#include "i2cm_drv.h"
#include "mpu6050.h"
#include "sensorlib/hw_mpu6050.h"
#include "hw_ints.h"
#include "driverlib/rom.h"

tI2CMInstance sI2CInst;
tMPU6050 sMPU6050;

void MPU6050_I2C_Init(void)
{
//
// The I2C2 peripheral must be enabled before use.
//
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C2);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);

//
// Configure the pin muxing for I2C3 functions on port D0 and D1.
//
ROM_GPIOPinConfigure(GPIO_PE4_I2C2SCL);
ROM_GPIOPinConfigure(GPIO_PE5_I2C2SDA);

//
// Select the I2C function for these pins. This function will also
// configure the GPIO pins pins for I2C operation, setting them to
// open-drain operation with weak pull-ups. Consult the data sheet
// to see which functions are allocated per pin.
//
GPIOPinTypeI2CSCL(GPIO_PORTE_BASE, GPIO_PIN_4);
ROM_GPIOPinTypeI2C(GPIO_PORTE_BASE, GPIO_PIN_5);

ROM_IntEnable(INT_I2C2);

//
// Enable interrupts to the processor.
//
ROM_IntMasterEnable();

//
// Initialize I2C3 peripheral.
//
I2CMInit(&sI2CInst, I2C2_BASE, INT_I2C2, 0xff, 0xff,
ROM_SysCtlClockGet());
}
//
// A boolean that is set when a MPU6050 command has completed.
//
volatile bool g_bMPU6050Done;
//
// The function that is provided by this example as a callback when MPU6050
// transactions have completed.
//
void
MPU6050Callback(void* pvCallbackData, uint_fast8_t ui8Status)
{
//
// See if an error occurred.
//
if(ui8Status != I2CM_STATUS_SUCCESS)
{
//
// An error occurred, so handle it here if required.
//
}
//
// Indicate that the MPU6050 transaction has completed.
//
g_bMPU6050Done = true;
}
//
// The MPU6050 example.
//
void main(void)
{
float fAccel[3], fGyro[3]; //fMagneto[3];

ROM_FPUEnable();
ROM_FPULazyStackingEnable();//打开浮点运算,但是会消耗额外的堆栈空间
ROM_SysCtlClockSet(SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |
SYSCTL_OSC_MAIN);
//Pin_Init();

MPU6050_I2C_Init();
// IntPriorityGroupingSet(1);
// IntPrioritySet(INT_I2C2,1 << 5);
//
// Initialize the MPU6050. This code assumes that the I2C master instance
// has already been initialized.
//
g_bMPU6050Done = false;
MPU6050Init(&sMPU6050, &sI2CInst, 0x68, MPU6050Callback, 0);
while(!g_bMPU6050Done)
{
}

MPU6050ReadModifyWrite(&sMPU6050,MPU6050_O_PWR_MGMT_1, 0x00,0x00,MPU6050Callback,0);
//
// Configure the MPU6050 for +/- 4 g accelerometer range.
//
g_bMPU6050Done = false;
MPU6050ReadModifyWrite(&sMPU6050, MPU6050_O_ACCEL_CONFIG, ~MPU6050_ACCEL_CONFIG_AFS_SEL_M,
MPU6050_ACCEL_CONFIG_AFS_SEL_4G, MPU6050Callback, 0);
while(!g_bMPU6050Done)
{
}
//
// Loop forever reading data from the MPU6050. Typically, this process
// would be done in the background, but for the purposes of this example,
// it is shown in an infinite loop.
//
while(1)
{
//
// Request another reading from the MPU6050.
//
g_bMPU6050Done = false;
MPU6050DataRead(&sMPU6050, MPU6050Callback, 0);
while(!g_bMPU6050Done)
{
}
//
// Get the new accelerometer, gyroscope, and magnetometer readings.
//
MPU6050DataAccelGetFloat(&sMPU6050, &fAccel[0], &fAccel[1],&fAccel[2]);
MPU6050DataGyroGetFloat(&sMPU6050, &fGyro[0], &fGyro[1], &fGyro[2]);
//MPU6050DataMagnetoGetFloat(&sMPU6050, &fMagneto[0], &fMagneto[1],&fMagneto[2]);
//
// Do something with the new accelerometer, gyroscope, and magnetometer
// readings.
//
}
}

  • 使用compdcm_mpu9150的例子,又卡在MPU9150Init  之后的MPU9150AppI2CWait(__FILE__, __LINE__);处,原因都是因为configDone标志没有置位。。。着急ing,看了以前的帖子也没有发现什么好的解决方案。。。

  • 没有用过这个芯片,无法帮忙。。。

  • 你要确认一下:为你的I2CMIntHandler( &sI2CInst);提供一个中断入口。

    我的做法是在startup_ccs.c里面的中断表里,在相应的I2CX 前面添加中断服务函数,

    此函数需是void xxx(void) 类型;

    然后在你自己的.c里面写

    void xxx(void)

    {

           I2CMIntHandler( &sI2CInst);

    }

    这样你的I2CM Driver才能正确的工作

    当然.MPU6050还需要配置,贴上几条配置仅供参考,具体看mpu6050的规格书

        //
        // Configure the MPU6050 .
        //
    
        g_bMPU6050Done = false;
        MPU6050Init(&sMPU6050, &sI2CInst, 0x68, MPU6050APPCallback, 0);
        while(!g_bMPU6050Done)
        {}
        g_bMPU6050Done = false;
        MPU6050ReadModifyWrite(&sMPU6050, MPU6050_O_PWR_MGMT_1,0x00,0x03, MPU6050APPCallback,0);
        while(!g_bMPU6050Done){}
        g_bMPU6050Done = false;
        MPU6050ReadModifyWrite(&sMPU6050, MPU6050_O_SMPLRT_DIV,0x00,0x01, MPU6050APPCallback,0);
        while(!g_bMPU6050Done){}
        g_bMPU6050Done = false;
        MPU6050ReadModifyWrite(&sMPU6050, MPU6050_O_GYRO_CONFIG,~MPU6050_GYRO_CONFIG_FS_SEL_M,MPU6050_GYRO_CONFIG_FS_SEL_2000, MPU6050APPCallback,0);
        while(!g_bMPU6050Done){}
        g_bMPU6050Done = false;
        MPU6050ReadModifyWrite(&sMPU6050, MPU6050_O_ACCEL_CONFIG,~MPU6050_ACCEL_CONFIG_AFS_SEL_M,MPU6050_ACCEL_CONFIG_AFS_SEL_4G, MPU6050APPCallback,0);
        while(!g_bMPU6050Done){}


  • 不错,学习了。这些东西没搞过。

  •     ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C3);

    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);

    ROM_GPIOPinConfigure(GPIO_PD0_I2C3SCL);
    ROM_GPIOPinConfigure(GPIO_PD1_I2C3SDA);

    GPIOPinTypeI2CSCL(GPIO_PORTD_BASE, GPIO_PIN_0);
    GPIOPinTypeI2C(GPIO_PORTD_BASE, GPIO_PIN_1);

    I2CMInit(&g_sI2CInst, I2C3_BASE, INT_I2C3, 0xff, 0xff, ROM_SysCtlClockGet());

    uint8_t pui8Data[4] = {'0','1','2'};

    I2CMWrite(&g_sI2CInst, 0x22, pui8Data, 2, TestCallback, 0);
    while(!testflag)
    {}

    根据你的提示,我先只验证I2CM是否配置成功,TestCallback()的功能就是对testflag置1,

    中断服务函数如下:

    void
    MPU9150I2CIntHandler(void)
    {
    I2CMIntHandler(&g_sI2CInst);
    }

    该函数也在startup_ccs.c的向量表中I2C3地址注册。

    可是运行时,testflag的值还是没有置位,也就是回调函数没有执行。

    请问可能的问题在哪里?

    谢谢~