微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于单片机的SD卡FAT文件系统读写设计

基于单片机的SD卡FAT文件系统读写设计

时间:11-18 来源:互联网 点击:

随着信息技术的飞速发展,高容量存储芯片日益向大容量小体积发展,其中以SD卡、Micro SD卡为突出代表。SD卡由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制。大小犹如一张邮票的SD卡,重量只有2 g,却拥有高记忆容量、快速数据传输率、极大的移动灵
活性以及很好的安全性。通过单片机处理SD卡信息,可以将信息化嵌入式产业向更小体积发展。考虑到稳定性与读取速度,研究中采用了Fr-eescale公司的16位单片机MC9S12XSl28MAA。为了进一步满足嵌入式研究的实时调试与应用需要,把SD卡的读取以及FATl6文件系统的读取写入移植到此单片机中,使开发应用有更好的扩展性。本文首次把FATl6文件系统的读取移植到HCSl2X单片机上,并通过HCSl2X单片机的SPI模块进行SD卡的读写,取得了良好的效果。

1 研究平台和设计思想
1.1 平台介绍
①MCS9S12XSl28MAA:Freescale公司16位单片机HCSl2X家族中的一员,相比于其他HCSl2X单片机,去除了XGATE协处理器,大大降低了成本。此单片机内嵌了许多资源,包括128KB Flash、4 KB EEPROM、16 KBROM以及多种通信接口。
②Micro SD卡:采用SD架构设计而成,尺寸几乎只有一片指甲盖大小,由摩托罗拉公司与SanDisk公司共同研发,是一种超小型卡(11 mm×15 mm×1 ram),约为SD卡的1/4。它支持3种传输模式,SPI模式(独立序列输入和序列输出),1位SD模式(独立指令和数据通道,独有的
传输格式),以及4位SD模式(使用额外的引脚以及某些重新设置的引脚,支持4位宽的并行传输)。
③CodeWarrior:Freescale公司开发的编程环境。本文使用的CodeWarrior Special 5.0 For S12(X)是专门针对HCSl2X单片机开发的,可以进行程序的编辑、编译、链接和在线调试等多项功能,支持在C语言中嵌入汇编语言。
④移植条件:对于本文中的SD卡读取与写入,用户的单片机推荐使用HCSl2X系列,也可使用HCSl2系列,但总线超频会不稳定,从而影响SD卡读写速率以及稳定性。
1.2 设计思想
图1显示了本文中所使用的SD卡FAT文件系统通过MC9S12XSl28MAA进行解析的软硬件结构体系。编译链接软件使用CodeWarrior 5.O,硬件采用MC9S12XSl28MAA单片机与Kingston公司的Micro SD卡。代码由4部分组成:用户应用部分(由用户编写控制,本文使用MC9S12XS128MAA SCI串口模块进行信息调试),FAT文件系统读取解析部分,硬件控制部分(通过单片机SPI模块与SD卡连接),以及单片机CPU的初始化部分。其中,SPI模块与SD卡连接的硬件控制部分,以及FAT文件系统的读取解析部分是本文的重点。


其中,Sd_SPI.h是关于SD卡读取写入部分的一些宏定义、常量和函数的声明;Sd_SPI.c包括了通过SPI模块读写SD卡的代码;Fat.h是关于Fat文件系统解析的全局变量、宏定义以及函数声明;Fat.c包括了Fat文件系统解析的代码;SimpleFat.c是简易读取Fat文件系统信息的代码;SimpleFat.h是其全局变量以及函数的声明。

2 硬件设计
SD卡有2种操作模式:SD卡模式、SPI模式。SD卡模式允许通过4线高速总线传输,但由于大部分单片机无此接口模块,故选择SPI模式。HCSl2X系列单片机内部都带有此同步串行外部设备接口(Serial Peripheral Interface,SPI)。单片机可以通过SPI系统组成一个通信速率比SCI高的同步网络,故使用SPI模式可以把外设减少到最低。SPI模式相对于SD卡模式的缺点是损失了传输速度;但是目前的微处理器的处理速度越来越高,利用SPI模式大都能满足工程需要。
HCSl2X单片机的全双工8位SPI模块有4个引脚,分别为主入从出引脚MISO、主入从出引脚MOSI、串行时钟引脚SCK以及从机片选引脚SS。当CS信号线为低电平时,主机开始所有的总线传输。数据从单片机的MOSI引脚同步输入Micro SD卡的DA引脚,Micro SD卡返回数据由DO线同步输入单片机的MISO引脚,数据在CLK信号的上升沿同步输入和输出。

3 软件设计
3.1 HCSl2X总线时钟超频
MC9S12XSl28MAA默认总线时钟默认同外接晶振相关,但可以通过配置PLL锁相环实现单片机总线超频,从而加快SD卡读取速率。实验中可通过下列代码将单片机总线频率超频到80MHz:



3.2 HCSl2XSPl模块初始化
MC9S12XSl28MAA单片机包含2个串行外设接口SPI,可以很方便地实现对Micro SD卡接口的数据传输。为了配置时钟和数据长度,需要对SPI控制寄存器(SPCRl和SPICR2)、SPI波特率寄存器SPIBR和SPI数据寄存器SPIDR进行设置:使能SPI模块,将SPICRl中的MSTR位置1使单片机工作在主机模式,产生串行时钟来同步主从双方的移位寄存器,配置SPI时钟极性位与SPI时钟相位控制位,使能从机输出选择;初始化SPI波特率寄存器。
3.3 SD卡初始化
SD卡初始数据传输需工作在低于400 kb/s的频率,因此配置SPI波特率寄存器,以工作在低速模式下。片选信号后应延时至少74个时钟周期。SD卡默认缺省使用SD总线传输协议,主机需要发出命令CMDO(CMD_GO_IDLE_STATE)才能使SD卡工作在SPI传输模式下,当单片机返回0x 01时说明已经进入了IDLE状态。此时应循环发送CMD55+ACMD41以确认是否为SD卡,如果回应超时则发送CMDl(CMD_SEND_OP_COND)以确认是否为MMC卡。经实验发现,Kingston公司的Micro SD卡使用CMD55+ACMD41或者CMDl都可以进行激活。激活SD卡的SPI模式后SD卡进入准备状态,此时发送CMDl6(CMD_SET_BLOCKLEN)设置SD卡的读写块大小,然后重新配置SPI波特率寄存器SPIBR使单片机SPI工作在高速频率下,延时8个时钟周期后返回,完成SD卡初始化。图2为SD卡SPI高速模式初始化流程。

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

网站地图

Top