标题: 24C02如何连续写入多页?用的51单片机 [打印本页]

作者: MHNMHN    时间: 2017-9-16 18:19
标题: 24C02如何连续写入多页?用的51单片机
  1. main()                                                                                                               
  2. {
  3. unsigned int n=0,j=0,i;                                
  4.                 for(i=0;i<2;i++)          //共写入16个数据,每次写进8个,分两次
  5.                 {
  6.                 I2C_Start();//启动iic
  7.                 I2C_SendByte(0xa0, 1);//发送写器件地址                                          
  8.                 I2C_SendByte(n, 1);//发送要写入内存地址 (第一次n是0,即地址0;   第二次n是8,即地址8)
  9.                         for(j=0;j<=8;j++)         //每页写入8个数据
  10.                          {
  11.                         I2C_SendByte(a[n], 1);
  12.                         n++;
  13.                         }               
  14.         I2C_Stop();                                         //写完8个数据截止
  15.         I2C_Delay10us();
  16.                  }
  17.          while(1);
  18. }
复制代码
第一个代码,只有第一次能成个写入8个数据。(失败)
第二个代码是把第一个代码的第一个for去掉,执行两次写入,就能够成功写入16费数据。(成功)
  1. main()                                                                                                               
  2. {
  3. unsigned int n=0,j=0,i;        
  4. /***第一次存8个数据******/
复制代码
我要存的数据
  1. unsigned char code a[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
  2.                                        0x09,0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6};
复制代码
我不明白为什么,为什么第一个代码不行




作者: 那就这样啊    时间: 2017-9-17 09:48
恰好也遇到这个问题 帮顶
作者: zl2168    时间: 2017-9-17 10:57
由于E2PROM的半导体工艺特性,对E2PROM的写入时间需要5~10ms,但AT24Cxx系列串行E2PROM芯片内部设置了一个具有SRAM性质的输入缓冲器,称为页写缓冲器。CPU对该芯片写操作时,AT24Cxx系列芯片先将CPU输入的数据暂存在页写缓冲器内,然后,慢慢写入E2PROM中。因此,CPU对AT24Cxx系列E2PROM一次写入的字节数,受到该芯片页写缓冲器容量的限制。页写缓冲器的容量为16B,若CPU写入字节数超过芯片页写缓冲器容量,应在一页写完后,隔5~10ms重新启动一次写操作。
作者: zl2168    时间: 2017-9-17 10:58
而且,若不是从页写缓冲器页内零地址0000写起,一次写入地址超出页内最大地址1111时,也将出错。例如,若从页内地址0000写起,一次最多可写16字节;若从页内地址0010写起,一次最多只能写14字节,若要写16字节,超出页内地址1111,将会引起地址翻卷,导致出错。
作者: zl2168    时间: 2017-9-17 10:59
本帖最后由 zl2168 于 2017-9-17 12:10 编辑

实例50  非零地址读写AT24C02
Proteus仿真一下,确认有效。
实例50 非零地址读写AT24C02.rar (39.09 KB, 下载次数: 67)

以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行。书中电路和程序设计有详细说明,程序语句条条有注解。仿真电路和Hex文件能在清华出版社网站免费下载,程序源代码只能到书上看了。到图书馆借,或到新华书店翻阅,或到网上书店打折购买。

作者: MHNMHN    时间: 2017-9-17 14:00
zl2168 发表于 2017-9-17 10:58
而且,若不是从页写缓冲器页内零地址0000写起,一次写入地址超出页内最大地址1111时,也将出错。例如,若从 ...

我还想问个问题,AT24C02分32页,地址是00-1f吗?
AT24C16分256页,地址是00-ff吗?
作者: zl2168    时间: 2017-9-17 20:46
MHNMHN 发表于 2017-9-17 14:00
我还想问个问题,AT24C02分32页,地址是00-1f吗?
AT24C16分256页,地址是00-ff吗?

AT24C02分16页,地址是00-ff.
AT24C16分128页,地址是000-8ff
作者: guoj    时间: 2017-12-29 10:12
如果这样,正好有一个存储跨在两页上(比如在0X0F和0X10字节), 写入的时候,用了连续写, 那么就肯定会出错了,
没有跨页连续写入的办法?
作者: 小白n    时间: 2019-5-7 14:38
zl2168 发表于 2017-9-17 10:57
由于E2PROM的半导体工艺特性,对E2PROM的写入时间需要5~10ms,但AT24Cxx系列串行E2PROM芯片内部设置了一个 ...

您好,是5~10ms是确定的吗?   我一直使用的是2MS

作者: xiblang    时间: 2019-9-24 22:41
我在24c32写入的时候也出现了类似的问题,24c32一页32个字节,我刚开始一次写入10个就一直出问题,折腾了好几天,最后发现是跨页引起的,我将程序改成一次写入16个字节,这样的话就不会跨页,问题完美解决,后来又尝试一次写入2个、4个、8个、16个、32个均正常,希望能帮到你
作者: xiblang    时间: 2019-9-24 22:44
24c02一页2个字节,你可以不用整页写,可以额用寻址的方法写,一个字节一个字节的写就行了,要注意,枚写一个字节将i2c总线stop后必须延时至少5ms后方可再次写入,不然就会出错
作者: xiblang    时间: 2019-9-24 22:45
小白n 发表于 2019-5-7 14:38
您好,是5~10ms是确定的吗?   我一直使用的是2MS

数据手册上就有写的,至少5ms




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1