微波EDA网,见证研发工程师的成长!
首页 > 应用设计 > 消费类电子 > 基于单片机的CF卡文件存储

基于单片机的CF卡文件存储

时间:08-30 来源:互联网 点击:
不同。FATl2占12位(1.5字节),FATl6占16位(2字节),FAT32占32位(4字节)。每一个记录中的数据都按照低字节在前、高字节在后排列。

在CF卡格式化时,首先要了解CF卡的容量等一系列信息。通过对CF卡写入命令ECH就可以读出1个扇区,其中包含了该CF卡的一些参数的信息,如容量、默认的柱面数、默认的磁头数、每个扇区的字节数、每个磁道的扇区数和CF卡上总的扇区数等。这为格式化CF卡提供了重要的数据。

在格式化后的CF卡中,FAT文件系统由如下4部分组成:

0区:保留区(引导区)。
1区:FAT区。
2区:根目录区(FAT32中存在的是浮动的FDT表)。
3区:文件、目录与数据区(下面简称数据区)。

引导区中包含了整个FAT文件系统的重要信息,即BPB(BIOS Parameter Block)。下面为BPB的几个重要数据结构:
  

  
在FAT32格式下,BPB﹒RootEntCnt为'0',因此RootDirSec总是为'0'。

如果BPB.FATSzl6不为'0',就可以根据下面公式计算数据区的第一个扇区地址。

FirstDataSec="BPB".ResvdSecCnt+(BPB.NumFATs*BPB.FATSzl6)+RootDirSec (4)

因此数据区所占用的扇区数:

DataSec="BPB".TotSecl6-FirstDataSec (5)

根目录的第一个扇区地址(在FATl2、FATl6下):

FirstRootDirSec="BPB".ResvdSecCnt+(BPB.NumFATs*BPB.FATSzl6)

如果BPB.FATSzl6为'0',则BPB.FATSz32一定不为'0',则有:

FirstDataSec="BPB".ResvdSecCnt+fBPB.NumFATs*BPB.FATSz32)+RootDirSec (6)

DataSec="BPB".TotSec32-FirstDataSec (7)

FirstRootDirSec="BPB".ResvdSecCnt+(BPB.NumFATs*BPB.FATSz32) (8)

如果CF卡有多个分区,则(3)~(8)式计算出的参数只是相对当前分区而言的,且数据区所占用的簇数为:

CntofClus="DataSec"/BPB.SecPerClus (9)

在格式化CF卡时,根据CF卡容量的大小决定FAT数据结构中的一些参数,再由式(9)算出数据区总的簇数,并根据总簇数的大小确定FAT形式。一般来说,如果CntofClus<4 084簇,则可以格式化成FATl2的形式;如果≥4 084簇而<65 524簇,则可以格式化成FATl6的形式;如果≥65 524簇,则格式化成FAT32的形式。

若给定一个簇的序号N(N≥2),则在数据区对应该簇的第一个扇区序号为:

FirstSecofClus=((N-2)*BPB.SecPerClus)+FirstDataSec (10)

式(10)表示了FAT与数据区的对应关系,如图3所示。在FAT区每一个记录的位置与数据区中的一簇数据相对应,同时,这个记录又存储着下一簇序号,从而一个件在FAT区形成一个链表。至于每一簇的序号在FAT中的存储位置,可以根据格式化的形式(FATl2、FAT16、FAT32)确定。设每一记录占i个字节,则第N个记录在N×i的位置上。


  
文件的结束符在FATl2下为0xFFF,在FATl6下为0xFFFF,在FAT32下为0x0FFFFFFF。如果在写入时遇到损坏的簇,则在对应位置写损坏的标志(FATl2下为0xFF5FATl6下为0xFFF7,FAT32下为0x0FFFFFF7),并且在{表中跳过这一损坏的簇。在删除一个文件时,要把该文{在FAT区的链表全部写'0',释放空间。这样,该链表中所对应的数据区又可以被新的文件分配。 一个FAT的目录项或文件项通常占用32字节,并存储该目录或文件的相关信息。其数据结构如下:
  

  
这个数据结构中12字节的名字是目录名还是文件名,由成员Attr决定。如果是目录Attr可设为10H;如果j文件,Attr可设为20H,也可以是几个属性的组合;如果为长文件名,Attr可设为OFH。有关详细的长文件名可参见文献。

成员FstClusHI和FstClusL0记录了文件第一簇数据对应FAT中的记录序号,即图3中第一簇的序号,从而可以根据链表查找下一簇数据。在FATl2和FATl6下,成员FstClusHI总为'0'。

4 讨论

本文只介绍了动态脑电图系统的有关文件存储的部分,C8051F020的功能并没有得到充分利用。实际上C8051F020还要完成系统的其他很多功能。用户可以根据自己系统的实际需要选择合适的单片机。本系统在设计时着重考虑系统的功耗、体积、速度等方面的因素,所以C8051F020采用非复用的方式,以求节省1片锁存器对低位地址的锁存。

CF卡在写入文件时,由于要记录24小时的脑电图信号。为了防止异常发生使文件写入失败,可以定时地更新FAT区该文件的记录链表和所存放文件数据结构的根目录区或数据区中该文件的大小。只有保存了这些信息,所写入的数据才能正常地读取。 此外,在写入文件时,如果遇到一个扇区写入失败,则整个簇都不能用。为此:(1)必须查找下一个未占用的簇,再把这一簇中已经正确写入的扇区中的数据复制到下一簇中。这样缓冲区中只要保存一个扇区的脑电信号就可以。(2)先对这一簇进行检测,确定没有错误后再向该簇写人数据。这种方法虽然比较简单,但占用系统的时间比较多,且在检测到没有错误后也不能完全保证下一次写入时不发生错误。所以第一种方法的可靠性要高。

实验证明,SanDisk和EagleTec等公司的不同容量的CF卡用于本系统中都能够正确地对采集到的脑电图信号进行存取。

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

网站地图

Top