基于MSP430F5438和FatFs嵌入式文件系统的实现

2011-01-04 02:07路敦强吴晓荣
关键词:卡座存储介质嵌入式

路敦强,吴晓荣

(天津师范大学 物理与电子信息学院,天津 300387)

基于MSP430F5438和FatFs嵌入式文件系统的实现

路敦强,吴晓荣

(天津师范大学 物理与电子信息学院,天津 300387)

以TI公司的MSP430F5438为控制核心,移植了开源免费的FatFs,详细介绍了移植的过程,给出必要的移植代码,在SD卡上实现了FAT文件系统.

文件系统;FatFs;MSP430;SD卡

随着电子信息技术的发展,越来越多的嵌入式系统需要对大容量的数据进行读取和存储.传统的利用非易失性存储器(FALSH和EEPROM等)按地址和字节读写的方法日益不能满足实际应用的需求[1].而利用嵌入式的文件系统管理存储介质和数据,不仅灵活易用,而且能与通用的操作系统平台用文件直接交换数据.在一些需要PC接收处理数据的应用上,如果在SD卡或U盘用嵌入式的文件系统读写数据,既省去了以往常用的通信接口设计(如串口和USB口等)和通信协议的制定,又可以避免上位机软件的开发.此外,采用嵌入式的文件系统避免了嵌入通用的操作系统,降低了对硬件的要求和成本.因此,利用嵌入式的文件系统管理存储介质成为一种趋势.

常用的文件系统有FAT16,FAT32,NTFS,Ext,Ext2和HPFS等,由于微软Windows系统的广泛使用,其中以FAT16和FAT32最为通用.支持FAT格式且开源、免费的有EFSL和FatFs两种,而FatFs在较大文件的读写上更具效率,因此本研究采用FatFs.存储介质可以选用U盘或SD卡,使用U盘还需专用的USB芯片,为简单起见,本研究选择SD卡.

1 FatFs简介

FatFs是一个专为小型嵌入式系统设计的开源免费的FAT文件系统[2].它完全由ANSI C编写,且完全独立于存储介质的读写I/O,所以不需修改就可以移植到各种硬件平台上,现在已经成功移植到AVR,PIC和ARM等低成本的微控制器上.FatFs主要具有以下特性:(1)兼容FAT12,FAT16和FAT32文件系统;(2)ANSI C编写,不受应用平台限制,易于移植;(3)只需要很少的代码空间和数据空间;(4)多样的配置选项:多种存储媒介支持、长文件名支持、RTOS支持、可配置为只读和最小化API等.FatFs是一个不断更新完善的软件,其源码和使用说明等信息可以在其官方主页上下载[2].

FatFs具有良好的层次结构,方便在不同的平台上移植,如图1所示.

图1 FatFs的分层结构Figure 1 Divided layers structure of FatFs

FatFs共分3层.最顶层是应用层,提供了一系列的应用函数,如f_open,f_close,f_read,f_write和f_mkdir等,可以直接读写文件或文件夹,而使用者不需知道复杂的FAT协议和FatFs内部复杂的函数.中间层FatFs实现了FAT文件读/写协议.底层是存储介质读写I/O,移植者只需要编写6个接口函数即可,如块读函数和块写函数等.

2 系统硬件设计

微控制单元(Micro Control Unit,MCU)选用TI公司的MSP430F5438,它是一个16位的超低功耗单片机,具有256KB闪存、16KB RAM、12位ADC、4个USCI和32位HW乘法器,最高工作频率是18MHz[3].其中4个USCI可以配置为SPI,UART和I2C中的任意一种,在与SD卡相连时配置为SPI模式.

MSP430F5438与SD卡的连接如图2所示.

图2 MSP430F5438与SD卡的连接原理图Figure 2 Schematic of MSP430F5438connected with SD card

SD卡可以采用SD总线访问,也可以采用SPI总线访问[4],考虑到MSP430F5438只有SPI总线接口,所以直接用SPI1(P5.5_UCB1CLK,P5.4_UCB1SOMI,P3.7_UCB1SIMO 和 P3.6_UCB1STE)与SD卡相连.

卡供电模式采用可控方式[5],这样在SD卡进入不确定状态时,可以通过对卡重新上电使卡复位,而无需拔出卡.可控电路采用P型MOS管2SJ355,由MCU的P4.7控制.当P4.7输出高电平时,2SJ355关断,不给卡供电;当P4.7输出低电平时,2SJ355开通,给SD卡供电.

