找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9192|回复: 11
收起左侧

24C02如何连续写入多页?用的51单片机

[复制链接]
回帖奖励 9 黑币 回复本帖可获得 3 黑币奖励! 每人限 1 次(中奖概率 50%)
ID:184267 发表于 2017-9-16 18:19 | 显示全部楼层 |阅读模式
  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};
复制代码
我不明白为什么,为什么第一个代码不行



回复

使用道具 举报

ID:233594 发表于 2017-9-17 09:48 | 显示全部楼层
恰好也遇到这个问题 帮顶
回复

使用道具 举报

ID:111634 发表于 2017-9-17 10:57 | 显示全部楼层
由于E2PROM的半导体工艺特性,对E2PROM的写入时间需要5~10ms,但AT24Cxx系列串行E2PROM芯片内部设置了一个具有SRAM性质的输入缓冲器,称为页写缓冲器。CPU对该芯片写操作时,AT24Cxx系列芯片先将CPU输入的数据暂存在页写缓冲器内,然后,慢慢写入E2PROM中。因此,CPU对AT24Cxx系列E2PROM一次写入的字节数,受到该芯片页写缓冲器容量的限制。页写缓冲器的容量为16B,若CPU写入字节数超过芯片页写缓冲器容量,应在一页写完后,隔5~10ms重新启动一次写操作。

评分

参与人数 1黑币 +5 收起 理由
zx929747216 + 5 很给力!

查看全部评分

回复

使用道具 举报

ID:111634 发表于 2017-9-17 10:58 | 显示全部楼层
而且,若不是从页写缓冲器页内零地址0000写起,一次写入地址超出页内最大地址1111时,也将出错。例如,若从页内地址0000写起,一次最多可写16字节;若从页内地址0010写起,一次最多只能写14字节,若要写16字节,超出页内地址1111,将会引起地址翻卷,导致出错。

评分

参与人数 1黑币 +5 收起 理由
MHNMHN + 5 很给力!大神完美解决我的问题啊。我还想问.

查看全部评分

回复

使用道具 举报

ID:111634 发表于 2017-9-17 10:59 | 显示全部楼层
本帖最后由 zl2168 于 2017-9-17 12:10 编辑

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

使用道具 举报

ID:184267 发表于 2017-9-17 14:00 | 显示全部楼层
zl2168 发表于 2017-9-17 10:58
而且,若不是从页写缓冲器页内零地址0000写起,一次写入地址超出页内最大地址1111时,也将出错。例如,若从 ...

我还想问个问题,AT24C02分32页,地址是00-1f吗?
AT24C16分256页,地址是00-ff吗?
回复

使用道具 举报

ID:111634 发表于 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
回复

使用道具 举报

ID:258145 发表于 2017-12-29 10:12 | 显示全部楼层
如果这样,正好有一个存储跨在两页上(比如在0X0F和0X10字节), 写入的时候,用了连续写, 那么就肯定会出错了,
没有跨页连续写入的办法?
回复

使用道具 举报

ID:375590 发表于 2019-5-7 14:38 | 显示全部楼层
zl2168 发表于 2017-9-17 10:57
由于E2PROM的半导体工艺特性,对E2PROM的写入时间需要5~10ms,但AT24Cxx系列串行E2PROM芯片内部设置了一个 ...

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

使用道具 举报

ID:608598 发表于 2019-9-24 22:41 | 显示全部楼层
我在24c32写入的时候也出现了类似的问题,24c32一页32个字节,我刚开始一次写入10个就一直出问题,折腾了好几天,最后发现是跨页引起的,我将程序改成一次写入16个字节,这样的话就不会跨页,问题完美解决,后来又尝试一次写入2个、4个、8个、16个、32个均正常,希望能帮到你
回复

使用道具 举报

ID:608598 发表于 2019-9-24 22:44 | 显示全部楼层
24c02一页2个字节,你可以不用整页写,可以额用寻址的方法写,一个字节一个字节的写就行了,要注意,枚写一个字节将i2c总线stop后必须延时至少5ms后方可再次写入,不然就会出错
回复

使用道具 举报

ID:608598 发表于 2019-9-24 22:45 | 显示全部楼层
小白n 发表于 2019-5-7 14:38
您好,是5~10ms是确定的吗?   我一直使用的是2MS

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

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表