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

2019-03-24 15:07发布

大家好,我是使用i2c控制器中断,总线接了一个时钟芯片   正常情况下对时钟芯片,使用i2c总线中断方式读写都很正常,   当使用串口对设备工作情况进行查询时,一切正常,查询时有去读时钟的时间   可当使用网口,使用lwip对设备进行查询时,i2c控制器就死了。如果查询内容不包括对时钟芯片的查询,就正常     请问大家是否遇到过lm3s的i2c控制器死锁问题呢?请给一下解决思路,谢谢!   此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
zjd0608
1楼-- · 2019-03-25 17:12
遇到过同样的问题.......正在思考解决方法。
zjd0608
2楼-- · 2019-03-25 22:32
问题原因也许是由于LWIP的回调函数操作I2C控制器引起的。也许你的程序中,网络收到的命令有的会要求从I2C设备中读取数据,其它任务也可能会操作同一个I2C设备。当I2C操作正在进行时,如果来了一个网络请求也要操作该I2C设备,就有可能会把原来的I2C操作进程打断,插入新的操作,从而导致总线异常。同样道理,操作需要独占的外设的时候也有可能会出现这样的问题。尝试重新初始化I2C控制器,用I2C控制器发起START和STOP和用

IO口产生冗余SCL时钟等方法也不能使这些错误标志复位。芯片的系统控制库里找到了可以单独重启I2C模块的函数SysCtlPeripheralReset( SYSCTL_PERIPH_I2C0 )。在检测到I2C控制器错误标志后,先发起START和STOP来释放总线,然后重启并重新初始化MCU的I2C模块,再进行读写操作。这样即使I2C控制器死掉也可以正常操作了。
ebuffalo
3楼-- · 2019-03-25 23:13
 精彩回答 2  元偷偷看……
Study_Stellaris
4楼-- · 2019-03-26 03:09
关注一下,请 TI 专家来解答一下吧
tekkon
5楼-- · 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 );

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

希望有帮助

一周热门 更多>

相关问题

    相关文章