卡检测电路包括2部分:卡是否完全插到卡座中和卡是否写保护.检测信号由卡座的2个引脚以电平方式输出.当卡插入到卡座并插入到位时,由于卡座内部的触点连接到地线,P4.6为低电平;当卡拔出时,该引脚被拉为高电平.卡是否写保护的检测原理与卡是否完全插入到卡座中的检测原理相同.

3 FatFs的移植

FatFs的最新版本是 R0.08版.下载到的FatFs主程序包括5个文件:ffconf.h,ff.h,ff.c,diskio.h和integer.h.在实际的使用过程中移植者需要添加1个diskio.c文件,与diskio.h构成底层的硬件I/O.ff.h和ff.c是FatFs主要的应用函数,向上层提供的API函数都包含在里面.ffconf.h主要对FatFs配置和裁减.integer.h定义了FatFs使用的数据类型,本次移植使用的软件平台是IAR4.11B,需要对integer.h内定义的数据类型作一定的修改.

3.1 配置MCU的SPI口

本研究要把MSP430F5438的USCI1配置成SPI模式.具体配置为8位主机模式,数据高位在前.代码如下:

配置之后USCI1就可以以SPI的方式通信.

3.2 编写SPI操作函数和SD卡的命令层函数

SPI操作函数主要有通过SPI口写1个字节、读1个字节、片选SPI从机和修改SPI时钟等.SPI通信时不以中断形式运行,而是以查询相关寄存器状态位的方式完成读写.

用SPI方式写1个字节:

在SPI操作函数的基础上就可以实现SD的命令层函数,主要有向SD卡发送1个命令、读SD卡内部寄存器、复位SD卡、块命令和CRC校验等.此外,还需要几个辅助函数,如检测SD卡是否插到位和是否写保护等.

3.3 编写SD卡的API函数

SD的API函数由FatFs的硬件层调用,实现FatFs的disk I/O.SD的API函数主要由初始化SD卡、读多个块和写多个块等构成.具体函数形式如下:

3.4 编写diskio.c

最新的FatFs R0.08版本中没有diskio.c,需要移植者添加到工程项目中.diskio.c有6个接口函数:disk_initialize,disk_status,disk_read,disk_write,disk_ioctl和get_fattime.它们分别实现了存储介质初始化、状态读取、介质读、介质写、介质控制和获取时钟的功能.

(1)DSTATUS disk_initialize(BYTE Drive);

存储媒介初始化函数.入口参数Drive是存储媒介编号,因为系统中只有1个SD卡,Drive为0即可.函数实体内调用已经编写好的SD卡API函数中的初始化SD卡函数SD_Initialize即可.

(2)DSTATUS disk_status(BYTE Drive);

状态检测函数.检测存储媒介是否存在、初始化及写保护.在本设计中只要检测到SD卡已经插到位、初始化且没有写保护返回0即可.SD没有初始化则返回1,没有SD卡返回2,SD卡写保护返回4.

(3)DRESULT disk_read(BYTE Drive,BYTE*Buffer,DWORD SectorNumber,BYTE SectorCount);

读多块函数.*Buffer是读取缓存,SectorN-umber是起始块号,SectorCount是要读取的块的个数.函数实体内调用SD卡API函数SD_Read-MultiBlock即可.读取正确返回0,错误返回非0.

(4)DRESULT disk_write(BYTE Drive,const BYTE*Buffer,DWORD SectorNumber,BYTE SectorCount);

写多块函数.*Buffer是写缓存,SectorNumber是起始块号,SectorCount是要写的块的个数.函数实体内调用SD卡API函数SD_Write-MultiBlock即可.写正确返回0,错误返回非0.

(5)DRESULT disk_ioctl(BYTE Drive,BYTE Command,void*Buffer);

存储媒介控制函数.Command是控制代码,*Buffer是接收数据缓存.在此没有使用本函数,直接返回0.

(6)DWORD get_fattime(void);

获取实时时钟函数.获得的数据作为文件或文件夹的修改建立时间.硬件中没有加入实时时钟,直接返回一个常数即可,不影响使用.

编写完以上6个函数,FatFs的移植就基本完成了.

4 FatFs的配置和使用

4.1 FatFs的配置

从FatFs的R0.07e版开始,需要对FatFs配置的选项从ff.h分离出来,成为1个单独的文件ffconf.h.

ffconf.h中提供了丰富的配置选项,移植者可以根据硬件资源的多少和需要使用的功能进行配置,从而达到优化设计的目的.ffconf.h主要的配置选项如下:

