lm3s的i2c控制器与lwip回调函数冲突

2019-03-24 15:07发布

大家好,我是使用i2c控制器中断,总线接了一个时钟芯片   正常情况下对时钟芯片,使用i2c总线中断方式读写都很正常,   当使用串口对设备工作情况进行查询时,一切正常,查询时有去读时钟的时间   可当使用网口,使用lwip对设备进行查询时,i2c控制器就死了。如果查询内容不包括对时钟芯片的查询,就正常     请问大家是否遇到过lm3s的i2c控制器死锁问题呢?请给一下解决思路,谢谢!   此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
11条回答
tekkon
2019-03-26 05:42
我之前用philips的 LPC2292做一个项目时遇到过类似的情况

TaskA和TaskB都会通过I2C接口去读写从设备的寄存器, 当他们单独使用I2C接口时一切正常, 但当TaskA需要通过I2C接口每秒读一次从设备寄存器时, TaskB试图使用I2C接口写一字节给从设备会导致I2C瘫痪掉

后来的解决方法是在保证I2C空闲的状态下再进行读写,每次读写操作前先检测I2C之前的读写数据是否完全完成。

用task的话基本上就是在每次读写时使用下面的机制
//获取I2C接口,别的任务想使用就得等
xMutexTake( I2CMutex, portMAX_DELAY );

//读取操作
I2CWrite();或者 I2CRead();

// xI2CFinishedSemaphore在中断服务函数里当读写结束时释放,告诉调
//用它的任务操作完成,不用semaphore的话可以一直读取寄存器看是否成
xSemaphoreTake( xI2CFinishedSemaphore, portMAX_DELAY );

//释放I2C接口,别的等待的任务可以使用
xMutexGive( I2CMutex );

没有操作系统的话就得在每次读写前一直查询寄存器状态,确保空闲!

希望有帮助

一周热门 更多>

相关问题

    相关文章