原创 AT24系列的读写注意事项

2009-6-1 14:26 6257 9 10 分类: MCU/ 嵌入式

所看过的对24系列I2C读写时序描述最准确最容易理解的资料,尤其是关于主从器件的应答描述和页写描述,看完后明白了很多。关于页写的描述,网络上绝大部分范程都没提到页写时的数据地址必须是每页的首地址才能准确写入,而且如果写入超过一页的数据会循环覆盖当前页的数据。







关于IIC总线


I2C总线:i2c总线是 Philips 公司首先推出的一种两线制串行传输总线。它由一根数据线(SDA)和一根 时钟线(SDL)组成。i2c总线的数据传输过程如图3所示,基本过程为:
1、主机发出开始信号。
2、主机接着送出1字节的从机地址信息,其中最低位为读写控制码(1为读、0为写),高7位为从机器件地址代码。
3、从机发出认可信号。
4、主机开始发送信息,每发完一字节后,从机发出认可信号给主机。
5、主机发出停止信号。


I2C总线上各信号的具体说明:
开始信号:在时钟线(SCL)为高电平其间,数据线(SDA)由高变低,将产生一个开始信号。
停止信号:在时钟线(SCL)为高电平其间,数据线(SDA)由低变高,将产生一个停止信号。
应答信号:既认可信号,主机写从机时每写完一字节,如果正确从机将在下一个时钟周期将数据线(SDA)拉 低,以告诉主机操作有效。在主机读从机时正确读完一字节后,主机在下一个时钟周期同样也要将数据线(SDA)拉低,发出认可信号,告诉从机所发数据已经收妥。(注:读从机时主机在最后1字节数据接收完以后不发应答,直接发停止信号)。
注意:在I2C通信过程中,所有的数据改变都必须在时钟线SCL为低电平时改变,在时钟线SCL为高电平时必须保 持数据SDA信号的稳定,任何在时钟线为高电平时数据线上的电平改变都被认为是起始或停止信号。


作为一种非易失性存储器(NVM),24系列EEPROM使用的很普遍,一般作为数据量不太大的数据存储器。下面总结一下其应用的一些要点。从命名上看,24CXX中XX的单位是kbit,如24C08,其存储容量为8k bit,即1k Byte=1024 Byte。
一、工作条件
1.工作电压(VCC)
   24CXX: 4.5V-5.5V
   24CXX-W:2.5V-5.5V
   24CXX-R: 1.8V-5.5V
2. 输入电平定义(VIH,VIL)
   VIH:0.7VCC-VCC+1
   VIL:-0.45V-0.3VCC
二、硬件连接
1.上拉电阻RP的取值
   由于I2C总线电容要满足小于400pf的条件。从以下波形可以看出,上拉电阻越大,总线的电容越小,可以实现的数据传输率就越大,可达400khz。

2.写保护脚
       芯片写保护脚是高电平有效,即WP接高电平时禁止写入
3.地址脚
      24C01/24C02 三个地址脚(E0,E1,E2)都有效,24C04只有E2,E1有效,24C08只有E2有效,24C16三个地址脚都无效,如下图所示,所谓地址脚无效是指不需要接入电路中(NC ,not connected),其对应的地址位要用来表示要操作的字节的高位地址。

24C32/24C64三个地址脚都有效;                          
24C128/24C256/24C512的地址脚E1和E0有效,其余为NC;                          
24C1024的地址脚E1有效,其余为NC。
                            
三、寻址方式
1.器件地址
     当总线上连接多个I2C器件时,需要对器件进行寻址。器件地址如下表所示,其中E2,E1,E0是指三个引脚的状态,取决于是接地还是接高电平,R/W为1则为读操作,为0则为写操作。A8,A9,A10,A16指的是所要操作的字节地址的高位,后面会提到。
  


 芯片 bit7 bit6  bit5  bit4 bit3  bit2  bit1  bit0
 24C01/02/21        1 0 1 0 E2 E1 E0 R/W
 24C04 1 0 1 0 E2 E1 A8 R/W
 24C08 1 0 1 0 E2 A9 A8 R/W
 24C16 1 0 1 0 A10 A9 A8 R/W
 24C32/64 1 0 1 0 E2 E1 E0 R/W
 24C128/256/512 1 0 1 0 0 E1 E0 R/W
 24C1024 1 0 1 0 0 E1A16 R/W

2.字节地址
    在对芯片内的某一字节或一连续地址进行读写操作时,需要制定其地址或首字节的地址,不同芯片地址有不同的表示方式,如下表所示,其中有些芯片的地址位的高位存储在器件地址中。
 
芯片地址位数地址范围
24C01bit7-bit00x00-0x7F
24C02bit7-bit00x00-0xFF
24C04A8,bit7-bit00x00-0x1FF
24C08A9,A8,bit7-bit00x00-0x3FF
24C16A10,A9,A8,bit7-bit00x00-0x7FF
24C32bit15-bit8,bit7-bit00x00-0xFFF
24C64bit15-bit8,bit7-bit00x00-0x1FFF
24C128bit7-bit00x00-0x3FFF
24C256bit7-bit00x00-0x7FFF
24C512bit7-bit00x00-0xFFFF
24C1024A16,bit15-bit8,bit7-bit00x00-0x1FFFF


四、读写时序
    EEPROM一般在电路中做从器件,以下的发送和接收都是针对主器件说明的,开始和结束条件也是由主器件发出。
1、单字节写操作
     START->发送器件地址->ack->发送字节地址->ack->发送数据->ack
     -> STOP
2、按“页”写操作,“页”是指高位地址一样一组数据,对于24C01/02/04/08/16,一页数据为16字节,一页指高四位地址一样的一组数据。对于24C32/24C64,一页数据为32字节,一页指高11位地址一样的一组数据。
     START->发送器件地址->ack->发送页首地址->ack->发送数据->ack.........-> 发送数据->ack -> STOP