(1)_FS_TINY.如果_FS_TINY配置为1,那么文件系统和物理介质共用1个物理缓存,不再针对每个开启的文件建立单独的512字节的缓存,这样可以节省大量的RAM空间,使FatFs更容易嵌入在资源较少的微控制器上.

(2)_FS_READONLY.其值为1时可以将FatFs配置为只读文件系统,涉及写功能的函数在编译时将被忽略,减少占用的代码空间.

(3)_FS_MINIMIZE._FS_MINIMIZE用于裁减FatFs提供的API函数,其值可以为0~3,0为最大模式,保留所有API函数,3为最小模式.

(4)_USE_STRFUNC.其值为0时表示不使用字符串功能,为1或2时表示使用.

(5)_USE_MKFS.其值为1时使能f_mkfs函数,即在存储媒介上创建新文件系统的功能.

(6)_USE_LFN.其值为1~3时使能长文件名支持,值为0时不使能.使能长文件名会增加1个几十KB以上的转换表,占用大量代码空间,建议不使用.

此外,还有其他一些配置选项在ffconf.h中都有详细说明.灵活的配置选项增加了移植者的选择,移植者可以根据具体的使用情况调整相关选项,在功能的多少和代码的简洁性之间找到平衡.

4.2 FatFs的使用

FatFs共提供了多达26个应用函数,可以实现创建、删除和读取文件夹,创建、删除和读写文件,移动文件指针以及改变文件内容和大小等功能,表1列示了这些函数的名称和功能.

表1 FatFs提供的应用函数Table 1 Application function FatFs provided

具体使用方法上,必须先用f_mount函数注册1个工作区,即开辟1个内存空间.然后依次使用f_open,f_read/f_write和f_close即可完成基本的文件读写功能.下面的代码是在SD卡上建立1个名为test.dat的文件,并向其写入1段字符的示例:

5 结语

FatFs专为小型嵌入式系统设计,独立于硬件平台,只需要编写几个接口函数就可完成移植,并可以灵活配置.本研究以MSP430F5438微控制器为核心,以SD卡作为存储媒介,移植了FatFs,实现了用单片机对文件/文件夹进行读写等功能.经过测试,在16MHz的系统时钟下,系统读速率约为300KB/s,写速率约为100KB/s,满足了一般系统的应用需求.在一些不需要数据实时传输或数据量比较大的嵌入式系统中,嵌入FatFs文件系统并以SD卡作为存储媒介存储管理数据会非常方便灵活,同时有利于降低成本,具有较为广阔的应用前景.

[1] 洪岳炜,王百鸣,谢超英.一种易于移植和使用的文件系统FatFs Module[J].单 片 机 与 嵌 入 式 系 统 应 用,2008(5):29-31.

[2] Cha N.FatFs generic FAT file system module[EB/OL].[2010-09-10].http://elm-chan.org/fsw/ff/ooindex_e.html.

[3] Texas Instruments Corporation.MSP430×5xx1/MSP430x6xx family user'sguide[EB/OL].[2009-09-10].http://focus.ti.com.cn/cn/docs/prod/folders/print/msp430f5438.html.

[4] SD Gruop.SD Memory Card Specification Part1:Physical Layer Specification v2.0[EB/OL].[2010-09-10].http://www.sdcard.org/developers/tech/sdcard/pls/simplified_ specs.

[5] 周立功.ARM嵌入式系统实验教程(二)[M].北京:北京航空航天大学出版社,2005:17-18.

Implementation of embedded file system based on MSP430F5438and FatFs

LUDunqiang,WUXiaorong
(College of Physics and Electronic Information Science,Tianjin Normal University,Tianjin 300387,China)

FatFs module which is free and open sourced is incorporated in TI MSP430F5438,and a FAT file system is implemented on SD card.The process of porting FatFs is introduced in detail and the necessary migration code is given.

file system;FatFs;MSP430;SD card

TP368.1;TP316

A

1671-1114(2011)02-0028-04

2010-09-20

路敦强(1986—),男,硕士研究生.

吴晓荣(1956—),男,教授,主要从事电子技术和嵌入式系统方面的研究.

(责任编校 纪翠荣)

猜你喜欢
卡座存储介质嵌入式
Focal&Naim同框发布1000系列嵌入式扬声器及全新Uniti Atmos流媒体一体机
TS系列红外传感器在嵌入式控制系统中的应用
卡座餐厅 小天地大妙趣
档案馆移动存储介质管理方法探讨
搭建基于Qt的嵌入式开发平台
一种使用存储介质驱动的方式
卡座入驻先美食再美景
倍福 CX8091嵌入式控制器
医院环境下移动存储介质的信息安全管理
释放一段时间给心灵