9013|8

13

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

I2C1调试时候,打开I2C1外设时钟,BUSY位就置1? [复制链接]

调试at24c02的时候发现,一打开外设I2C1的时钟后,SR2寄存器的BUSY位就置1了。
于是我把板子和JLINK的电源都拔掉,然后重新插好,再调试时候,打开I2C1的时钟后,BUSY又没有置1,程序正常运行。但是一旦调试停止,退出调试状态,然后重新进入调试状态,一打开外设I2C1的时钟后,SR2寄存器的BUSY位就置1。程序在后面就死进循环了。只有重新拔电,再上电,程序又正常了。晕死!

不知道怎么在程序里,当BUSY忙时,人工把总线弄成不忙,这样就好正常通讯了?
此帖出自stm32/stm8论坛

最新回复

LZ你好,我也遇到了同样的问题。只要打开I2C外设时钟(RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);),BUSY位就会置1.然后就停在while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));这句里。如果不开时钟这句倒是过得去,但是I2C肯定工作不正常。请问你最后怎么解决的?能分享下这部分代码吗?  详情 回复 发表于 2015-11-17 14:53
点赞 关注
 

回复
举报

86

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
退出调试状态必须保证BUSY没有置1,否则下次重新进入调试状态,BUSY仍然为'1'。

保证BUSY没有置1,需要正确地结束一次I2C通信,即正确地结束STOP状态;否则I2C设备会一直等待主机,导致BUSY仍然为'1'。
此帖出自stm32/stm8论坛
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
I2C_GenerateSTOP(I2C_EE, ENABLE);
置位了CR1的STOP位,是不是就产生了一个停止位?因为当检测到一个停止条件时,硬件会清除BUSY位
上面那个函数不是置位了STOP位么?是停止条件没有产生,还是硬件没有检测到?
因为我看了寄存器的,执行了I2C_GenerateSTOP(I2C_EE, ENABLE);后BUSY还是1
此帖出自stm32/stm8论坛
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

4
 
                                 你最好用示波器看看信号线,置位了STOP位并不一定就能产生停止条件,具体要看但是信号线上的状态。
此帖出自stm32/stm8论坛
 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

5
 
谢谢版主啊。因为参考官方的读函数,发现这个读函数执行完后,BUSY和MSL还是置位了,自己重新写了个读函数,能正常工作了!

还有就是想问下,对于AT24C02的大量数据写,在每个PAGE WRITE结束后,我是延时一段时间,在继续写操作。请问有没有相关标志位可以查询?因为延时感觉总不是个好处理方法。
我用的轮询方式读写AT24C02的
此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

6
 
还有就是想问下,对于AT24C02的大量数据写,在每个PAGE WRITE结束后,我是延时一段时间,在继续写操作。请问有没有相关标志位可以查询?因为延时感觉总不是个好处理方法。
我用的轮询方式读写AT24C02的, ...
这个问题需要看看器件的手册。
此帖出自stm32/stm8论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

7
 
AT24C02的器件手册上提到有应答轮询,用于EEPROM内部在操作时,告诉外面主控器件,里面正在忙
Only if the internal write cycle has completed will the EEPROM respond
with a zero allowing the read or write sequence to continue

它说器件在忙完后,会返回个0?因为ST得固件函数中,也有I2C_EE_WaitEepromStandbyState();这个函数,不知道这个函数是不是确认 器件是不是在忙?
此帖出自stm32/stm8论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

8
 
LZ你好,我也遇到了同样的问题。只要打开I2C外设时钟(RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);),BUSY位就会置1.然后就停在while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));这句里。如果不开时钟这句倒是过得去,但是I2C肯定工作不正常。请问你最后怎么解决的?能分享下这部分代码吗?
此帖出自stm32/stm8论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

9
 
LZ你好,我也遇到了同样的问题。只要打开I2C外设时钟(RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);),BUSY位就会置1.然后就停在while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));这句里。如果不开时钟这句倒是过得去,但是I2C肯定工作不正常。请问你最后怎么解决的?能分享下这部分代码吗?
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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