基于FAT16文件系统的嵌入式温度记录器
时间:05-30
来源:单片机与嵌入式系统应用
点击:
2 SD卡FAT16文件系统分析
FAT(File Allocation Table,文件分配表)文件管理系统[4]是由微软发布的由MSDOS支持的一种文件管理系统。在FAT发展过程中,先后发布了FAT12、FAT16、FAT32三个版本。其中FAT16是指磁盘的一个分区最多含有2的16次方个簇,由于每个簇的最大存储空间只有32 KB,因此磁盘的一个分区的存储容量最大为2 GB。由于一般SD卡的容量大小不超过2 GB,所以SD卡通常只作为一个分区。
SD卡支持FAT12与FAT16文件系统[5]。表1描述了本文中512 MB SD卡的文件系统结构。
表1 512 MB SD卡文件系统结构
SD卡中的保留扇区,一般不应向该扇区写入数据。若写入不正确的数据,则会破坏SD卡的文件系统结构,导致SD卡在PC机上无法识别。
在FAT文件系统中,BPB(Bios Parameter Block,本分区参数记录表)是一个很重要的参数表。它表明了该分区的一系列重要基本参数,例如总扇区数、每个簇的空间大小、FAT表占用的扇区数等。在SD卡中,保留扇区的第一个扇区(即分区记录扇区)的第12~36字节即为BPB。表2给出了BPB各字段的内容及说明。
表2 512 MB SD卡BPB各字段内容
由于FAT文件系统采用链式存储原理,因此FAT表格中记录了每个文件的起始簇号、后继簇号、终止簇号。本文中,用FAT[i]表明在FAT表中簇号为i的字段的内容,且每个FAT[i]占用2个字节。在FAT16文件系统中,由于FAT[0]与FAT[1]默认值为0xFFFF,因此FAT表从FAT[2]开始存储文件的起始簇号与终止簇号,所以文件的起始簇号为0x0002。在FAT表中,用0x0000表明该簇号对应的存储空间没有被文件占用,用0x0002~0xFFFE的值表明起始簇号与存储后继内容的下一个簇的簇号,若一个文件在簇号为i的存储空间终止,则应在FAT[i]中写入0xFFFF。在第2个FAT表格之后是DIR区,每个FAT16文件都对应一个目录,每个目录的大小为32字节。由于DIR占用了32个扇区,所以在DIR中总共可有512个登记项,这也可通过读取BPB表中的字段BPB_RootEntCnt得到。
如在SD卡上新建FAT文件,应首先在FAT表中查找尚未被使用的簇号,确定文件的起始簇号,并根据文件的大小,确定文件在FAT表格中的终止簇号,在相应的FAT[i]中写入起始与终止簇号。之后应在DIR区申请一个登记项,实际上就是在DIR区中建立一个32字节的文件目录。最后在数据区对应该文件的扇区上写入文件数据。
3 软件设计
3.1 SD卡与LPC2148的底层软件接口设计
SD卡在上电复位后,自动进入SD模式,因此本设计中SD卡与LPC2148的底层软件接口设计主要是指如何使得SD卡进入SPI模式,并在SPI模式下对SD卡的内存单元实现读/写操作。
图2 SD卡初始化流程
图2描述了SD卡在上电复位后的初始化流程。在SD卡上电复位后,SD卡控制器在向SD卡发送任何命令之前,应向SD卡发送至少74个时钟周期,以等待SD卡完成上电复位过程,而且此时控制器应将片选信号线置高。在上电复位完成后,将片选信号线CS置低,即选中SD卡,且发送软件复位指令(CMD0),SD卡即可进入SPI模式,并且处于空闲状态。之后若要对SD卡实现读写操作,主机端LPC2148应持续发送激活指令(CMD1),直到收到SD卡正确的响应数据0x00,表明SD卡已经退出空闲状态,可以对SD卡寄存器进行读/写以及实现数据的传输操作。
在完成上述操作后,应设置一次性写入或者读取SD卡的数据的长度,这可通过发送设置块长度指令(CMD16)来实现。本设计中设定一次读/写的数据块长度为512字节。当要读取、写入SD卡某一数据块的内容时,可通过发送读取数据指令(CMD17)、写数据块指令(CMD24)来完成。
3.2 读取温度值
当LPC2148要读取ADT75各寄存器的内容时,都需要经过先写入再读取的步骤。在写ADT75时,需由地址指针寄存器指出将读取的寄存器地址。图3描述了读取ADT75温度数据的时序。
图3 读取ADT75温度数据的时序
由于温度数据寄存器的地址值为0x0,因此写入地址寄存器的内容为0。在ADT75给出应答信号后,LPC2148给出读信号,即在第9个时钟周期将数据线SDA置为高电平,表明是读取数据。之后LPC2148读取温度数据的高8位,再读取数据的低8位,且LPC2148应在每个字节数据读取结束后,给出低电平的应答信号。当温度数据完成后,LPC2148传送结束时序,结束数据读操作。在12位温度数据格式下,读取的16位温度数据低4位为0,将其取补码后,再除上16(浮点除法),就是实测的温度。
3.3 软件主流程
在本温度记录器的设计中,利用LPC2148片上RTC实时时钟提供的秒中断、分中断、天中断功能实现ADT75温度数据的定时采集、存储和文件的建立。
当RTC的秒中断时,LPC2148通过I2C总线在400 kHz的速率下读取ADT75的温度数据,并将温度数据存于LPC2148内部RAM中。为了便于用户使用读卡器在PC机上读取存入的温度数据,每秒钟存入RAM中的数据为22字节,且均为ASCII字符,数据格式如表3所列。
表3 存储数据格式
其中前4个字节为温度的实时采集时间,存储的时间内容为时、分、秒。第1个温度数据采用十六进制表示;第2个8字节的温度数据为转换后的实际温度值,每条记录均以回车(ASCII码为0x0D)、换行(ASCII码为0x0A)结束。例如,在12时0分59秒采集的温度数据为0x1910,则存入RAM中的数据为"120059 1910+025.625<CR><LF>"。
当RTC的分中断时,LPC2148将临时存于RAM中的数据存入SD卡中。这样可减少对SD卡的写操作次数,延长SD卡的使用寿命。
当RTC的天中断时,LPC2148将在SD卡上新建一个新的记事本文件(.txt文件),文件名即为当天的日期,例如2007年10月6日建立的文件名为"071006.txt"。由于每分钟写入SD卡的数据为22×60=1 320字节,因此每个文件的最大容量是1 856 KB。对于一张512 MB的SD卡,可保存约1年的温度数据。
图4描述了本设计的软件主流程。在实现温度数据的采集与存储之前,需正确配置LPC2148的SPI总线控制寄存器、I2C控制寄存器及RTC实时时钟寄存器。
FAT(File Allocation Table,文件分配表)文件管理系统[4]是由微软发布的由MSDOS支持的一种文件管理系统。在FAT发展过程中,先后发布了FAT12、FAT16、FAT32三个版本。其中FAT16是指磁盘的一个分区最多含有2的16次方个簇,由于每个簇的最大存储空间只有32 KB,因此磁盘的一个分区的存储容量最大为2 GB。由于一般SD卡的容量大小不超过2 GB,所以SD卡通常只作为一个分区。
SD卡支持FAT12与FAT16文件系统[5]。表1描述了本文中512 MB SD卡的文件系统结构。
表1 512 MB SD卡文件系统结构
SD卡中的保留扇区,一般不应向该扇区写入数据。若写入不正确的数据,则会破坏SD卡的文件系统结构,导致SD卡在PC机上无法识别。
在FAT文件系统中,BPB(Bios Parameter Block,本分区参数记录表)是一个很重要的参数表。它表明了该分区的一系列重要基本参数,例如总扇区数、每个簇的空间大小、FAT表占用的扇区数等。在SD卡中,保留扇区的第一个扇区(即分区记录扇区)的第12~36字节即为BPB。表2给出了BPB各字段的内容及说明。
表2 512 MB SD卡BPB各字段内容
由于FAT文件系统采用链式存储原理,因此FAT表格中记录了每个文件的起始簇号、后继簇号、终止簇号。本文中,用FAT[i]表明在FAT表中簇号为i的字段的内容,且每个FAT[i]占用2个字节。在FAT16文件系统中,由于FAT[0]与FAT[1]默认值为0xFFFF,因此FAT表从FAT[2]开始存储文件的起始簇号与终止簇号,所以文件的起始簇号为0x0002。在FAT表中,用0x0000表明该簇号对应的存储空间没有被文件占用,用0x0002~0xFFFE的值表明起始簇号与存储后继内容的下一个簇的簇号,若一个文件在簇号为i的存储空间终止,则应在FAT[i]中写入0xFFFF。在第2个FAT表格之后是DIR区,每个FAT16文件都对应一个目录,每个目录的大小为32字节。由于DIR占用了32个扇区,所以在DIR中总共可有512个登记项,这也可通过读取BPB表中的字段BPB_RootEntCnt得到。
如在SD卡上新建FAT文件,应首先在FAT表中查找尚未被使用的簇号,确定文件的起始簇号,并根据文件的大小,确定文件在FAT表格中的终止簇号,在相应的FAT[i]中写入起始与终止簇号。之后应在DIR区申请一个登记项,实际上就是在DIR区中建立一个32字节的文件目录。最后在数据区对应该文件的扇区上写入文件数据。
3 软件设计
3.1 SD卡与LPC2148的底层软件接口设计
SD卡在上电复位后,自动进入SD模式,因此本设计中SD卡与LPC2148的底层软件接口设计主要是指如何使得SD卡进入SPI模式,并在SPI模式下对SD卡的内存单元实现读/写操作。
图2 SD卡初始化流程
图2描述了SD卡在上电复位后的初始化流程。在SD卡上电复位后,SD卡控制器在向SD卡发送任何命令之前,应向SD卡发送至少74个时钟周期,以等待SD卡完成上电复位过程,而且此时控制器应将片选信号线置高。在上电复位完成后,将片选信号线CS置低,即选中SD卡,且发送软件复位指令(CMD0),SD卡即可进入SPI模式,并且处于空闲状态。之后若要对SD卡实现读写操作,主机端LPC2148应持续发送激活指令(CMD1),直到收到SD卡正确的响应数据0x00,表明SD卡已经退出空闲状态,可以对SD卡寄存器进行读/写以及实现数据的传输操作。
在完成上述操作后,应设置一次性写入或者读取SD卡的数据的长度,这可通过发送设置块长度指令(CMD16)来实现。本设计中设定一次读/写的数据块长度为512字节。当要读取、写入SD卡某一数据块的内容时,可通过发送读取数据指令(CMD17)、写数据块指令(CMD24)来完成。
3.2 读取温度值
当LPC2148要读取ADT75各寄存器的内容时,都需要经过先写入再读取的步骤。在写ADT75时,需由地址指针寄存器指出将读取的寄存器地址。图3描述了读取ADT75温度数据的时序。
图3 读取ADT75温度数据的时序
由于温度数据寄存器的地址值为0x0,因此写入地址寄存器的内容为0。在ADT75给出应答信号后,LPC2148给出读信号,即在第9个时钟周期将数据线SDA置为高电平,表明是读取数据。之后LPC2148读取温度数据的高8位,再读取数据的低8位,且LPC2148应在每个字节数据读取结束后,给出低电平的应答信号。当温度数据完成后,LPC2148传送结束时序,结束数据读操作。在12位温度数据格式下,读取的16位温度数据低4位为0,将其取补码后,再除上16(浮点除法),就是实测的温度。
3.3 软件主流程
在本温度记录器的设计中,利用LPC2148片上RTC实时时钟提供的秒中断、分中断、天中断功能实现ADT75温度数据的定时采集、存储和文件的建立。
当RTC的秒中断时,LPC2148通过I2C总线在400 kHz的速率下读取ADT75的温度数据,并将温度数据存于LPC2148内部RAM中。为了便于用户使用读卡器在PC机上读取存入的温度数据,每秒钟存入RAM中的数据为22字节,且均为ASCII字符,数据格式如表3所列。
表3 存储数据格式
其中前4个字节为温度的实时采集时间,存储的时间内容为时、分、秒。第1个温度数据采用十六进制表示;第2个8字节的温度数据为转换后的实际温度值,每条记录均以回车(ASCII码为0x0D)、换行(ASCII码为0x0A)结束。例如,在12时0分59秒采集的温度数据为0x1910,则存入RAM中的数据为"120059 1910+025.625<CR><LF>"。
当RTC的分中断时,LPC2148将临时存于RAM中的数据存入SD卡中。这样可减少对SD卡的写操作次数,延长SD卡的使用寿命。
当RTC的天中断时,LPC2148将在SD卡上新建一个新的记事本文件(.txt文件),文件名即为当天的日期,例如2007年10月6日建立的文件名为"071006.txt"。由于每分钟写入SD卡的数据为22×60=1 320字节,因此每个文件的最大容量是1 856 KB。对于一张512 MB的SD卡,可保存约1年的温度数据。
图4描述了本设计的软件主流程。在实现温度数据的采集与存储之前,需正确配置LPC2148的SPI总线控制寄存器、I2C控制寄存器及RTC实时时钟寄存器。
- 基于FAT16文件系统的嵌入式温度记录器设计方案(05-18)