本帖最后由 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盘,只好用照相机分块照下拼起来):
连续读是没有问题的,如下图:
|