3、随机单字节读操作
    START->发送器件地址(写)->ack->发送字节地址->ack->START->发送器件地址(读)->ack->接收数据->noack->STOP
4、当前单字节读操作,“当前”指的是前面进行过读操作,但是没有STOP,芯片内部“指针”指的字节即为“当前”字节。
   START->发送器件地址(读)->ack->接收数据->noack->STOP
5、随机连续字节读操作
      START->发送器件地址(写)->ack->发送字节首地址->ack->START->发送器件地址(读)->ack->接收数据->ack->接收数据->ack.........接收数据(最后字节)
    ->noack->STOP 
6、当前连续字节读操作
     START->发送器件地址(读)->ack->接收数据->ack->接收数据
     ->ack...............接收数据(最后字节)->noack->STOP


关于页写的道理。
    AT24Cxx系列的EEPROM为了提高写效率,提供了页写功能,内部有个一页大小的写缓冲RAM,地址范围当然就是从00到一页大小,发生写操作时,开始送入的地址对应的页被选中,并将其内容映像到缓冲RAM,数据从低端地址对应的缓冲RAM地址开始修改,超过这个地址范围就回到00,写完后,就会把开始确定的EEPROM页擦除,再把一整页RAM数据写入。所有写数据都发生在开始写地址时确定的页上。
    如页容量为128,一页都是从00开始按128字节分成一个个的页,0页就是0~7F,1页就是80~FF,类推,边界就是128字节的整数倍地址。页RAM的地址范围为7位00~7F,写入时高端地址就是页号。发生写操作,开始送入的地址对应的页被锁存,后续不论写多少,都在这个页中,只是一个页内的地址进行加一,超过就归零开始。从F0开始写32个字节,那么开始送入的地址为F0,就会锁定在1号页(第2个页)上,底端7位页内部地址开始从70H开始写,到达7F时回到00再到10H,也就是写在了F0~FF,80~8F。也就是,从01开始写也只能到7F,再往80写就跑到00上去了,这就是写操作的翻卷,datasheet上都有说明。就是从边界前写两个字节也要分两次写。页是绝对的,按整页大小排列,不是从开始写入的地址开始算。
    读没有页的问题,可以从任意地址开始读取任意大小数据,只是超过整个存储器容量时地址才回卷。但一次性访问的数据长度也不要太大。所以分页的存储器要做好存储器管理,尽量同时读写的数据放在一个页上。


关于页写的道理。
    AT24Cxx系列的EEPROM为了提高写效率,提供了页写功能,内部有个一页大小的写缓冲RAM,地址范围当然就是从00到一页大小,发生写操作时,开始送入的地址对应的页被选中,并将其内容映像到缓冲RAM,数据从低端地址对应的缓冲RAM地址开始修改,超过这个地址范围就回到00,写完后,就会把开始确定的EEPROM页擦除,再把一整页RAM数据写入。所有写数据都发生在开始写地址时确定的页上。
    如页容量为128,一页都是从00开始按128字节分成一个个的页,0页就是0~7F,1页就是80~FF,类推,边界就是128字节的整数倍地址。页RAM的地址范围为7位00~7F,写入时高端地址就是页号。发生写操作,开始送入的地址对应的页被锁存,后续不论写多少,都在这个页中,只是一个页内的地址进行加一,超过就归零开始。从F0开始写32个字节,那么开始送入的地址为F0,就会锁定在1号页(第2个页)上,底端7位页内部地址开始从70H开始写,到达7F时回到00再到10H,也就是写在了F0~FF,80~8F。也就是,从01开始写也只能到7F,再往80写就跑到00上去了,这就是写操作的翻卷,datasheet上都有说明。就是从边界前写两个字节也要分两次写。页是绝对的,按整页大小排列,不是从开始写入的地址开始算。
    读没有页的问题,可以从任意地址开始读取任意大小数据,只是超过整个存储器容量时地址才回卷。但一次性访问的数据长度也不要太大。所以分页的存储器要做好存储器管理,尽量同时读写的数据放在一个页上。

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2015-7-20 15:11

写的太好了

相关推荐阅读
用户1017182 2016-03-20 13:49
STM8-STVD(COSMIC)定义变量指定其类型和位定义
stm8 stvd下near等于51的xdatatiny等于51的idata 如何分配变量到指定的地址 举例: unsigned ch...
用户1017182 2016-03-05 21:59
磁保持继电器的效率问题
怎样才能最大化的发挥磁保持继电器的优势呢?...
用户1017182 2014-05-03 14:38
指示电量不足的简单电路设计
图中所示的设计实例可指示使用四节AA电池供电的音频测试仪器出现的电量不足状态。由于该仪器采用的是分立式设计,相较于单一来源的集成电路,该相同方法看似更符合项目初衷。   普通的红色LED既...
用户1017182 2014-05-03 14:19
source insight调用Keil编译器并且定位到错误行
  EDN博客精华文章  作者:mubo   效果图如下: 点击看原图   下面是实现方法:   1、Source Insight -> Options -> Custom Comma...
用户1017182 2014-05-03 14:13
解决source insight输入中文间距大,删除键Del键左右方向光标半个汉字的问题
在默认情况下,往Source Insight里输入中文,字间距相当的大,下面将帮助你解决这个问题。具体设置如下:1.Options->Style Properties2. 在左边Style Na...
用户1017182 2013-07-06 10:33
评论:@汽车电子设计之路 博客中提到的“功率Mosfet参数介绍”
好...
我要评论
1
9
关闭 站长推荐上一条 /3 下一条