Michael_STM 发表于 2014-6-4 10:00:58

GPIO口模拟I2C读写E2PROM

本帖最后由 Michael_STM 于 2014-6-4 10:03 编辑

预期功能:
TMS32F28027用2个GPIO口模拟I2C的SDA和SCL线,对AT28C08实现读写
方法:
根据AT24C08的datasheet的时序图编写代码,SCL的时钟设为2us,地址用的是0XA8
遇到的问题:
在发送完地址数据后,等待E2PROM的ACK信号(已经将SDA的管脚设为输入管脚),此时发现AT24C08没有ACK反馈(如图),请问可能是什么问题?

aozima 发表于 2014-6-4 10:25:17

示波器不适合干这种活,应该用逻辑分析仪!

steaven2000 发表于 2014-6-4 13:52:49

示波器才适合干这种活!

另外,F28027是有硬件I2C的,为什么楼主还用软件去模拟呢?硬件I2C不好用?

你的EEPROM芯片A2脚是高电平吗?若是使用0xA8地址没错。

其次,确认你的24C08硬件连接有没有问题?使用GPIO模拟I2C时,关掉所有中断,波形上看你的SCL信号占空比很乱。

确认了所有的之后再仔细分析你的波形,一个bit一个bit的看通信数据。

抱歉没有精力给你做这样的波形检查了。

steaven2000 发表于 2014-6-4 13:54:21

还有关键的一条,这种类型的EEPROM,注意写操作之间需要有5个ms左右的间隔,不能连续操作的。

Michael_STM 发表于 2014-6-8 14:46:17

多谢以上两位兄弟耐心细致的回复,我现在换了一块AT24C08,好使了。
还有回答一下steaven2000兄的几个问题,
1. I2C可以用,但是我的I2C的管脚被占用了,所以用GPIO模拟,正好熟悉一下GPIO读写E2的功能,在有些低端的单片机上是没有I2的,方便后续使用
2. A2已经接了高电平
3. SCL信号占空比很乱,这个很有可能是程序中其他的中断的执行对它造成的影响是吗?中断函数应该尽可能做少的事,这样才不会造成这种现象,对吗。
4. 写操作的间隔时间大于5ms,这是AT24C08datasheet上的write cycle time的参数吧
steaven2000兄看问题很细致也很全面,佩服+感谢!

steaven2000 发表于 2014-6-9 08:53:09

“SCL信号占空比很乱,这个很有可能是程序中其他的中断的执行对它造成的影响是吗?中断函数应该尽可能做少的事,这样才不会造成这种现象,对吗。”
回复:是的,应该I2C操作期间发生了中断,造成SCK信号周期/占空比不一致。不过一般来说只要SCK信号频率不超过400kHz都是符合规范的。重要的一点,
I2C读写操作不应该加开关中断保护,毕竟这会占用很多CPU时间,可能造成你其他的代码执行不及时。在正式的项目中使用时,建议提前规划好I/O引脚,
为可能增加的软硬件功能做好备用措施。我能再说一点吗?如果你的项目需要同时支持多种I2C器件,比如Eeprom,RTC,外扩I/O芯片等等的时候,如何规划
你的软件结构,使得在任何任务中都能及时执行I2C操作?这个可以考虑一下。

Michael_STM 发表于 2014-6-10 11:19:47

恩,你说的很对,在项目开始之前确实应该仔细规划一下硬件资源。
再次感谢!
页: [1]
查看完整版本: GPIO口模拟I2C读写E2PROM