AT24C512中数据的文件系统化管理
在由单片机构成的数据采集系统及智能仪器仪表当中,往往有大量数据要保存。随着测控系统数字化的发展,人们对数据存储提出了更高的要求,因而用于存储数据的存储器容量也越来越大。但是,在增大数据存储量的同时,人们也希望能更便捷高效地操作其中的数据(包括浏览、添加和删除等),即像PC机上管理数据一样简单易行。然而,单片机以及用于保存数据的芯片本身并没有提供这种功能,为此,需要开发一种用于管理单片机数据的有效方法。本文在吸取PC机文件管理思想的基础上,以AT24C512为例,构造了一种类似于文件系统的用于管理单片机数据的方法,大大提高了数据操作的效率。
1 AT24C512介绍
AT24C512是Atmel公司生产的64KB串行电可擦的可编程存储器,内部有512页,每一页为128字节,任一单元的地址为16位,地址范围为0000~0FFFFH。它采用8引脚封装,具有结构紧凑、存储容量大等特点,可以在2线总线上并接4片芯片,特别适用于具有大容量数据存储要求的数据采集系统,因此在测控系统中被大量采用。 AT24C512的封装如图1所示,
各引脚的功能如下:
①A0、A1--地址选择输入端。在串行总线结构中,如需连接4个AT24C512芯片,则可用A0、A1来区分各芯片。A0、A1悬空时为0。
②SDA--双向串行数据输入输出口。用于存储器与单片机之间的数据交换。
③SCL--串行时钟输入。通常在其上升沿将SDA上的数据写入存储器,而在下降沿从存储器读出数据并送往SDA。
④WP--写保护输入。此引脚与地相连时,允许写操作;与VCC相连时,所有的写存储器操作被禁止。如果不连,该脚将在芯片内部下拉到地。
⑤VCC--电源。 GND接地。NC悬空。
(1)与单片机接口
由于AT24C512沿袭了AT24C系列的接口特性,因此与单片机的连接也可沿袭传统方法。一般A0、A1、WP接VCC或GND,SCL、SDA接地单片机的P1口,即可实现单片机对AT24C512的操作。
(2)设备选址
在对AT24C512开始操作前,需要先发一个8位的地址字来选择芯片以进行读写。设备地址字格式如图2所示。其中"10100"为固定的5位二进制;A0、A1用于对多个AT24C512加以区分;R/W为读写操作位,为1时表示读操作,为0时表示写操作。
(3)写操作
AT24C512的写操作有写字节和写页两种方式。写字节时通常在向AT24C512发送设备地址字并接到应答信号后,还需要发送2个8位地址来选择要写数据的地址。AT24C512接收到这个地址后会应答一个零信号,然后接收8位数据进来,并再返回一个零应答信号。 在写页方式时,AT24C512可以一次性写入一页128字节。其初始化过程与写字节的方法基本相同。不同的是:当写入一个数据字节后,单片机不发停止状态,而是在应答信号后接着输入127个字节;每一个字节接收完毕后,AT24C512则照样输出一个零应答信号。
(4)读操作
读操作有当前地址读、随机读、读串三种方式。其初始化过程基本与写操作相同,只是在设备选择字中的最低位要改成读而已。在当前地址读操作方式时,内部数据的地址将保持在最后的读写操作地址加1上,直到读到最后字节后又回到最开始的位置。而随机读操作之前先要向AT24C512写入一个字节地址,然后才能读。读串操作既可以是当前地址读,也可以是随机地址读。当单片机接收到一个数据字后,会回应一个应答信号。AT24C512在接收到应答信号后会将地址加1,接着输出下一个字节。当单片机接收到数据但不送应答信号时,读过程结束。
2 文件系统构成
为了有效地管理AT24C512中的数据,笔者仿效PC机中的文件管理机制,为AT24C512构造了一个简单的文件系统。考虑到测控系统的实时性要求和硬件资源的有限性,采用了二级树形目录组织。 为了管理数据方便 ,把AT24C512的物理空间划分为1024个逻辑页,每页64字节。按照文件系统的需要,把AT24C512的全部空间划分为三部分:数据区,占用最后的960页;页面分配区,占用中间的30页;目录区,占用前面的24页。
(1) 数据区
AT24C512最后面的960页作为数据区,其序号从0开始编号。该区作为文件数据的存储区域,在存放文件数据时,从该区内分配若干页,每次存储一页。
(2)页面分配区
页面分配区记录了数据区每一页的分配情况。该区中每2字节组成一个记录项,共有960个记录项。记录项从0开始编号,每一个记录项对应着数据区相应页的使用情况。 在实际应用中,一个文件的数据往往大于64字节,这样一个文件的数据区中需占用多个页。但随着文件的增删,数据区的空闲空间出现不连续的状况,因而数据区的分配并不能保证连续,而是根据当前数据区的使用情况来决定某一部分文件内容应该放在哪一页上。为了把这些分散的数据有机连接起来,把记录项按照链表的形式组织起来,每个文件对应着一个链表,链表中每个结点为一个记录项,记录项的内容为下一个记录项的编号,最后一个记录项的内容为0FFFFH,表示链表结束。把这些记录项对应的页面连接起来就构成了一个文件的完整数据。 另外,如果记录项的内容为0EEEEH,表示其对应的数据页未分配。
(3)目录区
目录区用来存储文件的主要信息。根据这些信息可以知道文件名、文件生成的日期以及文件的数据在数据区中的存储首地址。文件目录项的结构如下: ①文件名。文件名由4字节双BCD码构成,在生成该文件时由键盘输入数字(硬件上键盘只提供了数字键)作为文件名,并由程序自动把它们转换成双BCD码。在需要显示时,再把它们分解成8字节单BCD码供显示。 ②文件生成日期。占用4字节,按照双BCD码的格式存储,如20H、04H,03H、20H则表示2004年3月20日。日期可由键盘输入或通过时钟芯片获取。 ③文件首地址。指示在给该文件分配空间进,分配给它的第一个数据页的序号,即它对应的链表的第一个记录项的编号。 目录区共占用24页。由于每个文件信息只占用10字节,则在此文件系统中,最多可存储153(24%26;#215;64/10)个文件。
目录区、页面分配区和数据区的逻辑关系如图3所示。
以图3为例,说明该文件系统如何获取文件数据: ①在目录区中根据文件名找到包含该文件名的目录项,从而获取该文件的属性及其首地址。如文件"00000103"的日期为2003年11月24日,其首地址为0005H。 ②根据文件的首地址,在页面分配区中找到该记录项0005H。在该记录项中存储的值为0007H,可知该文件的下一记录项为0007H。 ③同理,可得到文件的后续记录项为0008H、0009H、000BH,直到从000BH记录项中读到0FFFFH。此时表示这是最后一项,不需再继续找后继项了。 ④至此,可知文件"00000103"的数据分为5部分存储在数据区中,分别存储在0005H、0007H、0008H、0009H、000BH页中。只要按序到数据中读取这些中的数据,并连接起来,就形成了该文件的全部数据。 ⑤同理,文件"00000001"在数据区中使用了0002H和0003H两页,文件"00015671"只使用了数据区第000AH页。
- 基于FAT16文件系统的嵌入式温度记录器(05-30)
- SPI Flash M25P32 的TFFS文件系统的设计与实现(07-04)
- 基于ATmega32的SD卡上FAT32文件系统数据读取(10-08)
- 嵌入式设备上的文件系统优化设计(01-12)
- 基于STM32处理器的便携式BMP图片解码系统设计(01-07)
- 基于ARM9和μC/OS-II的SD卡文件系统设计与实现(07-08)