微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 采用四片AT24C1024组成的存储器设计方案

采用四片AT24C1024组成的存储器设计方案

时间:10-02 整理:3721RD 点击:
很好的一片关于存储器的文章,干货很多哦
AT24C1024是Atmel公司生产的大容量串行EEPROM,其容量为128KB。这类串行EEPROM单一芯片组成的存储器是最常见的一种使用方法,这种使用方法在各类刊物和厂商的资料中均有介绍,因此一般使用起来都会得心应手的。然而,多块这样的芯片组成的存储器其使用方法在各类刊物中的介绍并不多见。笔者因水文自动化测报业务需要,选用了四片该型号的EEPROM组成了容量为512KB的可移动式固态存储器。从表面上看,四芯片组成的存储器和单芯片组成的存储器读写时序等原理是完全一样的。但是笔者在设计过程中,如何将四块这样的芯片组成一个存储空间使数据能够完整地连续不间断地存放,在算法上颇费了一番心思。为此,撰写本文介绍程序的编写方法,意在与读者进行经验交流。


一、电路原理


该移动式固态存储器是用在水文观测站的遥测终端机上作为雨量和水位数据的存储器。电路如上图所示。从原理图可知,存储器在数据写入时通过RS232接口 (Jl)与终端机上的主板相连接,读数据时从主板上取下并通过Jl直接插入数据采集电脑的RS232接口同时通过USB口获取5V工作电压即可正常工作。为适应数据采集计算机的接口电平需要,电路中设置了MAX232集成芯片,该芯片将CPU串口的TTL电平转换成RS232电平。根据AT24C1024的结构特点,一个IC总线可以连接两块这样的芯片。因此,选用CPU的P1.2至P1.5共4个I/O口线模拟两组IC总线与四片EEPROM组成的存储器相连接,其中:P1.6、P1.5为第一组IC总线与U3、U5相连接,P1.5为数据线连接EEPROM的SDA,P1.4为时钟线连接EEPROM的SCK;P1.2、 P1.3为第二组IC总线与U4、U6相连接,P1.2为数据线连接EEPROM的SDA,P1.3为时钟线连接EEPROM的SCKo同-IC总线上的两片EEPROM通过芯片上第3脚即“El”的接法及CPU在读写操作时指定的芯片地址两者结合实现“片选”功能。


二、存储器读写程序设计
根据采样时间要求,存储器每五分钟存储一组雨量和水位数据。所有数据均按照采集时间的先后顺序连续存入,每组数据的格式为“月、日、时、分、雨量、水位、水位”7个字节。采集数据时通过手提式或台式电脑将数据从固态存储器中读入,然后以7个字节为单位从头至尾对数据进行分割,分割出来的每组数据为“月、日、时、分、雨量、水位、水位”与采集时的数据相对应。从数据采集和分割的过程来看,数据存储时须按照采集时间的先后顺序连续不间断地存放,否则在数据分割时将会出错。所谓“连续存放”是指数据按采集时间的先后顺序依次占满第一块芯片之后按顺序存入第二块,第二块数据占满之后按顺序存入第三块,依此类推直到第四块存满为止。为实现这一目的,在数据写入的程序中需设计一种算法,用于解决一块芯片内数据是否占满了,何时启用下一块芯片及通过哪一组总线传送数据等一系列的问题,这个问题归根结底是地址指针的算法问题。为了便于读者对文中的这一算法的理解,在此,有必要简单介绍一下AT24C1024的地址构成及读写的一般规则。众所周知这种芯片的地址是由两部分组成,一是芯片地址,二是存储单元地址,前者是实现片选功能、提供第十七位地址指针及读/写控制,后者是确定读/写操作的目标存储单元地址。这种EEPROM的容量为1024Mb折合为128KB,地址空间为OOOOOH~1FFFFH,需要17位的地址指针,其中高低八位共十六位地址指针由两个字节组成,第十七位地址指针与芯片地址合并为一个字节,占用该字节的第三位,据此AT24C1024的芯片地址格式为:



