引 言
Micro SD卡支持SD模式和SPI模式。随着高性能单片机的性能不断提高,利用高性能、低功耗的AVR 8位ATmegal28L单片机的串行外设接口SPI与Micro SD卡之间进行高速同步数据传输,设计开发了一种嵌入式文件系统。
1 硬件电路设计
MicrO SD卡的接口可以支持两种操作模式:SD模式和SPI模式。主机系统可以选择其中任一模式。SD卡模式允许4线的高速数据传输,传输速率高,但是大部分单片机无此接口,使用软件模拟协议复杂。SPI模式使用简单通用的SPI通道接口就可实现数据传输,目前大多数单片机提供SPI接口。SPI模式的优势在于可以使用标准主机,从而把外设减少到最低。SPI模式相对于SD模式的缺点是损失了传输速度;但是目前的微处理器的处理速度越来越高,利用SPI模式大都能满足工程需要。
Micro SD卡要求用全双工、8位的SPI操作。
ATmegal28L单片机和Micro SD卡之间只需要4根信号线就可以完成数据的读写,当CS信号线为低电平时,主机开始所有的总线传输。数据从单片机的MOSI引脚同步输入Micro SD卡的DI引脚,并由Micro SD卡的DO线同步输入单片机的MISO引脚,数据在CLK信号的上升沿同步输入和输出。在每个数据传输的结尾还必须提供8个额外的时钟,以允许Micro SD卡完成任何未完结的操作。由于Micro SD卡的电压为3.3 V,所以选择需要支持3.3 V的I/O端口输出的ATmegal28L单片机。另外,使用SPI模式时,为了防止在无卡接人或卡驱动器呈高阻态时总线悬空,根据SD卡规范,这些信号需要在主机端用10 kQ~100 kΩ的上拉电阻,其硬件连接电路如图1所示。
2 软件设计
2.1 Micro SD卡初始化为SPI总线模式
ATmegal28L单片机包含一个串行外设接口SPI,可以方便地对Micro SD卡接口进行配置。为了配置时钟和数据长度,需要对SPI控制寄存器SPCR和SPI状态寄存器SPSR进行设置:使能SPI,选择单片机为主机模式,时钟上升沿锁存数据,并且对SPI时钟进行设置。Micro SD卡的SPI模式通信由主机控制。每一个指令或数据块由8位的字节和CS标志构成,SPI通信由指令、响应和数据组成。主机先将Micro SD卡的片选CS置低,激活MicroSD卡进人工作状态。
刚上电时,Micro SD卡缺省使用专有的SD总线协议。将Micro SD卡切换到SPI模式,主机需要发出命令(2MD0(GO_IDLE_STATE)。Micro SD卡会检测到SPI模式选择信息,因为卡选择(CS)引脚在该命令和其他所有SPI命令传送过程中都保持为低电平。Micro SD卡以R1作为响应。空闲状态位被置为高电平,此时Micro SD卡进入空闲状态,此阶段的SPI时钟频率不能超过400kHz(将SPCR寄存器设置为0x53)。Micro SD卡进入SPI模式后,主机应该先发一条初始化指令CMD1。此时可将SPI频率设置为高速模式(将SPCR寄存器设置为0x50)。然后发送命令CM1359决定是否开启CRC校验,设置读、写块数据长度,最后延迟8个时钟后返回。MicroSD初始化流程如图2所示。
2.2 Micro SD卡读写单块数据
从Micro SD卡中读取一个数据块只需要主机发送CMDl7(READl_SINGLE_BLOCK)命令,并将起始地址作为参数(此地址必须和介质上一个块的起始位置对齐),然后.Micro SD卡会验证这个字节地址,并以一个R1命令作为响应。完成了Micro SD卡读取操作后,先发送一个起始数据命令,接着发送固定数量的数据,最后是两个字节CRC校验。
从Mimro SD卡中写入一个数据块和读取数据块相似,需要主机发送CMI)24(wRITE_BLOCK)命令启动写操作过程,Micro SD卡将以R1命令响应格式进行应答。如果命令响应,则进行写操作,主机发送起始令牌,然后发送固定数量的数据字节(512字节),返回一个数据响应令牌指示需要写入的数据是否完成,最后是两个字节的CRC校验,读写单块数据流程如图3所示。
2.3 Micro SD卡的文件存储
为了方便ATmegal28L单片机对Micro SD卡中文件进行操作,以及要使Micro sD卡的数据能在PC机上得到正确的访问,需要在Micro SD卡上创建它们支持的文件系统,这就需要设计自己的文件管理系统FAT。FAT文件系统有FATl2、FATl6、FAT32,它们的主要不同是在磁盘分配表结构中每个记录所占的位数不同。FAT32文件分配表每一表项为32位。本文选择建立FAT32文件系统。
文件分配表系统的分区应该有以下几部分:
①保留区,FAT32称这个区域为引导扇区(bootsec-tOr)。它是操作系统可以直接访问的第一个扇区,主要包括与引导操作系统有关的引导参数和引导程序,还有就是与FAT文件系统有关的BPB参数(Bios ParameterBlock)。
②文件分配表,记录磁盘上簇的分配情况,在条件允许的情况下,通常都会把文件分配表全部读到内存中去。
③根目录区,记录根目录的信息。文件和目录数据区,是各种文件数据的实际存放区域。
一个文件管理系统的工作过程主要有三步:第一步是读取MBR区,主要是读DPT表,了解存储设备分区情况。第二步,读取BPB信息,确定FAT文件系统的各种基本参数。第三步,显示当前目录位置。文件系统的实现,就是把对应的文件目录操作拆成相应的扇区读写命令就可以了。因此,应该在FAT初始化的时候将读写扇区函数指针指向Micro SD卡的读写函数:
2.4 FAT32文件系统应用接口函数的实现
FAT32文件系统向应用层提供的接口有:FAT_FindFreeCluster(),查找空簇;FAT_ModifyFAT(),修改FAT项;FAT_OpenDir(),打开目录;FAT_MkDir(),建目录;FAT_RmI)ir(),删除目录;FAT_Rename(),重命名;FAT_Create(),创建文件;FAT_Open(),打开文件;FAT_write(),写文件;FAT_Read(),读文件;FAT_Close(),关闭打开文件;FAT_Delete(),删除文件。下面对文件的打开、读/写和删除函数接口作详细介绍。
2.4.1 文件的打开
在该文件系统中,要读/写一个文件必须先打开它,这里通过调用函数FAT_Open()实现,文件的打开可以用只读、只写、读写的方式打开。其中,以只读的方式打开文件时,如果文件不存在,则打开文件错误;以只写的方式打开文件,如果文件存在,则文件先被删除然后再建立这个文件;以读写的方式打开文件与只写方式不同,若文件存在,则不会被删除而是直接打开,否则就和只写方式一样。下面以只写方式打开文件为例:
首先,函数要查找空闲的打开文件登记项,如果没有找到则不能打开文件,如果找到则记录。然后,获取文件的内部名称及所在目录的首簇号,判断目录是否存在。最后,获取:FDT登记项,判断是否为目录,删除文件,添加FDT表项,修改打开文件的信息登记项,返回句柄。文件以只写方式打开文件的流程如图4所示。
2.4.2 文件的读/写
SD卡上文件都是以簇为单位存取的。读SD卡上的文件,首先要在FAT初始化之前对SD卡初始化,将FAT中读写一个扇区指向SD卡中读写扇区函数,然后获取文件所在逻辑盘的信息,计算数据所在扇区,读取扇区中的数据,最后调整文件指针。
2.4.3 文件的删除
删除文件时,不涉及数据区的操作,只须在文件的目录登记项上作一个删除标记,并把文件在FAT表中所占用的簇标记为“空簇”。
结 语
本设计将Micro SD卡的存储方式应用到电脑横机控制系统中,简化了花型文件数据存储设计,减小了系统的尺寸,提高了系统的可靠性,使得花型文件的读出和存取简单易行,裁剪了FAT32实现了嵌入式文件系统,提高了系统的存储能力。采用ATmegal28L高性能单片机的串行外设接口SPI,满足访问Micro SD卡的功能要求,加快了整个系统的设计进程。实践证明,该文件系统读取Mi—cro SD卡上花型文件的速度满足该控制系统的要求。该嵌入式文件系统只需对底层驱动进行简单修改就可移植到CF卡、闪存等其他的存储介质上。