I2C器件的读取问题

[复制链接]
1389|9
 楼主| waiter 发表于 2016-8-3 08:22 | 显示全部楼层 |阅读模式
最近项目遇到一个问题,涉及I2C EEPROM的读操作。
有两个产品,一个Rohm的芯片,一个24LC256,它们在读操作时存在一点差异:先看LC256的说明:


再看Rohm的说明:

在Rohm的说明中,明确说明最后一个字节之后,STOP之前,必须给器件发一个SCL周期的高电平。
但是在LC256中,英语说的是“The master will not acknowledge the transfer, but does generate a Stop condition and the 24XX256 discontinues transmission ”,然后图中给的“NO ACK”,但是又给了一个“高电平”的示意?
这里应该是理解为不用这个ACK时钟周期,直接发STOP? 还是需要这个ACK时钟周期,但是需要给器件发SDA高电平,也就是NACK?  (这个“No ACK”,难道就是NACK?)

我是菜鸟,哪位用过的大虾,给指导指导?
现在的问题是,以前我的设计都是针对LC256的时序的,也就是最后一个字节接收后,HOST这端直接就发了STOP。
但是这种方式,在读Rohm芯片时,就时好时坏。谢谢!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
玄德 发表于 2016-8-3 09:35 | 显示全部楼层

ACK,是指接收并识别对方发送的ACK信号(低电平);
No ACK,是根本不理会对方,强行发送高电平。

评论

嗯,谢谢!  发表于 2016-8-4 15:31
aozima 发表于 2016-8-3 10:37 | 显示全部楼层
反正都最后一个字节,是否ACK无所谓了。
玄德 发表于 2016-8-3 10:55 | 显示全部楼层
aozima 发表于 2016-8-3 10:37
反正都最后一个字节,是否ACK无所谓了。


不能这么说。

 楼主| waiter 发表于 2016-8-4 15:37 | 显示全部楼层
感谢两位。这两天在定位这个问题,现在定位到了。问题出在Read时,“START-0xA0-地址字节-字节字节”之后,有个RE-START,RE-START之前的SCL低电平脉冲宽度太小,只有160ns。因为是用FPGA控制的,所以逐次增加这个地方的间隔,增加到 220ns时,就都没有任何问题了。 仔细看了一下几家芯片的手册,对SCL的低电平宽度都有要求,有些器件要求4.7us,所以160ns实在太小。各家芯片内部的裕量不同,所以同一个设计在Rohm芯片上就不行;在24LC256上就OK。
因为我们用的电压是3.3V,所以24LC256没有问题,根据我的分析,如果用2.5V以下,估计LC256也会有问题。
同时这个实验也说明,在读的最后一个字节,之后直接发STOP也是可以的,至少目前验证的两家芯片都没有问题。
但是Xuander说得对,还是应该按照手册规定的来。所以我们的设计加上NACK了,然后再发STOP结束读操作。
 楼主| waiter 发表于 2016-8-5 11:29 | 显示全部楼层
本帖最后由 waiter 于 2016-8-5 16:19 编辑

自己再补充一点,后来进行过一系列定位,发现如下问题:
1,如果把最后一个字节发送结束后,修改为发送NACK,而不是直接发STOP,那么在依然存在SCL较窄低脉冲的错误情况下,从Rohm的芯片读整个芯片,同样会读不出来数据,但是这个读操作,会把从起始地址开始的第一个page擦除(或者说是写入了全F)
2,但是第一个字节发送结束后,直接发送STOP(然后再有一个SCL的上升沿),这种情况下,即使存在SCL较窄低脉冲,虽然读Rohm芯片读不出来数据,但是不会改写芯片内容。
玄德 发表于 2016-8-5 11:40 | 显示全部楼层

字节。。。直接?

 楼主| waiter 发表于 2016-8-5 16:20 | 显示全部楼层
玄德 发表于 2016-8-5 11:40
字节。。。直接?

sorry,笔误,改过来了。
 楼主| waiter 发表于 2016-8-5 16:58 | 显示全部楼层
上个图说明这个测试结果吧,怪怪的....
https://bbs.21ic.com/forum.php?mod=attachment&aid=NzA3OTg4fDE0MDYzZWE5fDE3NjI2OTE0Njl8MHw%3D

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

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

本版积分规则

24

主题

187

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部