打印

I2C1调试时候,打开I2C1外设时钟,BUSY位就置1?

[复制链接]
2253|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ounie|  楼主 | 2010-8-29 13:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调试at24c02的时候发现,一打开外设I2C1的时钟后,SR2寄存器的BUSY位就置1了。
于是我把板子和JLINK的电源都拔掉,然后重新插好,再调试时候,打开I2C1的时钟后,BUSY又没有置1,程序正常运行。但是一旦调试停止,退出调试状态,然后重新进入调试状态,一打开外设I2C1的时钟后,SR2寄存器的BUSY位就置1。程序在后面就死进循环了。只有重新拔电,再上电,程序又正常了。晕死!

不知道怎么在程序里,当BUSY忙时,人工把总线弄成不忙,这样就好正常通讯了?
沙发
香水城| | 2010-8-29 13:43 | 只看该作者
退出调试状态必须保证BUSY没有置1,否则下次重新进入调试状态,BUSY仍然为'1'。

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

使用特权

评论回复
板凳
ounie|  楼主 | 2010-8-29 14:37 | 只看该作者
I2C_GenerateSTOP(I2C_EE, ENABLE);
置位了CR1的STOP位,是不是就产生了一个停止位?因为当检测到一个停止条件时,硬件会清除BUSY位
上面那个函数不是置位了STOP位么?是停止条件没有产生,还是硬件没有检测到?
因为我看了寄存器的,执行了I2C_GenerateSTOP(I2C_EE, ENABLE);后BUSY还是1

使用特权

评论回复
地板
香水城| | 2010-8-29 20:54 | 只看该作者
你最好用示波器看看信号线,置位了STOP位并不一定就能产生停止条件,具体要看但是信号线上的状态。

使用特权

评论回复
5
ounie|  楼主 | 2010-8-30 08:45 | 只看该作者
谢谢香版啊。因为参考官方的读函数,发现这个读函数执行完后,BUSY和MSL还是置位了,自己重新写了个读函数,能正常工作了!

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

使用特权

评论回复
6
香水城| | 2010-8-30 08:47 | 只看该作者
还有就是想问下,对于AT24C02的大量数据写,在每个PAGE WRITE结束后,我是延时一段时间,在继续写操作。请问有没有相关标志位可以查询?因为延时感觉总不是个好处理方法。
我用的轮询方式读写AT24C02的, ...
ounie 发表于 2010-8-30 08:45


这个问题需要看看器件的手册。

使用特权

评论回复
7
ounie|  楼主 | 2010-8-30 09:06 | 只看该作者
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();这个函数,不知道这个函数是不是确认 器件是不是在忙?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

41

帖子

1

粉丝