6902|11

7

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

lm3s的i2c控制器与lwip回调函数冲突 [复制链接]

大家好,我是使用i2c控制器中断,总线接了一个时钟芯片

 

正常情况下对时钟芯片,使用i2c总线中断方式读写都很正常,

 

当使用串口对设备工作情况进行查询时,一切正常,查询时有去读时钟的时间

 

可当使用网口,使用lwip对设备进行查询时,i2c控制器就死了。如果查询内容不包括对时钟芯片的查询,就正常

 

 

请问大家是否遇到过lm3s的i2c控制器死锁问题呢?请给一下解决思路,谢谢!

 

最新回复

我之前用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 ); 没有操作系统的话就得在每次读写前一直查询寄存器状态,确保空闲! 希望有帮助  详情 回复 发表于 2011-12-27 23:26
 
点赞 关注

回复
举报

273

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
关注
 
 

回复

41

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
更改一下优先级试试
 
 
 

回复

2751

帖子

0

TA的资源

裸片初长成(初级)

4
 
会不会中断优先级问题咧,导致不能及时响应或者没有及时处理?
 
 
 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

5
 

原帖由 stonye 于 2011-9-20 17:17 发表  i2c控制器就死了

这是什么意思,建议不要放过问题,多仿真调试,找到问题和大家分享下。

 

 
 
 

回复

144

帖子

0

TA的资源

一粒金砂(中级)

6
 
用软件方式
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复 5楼 Study_Stellaris 的帖子

改了eth的优先级,继续调试,还是不行,发现根本不会进入i2c的中断函数
 
 
 

回复

71

帖子

1

TA的资源

一粒金砂(中级)

8
 

回复 楼主 stonye 的帖子

遇到过同样的问题.......正在思考解决方法。
 
 
 

回复

71

帖子

1

TA的资源

一粒金砂(中级)

9
 
问题原因也许是由于LWIP的回调函数操作I2C控制器引起的。也许你的程序中,网络收到的命令有的会要求从I2C设备中读取数据,其它任务也可能会操作同一个I2C设备。当I2C操作正在进行时,如果来了一个网络请求也要操作该I2C设备,就有可能会把原来的I2C操作进程打断,插入新的操作,从而导致总线异常。同样道理,操作需要独占的外设的时候也有可能会出现这样的问题。尝试重新初始化I2C控制器,用I2C控制器发起START和STOP和用

IO口产生冗余SCL时钟等方法也不能使这些错误标志复位。芯片的系统控制库里找到了可以单独重启I2C模块的函数SysCtlPeripheralReset( SYSCTL_PERIPH_I2C0 )。在检测到I2C控制器错误标志后,先发起START和STOP来释放总线,然后重启并重新初始化MCU的I2C模块,再进行读写操作。这样即使I2C控制器死掉也可以正常操作了。
 
 
 

回复

144

帖子

0

TA的资源

一粒金砂(中级)

10
 

回复 楼主 stonye 的帖子

估计是在网口中断中去通过I2C读数据,这样导致中断嵌套,引起了问题。
 
 
 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

11
 

回复 楼主 stonye 的帖子

关注一下,请 TI 专家来解答一下吧
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(高级)

12
 

回复 楼主 stonye 的帖子

我之前用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 );

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

希望有帮助

赞赏

1

查看全部赞赏

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表