打印

奇怪,AT24C02读后立即写写不进(附精美图)

[复制链接]
4855|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
myfaith|  楼主 | 2009-11-8 17:30 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 myfaith 于 2009-11-8 17:40 编辑

首先说明读程序和写程序都是正确的,读后立即读,写后立即写,写后立即读,都没问题,唯独读后立即写写不进.
RdData = Eeprom_Read_Random(0);   //读0地址
Eeprom_Write_Byte(0,0x88);              //0地址写入0x88
如上,读取后立即进行写数据,发现居然没有写进EEPROM.
用示波器观察读写时的SCL和SDA,波形完美,写入的时序正确,也有EEPROM的ACK.在STOP后也有足够的Write Cycle Time.
而在RdData = Eeprom_Read_Random(0); 后加入延时则能正确写入,我以为可能是读时序的STOP和写时序的START之间时间不够长,查看datasheet这个称为"Time the bus must be free before a new transmission can start"的Tbuf的时间规定的最小时间是4.7us,但是我用示波器观察,STOP的SDA上升沿和START的SDA下降沿有20us的间隔,符合手册规定.
而且连续读,连续写,写后读并没有问题,比如连续读时上一个stop和下一个start之间也是21us间隔,并不需要加延时.
那么,究竟是什么原因呢??

上图.
这是前面的读:


这是后面的写(写0x88):


这是读-写之间的时序:


这是拼图,读写全貌,注意写的第一个字节在拼图时少截取了一位(没U盘,只好用照相机分块照下拼起来):


连续读是没有问题的,如下图:

相关帖子

沙发
NE5532| | 2009-11-8 21:44 | 只看该作者
如果你怀疑是“立即”的问题,而又无法肯定原因,就请找出这个“立即”的临界范围出来,收集更多的现象,有助于你找到真正的原因。

使用特权

评论回复
板凳
myfaith|  楼主 | 2009-11-8 21:51 | 只看该作者
2# NE5532
上面各图即为针对"立即"而观测的波形和对比分析,没有找出问题所在

使用特权

评论回复
地板
NE5532| | 2009-11-8 22:01 | 只看该作者
你费N多劲来找问题,还不如写Delay来给自己理清思路,一般来说,越奇怪的问题,错误越低级。

使用特权

评论回复
5
myfaith|  楼主 | 2009-11-9 09:43 | 只看该作者
想不明白,谁能帮忙分析下这个问题的原因?谢谢

使用特权

评论回复
6
1icme| | 2009-11-9 10:18 | 只看该作者
好好看看datasheet

使用特权

评论回复
7
MASASHINAKAYAMA| | 2009-11-9 11:10 | 只看该作者
动手精神可嘉,还是值得鼓励的。
唯一的问题是应该先理论后实践。而不是先摸。
先理论:翻翻datasheet,看看编程后的延时需要多少。

使用特权

评论回复
8
myfaith|  楼主 | 2009-11-9 12:10 | 只看该作者
这不是编程延时的问题,write都留有足够长的时间,而且读取并不需要编程时间,20us的Tbuf已经大大超过手册规定的4.7us.
我并不是拿来IC就乱干,看手册就不烦劳提醒了,如果您的意见"仅仅是"要求我我看datasheet我觉得您的宝贵意见还是保留吧.估计也没仔细看我1楼的贴子对问题的描述.

使用特权

评论回复
9
icecut| | 2009-11-9 12:11 | 只看该作者
我喜欢这图片.不过不知道你问题的原因

使用特权

评论回复
10
1icme| | 2009-11-9 13:19 | 只看该作者
看手册就不烦劳提醒了,如果您的意见"仅仅是"要求我我看datasheet我觉得您的宝贵意见还是保留吧.

========================

那也没什么好说的了。

使用特权

评论回复
11
john_light| | 2009-11-9 13:25 | 只看该作者
提醒你看手册有什么不对?

twr最大可达到5ms,你关注过吗?

使用特权

评论回复
12
myfaith|  楼主 | 2009-11-9 14:22 | 只看该作者
本帖最后由 myfaith 于 2009-11-9 14:27 编辑

11# jo
我的意思是我已经看过手册了,严格对照了手册时序要求,所以我这里就不烦劳您提醒了.如果您觉得哪个地方不符合手册,请直接在此指出.

我上面的Tbuf是前一个STOP和后一个START之间要求的间隔时间,并不是编程时间.编程时间手册里写的最大为10ms.前一次的读取并不牵涉到编程时间.
麻烦您先看完我1楼的描述好吗.谢谢.

使用特权

评论回复
13
john_light| | 2009-11-9 14:47 | 只看该作者
我回帖不看帖,多嘴了,大家继续。

使用特权

评论回复
14
ccat| | 2009-11-9 17:00 | 只看该作者
spec上的值4.7us是min,不是max

使用特权

评论回复
15
xuxindd| | 2009-11-9 19:00 | 只看该作者
提个问题还把自己搞的跟大爷似的~虽然我还在上学,什么都不懂

使用特权

评论回复
16
wjp2009| | 2009-11-9 19:34 | 只看该作者
既然楼主对DATASHEET已经完全吃透,却依然不能解决问题,那就去找经销商吧。

使用特权

评论回复
17
icmap| | 2009-11-9 20:15 | 只看该作者
楼主按下图中的红色波形试一下,确保 NO ACK 能送到 I2C 设备中。

使用特权

评论回复
18
myfaith|  楼主 | 2009-11-9 22:50 | 只看该作者
to 14楼:
手册上是最小值4.7us,是我打字打错了.我给的实际编程时间是20us,单独写没问题,连续写也没问题,写了读还是没问题,唯独读了写写不进,我觉得这应该不是编程时间的问题.
to 15楼:
你哪只眼睛看出我搞的跟大爷似的了?我只是觉得有的人连我的帖看都不看就一留下一句话看手册,其它什么话都没有,这样的意见请保留.我虚心请教问题绝没有当自己大爷,你回答问题也别做大爷好吧.
热忱欢迎有见解的意见和建议.
to 16楼:
不敢说完全吃透,我只是认真的看过几遍而已.我也不是做产品,只是自己玩弄一下而已,没什么经销商可找.我想是我自己的原因,只是没有发现所在,故此发帖让各位侠客指点.
to 17楼:
我按照你的意见将此处延长到7us问题依旧,非常感谢你的意见,感谢你的关注!

使用特权

评论回复
19
草履虫| | 2009-11-9 23:08 | 只看该作者
我分析的原因:
1. 你的读写时序问题:当你写完地址后,如写完0xa0(8个clk后),要先把sda置高后,然后发第9个clk读ack,而你还没有读到ask就继续操作了。
2. 如果不判断ask也行,那就发完第9个clk,后多等一会即可。

使用特权

评论回复
20
myfaith|  楼主 | 2009-11-10 09:36 | 只看该作者
to 19楼:
我我发完地址后是读取了ACK的,2402的ACK应答正确,如1楼图1可以看到.

使用特权

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

本版积分规则

68

主题

468

帖子

0

粉丝