其中高5位“10100”为AT24C1024芯片的特征位,固定为此种格式;D为读/写标志位,等于“0”为写,等于“1”为读:Dl与芯片 “El”引脚的接法相结合实现所谓的片选功能,Dl=“1”时“El”接高电平的芯片有效,Dl=“O”是“El”接低电平的芯片有效;A16为 EEPROM存储单元的第十七位地址指针与高低八位地址指针共同确定EERPOM的存储单元地址。AT24C1024写操作的规则是,首先向总线发送芯片地址选择(启动)同一IC总线上的芯片,然后相继发送高八位和低八位地地址指针,最后将待写入的数据发送到总线上完成写操作。对于单芯片组成的存储器,按照这些步骤即可实现读/写操作。然而,由于本固态存储器是由四块芯片组成,有两组IC总线,读/写操作时除了按照单芯片存取数据的步骤外还必须明确:目标芯片是哪一块,通过哪一组总线进行通信等。因此算法较为复杂些。为解决这一问题,笔者将U3、U5、U4和U6四块目标芯片分别编号为O、1、2和3号,使用0号芯片的OOOOOH~ 00003H四个地址单元存放地址指针,该地址单元按从小到大顺序分别对应“片号”、“A16”、“高八位”和“低八位”地址指针。写数据操作时地址指针的算法是:每写入一个字节数据时“低八位”地址指针累加1,满位后向“高八位”进位,“高八位”满位后向“A16”位进位,“A16”满2后清零并向“片号”地址指针进位。当“片号”、“A16”、“高八位”和“低八位”地址指针同时分别为“03H、OIH、OFFH和OFFH”时说明四块芯片的存储器空间已占满。读/写操作时是根据“片号”来确定启动哪一组IC总线的,0、1号芯片对应第一组IC总线,2、3号芯片对应第二组IC。如下图所示。


从写数据流程图可以看出:在写操作时首先启动O号芯片,从OOOOOH-00003H地址单元中读取“片号”、“A16”、“高八位”及“低八位”地址指针,然后根据这些地址指针确定启动哪一组IC总线以及数据写入哪一块芯片的哪一个存储单元。程序的具体执行过程是,获取地址指针后,首先判读“片号”,根据“片号”进入对应的程序段(该程序段与IC总线组相对应),然后判读“A16”地址指针,由“片号”及“A16”确定芯片地址,启动对应的芯片,接着向总线发送“高八位”和“低八位”地址,最后将一字节的数据写入由上述地址指针指定的存储单元。写入一字节的数据后,接着修改地址指针,算法是“低八位”地址指针累加1,“高八位”及“A16”按顺序分别带进位位累加O,当“A16”指针带进位累加O其结果等于2时,说明该当前芯片数据已写满,此时“片号” 指针累加1,同时“A16”、“高八位”及“低八位”指针均清零,指针指向下一编号的芯片,当“片号”指针累加1其结果等于4时,说明整个存储空间数据已经存满;地址指针修改之后,程序接着判断数据是否写入完毕,是则将新地址指针写回0号芯片的OOOOOH~ 00003H单元,为下一次写数据提供地址指针,至此写数据结束,否则将循环上述过程,继续写入数据。


从上述存储器的写程序的执行过程中也可以看出:这种存储的读写过程其地址指针的确定方法类似于IBM-PC(8086/8088)系统的寻址方式,其中 “片号”相当于8086/8088的“数据段”指针(DS),其存放位置为O号芯片的OOOOOH单元;“A16”、“高八位”及“低八位”相当于变地地址指针,其存放位置分别为0号芯片的OOOOIH。00003H单元。读者可从这个角度来理解上述地址指针的计算方法。数据的读取程序与写程序原理基本相同,其设计过程及工作过程在此从略。

小编就一起加油~~~~~

小编,你这种是写满之后可以覆盖的,,如果不能覆盖的写满之后怎么办呢,比如m25p32这种,4M的,再写之前必须先擦除,当写满之后我又得重新擦除前面的,擦一块,写一块,,现在有个问题想请教就是在写满之后不知道该怎么办,就是这个写和擦

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top