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.

i2cm_drv配置问题

Other Parts Discussed in Thread: TM4C123GH6PM

你好,我用TM4C123GH6PM连接MPU9250. 使用的compdcm_mpu9150库,论坛上都说直接烧写就能读出数据,虽然读到的是全0. 为什么我调试时MPU9150Init之后的MPU9150AppI2CWait都无法通过。

对I2C的设置如下:

    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);

ROM_GPIOPinConfigure(GPIO_PD0_I2C3SCL);
ROM_GPIOPinConfigure(GPIO_PD1_I2C3SDA);

ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C3);

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

    ROM_IntMasterEnable();

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

为了测试I2C的配置,我在MPU9150Init之前做了一个测试函数    I2CMWrite(&g_sI2CInst, 0x22, pui8Data, 2, MPU9150AppCallback, 0);

这个函数的Callback函数也没有执行。检测了startup_ccs.c里面中断向量配置,I2C3 对应的就是MPU9150AppCallback函数。

另外MPU9250使用IO口模拟I2C是没有问题的。

请问这个工程问题在哪里?

非常感谢!

  • 中断向量里配置的不应该是callback。

    而应该为I2CMIntHandler()提供一个入口。

     官方的SENSOR LIB的UG里有明确的说明:

    3. Install an interrupt handler for the I2C interrupt that calls the I2CMIntHandler() API (it is recommended to do this at compile time by placing the interrupt handler into the vector table in flash)

    而且不能直接在中断表写I2CMIntHandler(),因为他是有参数的。

    我的做法是中断表中添加

    extern void I2CMSimpleIntHandler(void);

    表里对应的地方写

        I2CMSimpleIntHandler,                      // I2C0 Master and Slave

    你用I2C3 就在3中添加。

    然后在你的main.c里

    void
    I2CMSimpleIntHandler(void)
    {
        //
        // Call the I2C master driver interrupt handler.
        //
        I2CMIntHandler(&sI2CInst);
    }

    如此,I2C的结构体才能正常工作,继而你的MPU结构体才能正常,读写等操作才会正确。

    祝早日调通。

  • 补充一下,MPU9150AppCallback其实是可有可无的。它只是指示了操作是否完成。

    真正重要的callback是在mpuXXXX.c里面的。

    关于整个I2CM_DRV和MPUXXXX的配合流程,建议还是要一步一步追踪程序是怎么跑的,搞清楚他的流程,自然知道该怎么配置了。

  • 谢谢你的回答,按照你的建议,我仔细看了程序运行的过程,官方9150的历程中中断的处理方式和你给的建议一样。

    不太明白是哪个动作触发了中断,并且MPU9150Init()中只发送两个数据,为什么单步运行时,ui8WritePtr 会出现3、4甚至更大的值。

    MPU9150AppCallback确实只是用来显示初始化成功,

    但是为什么就是不调用它呢?我用示波器看了波形,发现上升沿非常平缓,并且重复同样的波形,这个和程序运行一样,不停的进中断,执行同样的功能,到底什么

    时候该退出中断,是因为从机没有相应,所以主机一直发送吗?

    有帖子说后面数据读取不正常,是因为MPU9150Init中对芯片复位了,我这个问题应该跟复位和唤醒没有关系吧。

    另外我觉得,官方给的例程都不能用,实在无语。。。

    对这个芯片,我真的不知道该怎么继续弄了。。。

  • 谢谢,你之前给的这些建议,在程序里面都满足了。

    对这个问题,我真的不想放弃,不管以后用不用~

  • 你好, 在使用tm4c和mpu9150是遇到了与你一样的问题, 调试程序无法通过 MPU9150AppI2CWait(__FILE__, __LINE__);

    串口提示Error:3, 查了一下显示Arbitration Lost, 用了很多网上的方法都不管用.

    请问你之前遇到的问题解决了吗?可否跟我交流一下,非常感谢

  • 你仔细再坛子里搜索一下,有网友碰到过这个问题,而且解决了。但是我记不起来是哪个了,好像是I2C初始化的问题,TM4C系列对外设的初始化很严格的。