页面加载中,请稍候
来源:电子设计工程发布时间:2010-11-12
询问 AI摘要:基于HCSl2X单片机SPI模块读取Micro SD卡与SD卡,并解析SD卡上FAT文件系统以实现文件的读取与写入。测试证明,系统对FAT文件系统的读取稳定,误差小,速度较快。使用HCSl2X类单片机对SD卡进行读取,在汽车智能设计和单片机调试方面有较高的应用价值。
关键词:HCSl2X单片机;SPI模块;SD卡;Micro SD卡;FAT文件系统
随着信息技术的飞速发展,高容量存储芯片日益向大容量小体积发展,其中以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文件系统的读取解析部分是本文的重点。
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:
[!--empirenews.page--]
3.4读写单块数据
SD卡单块数据的读取是先通过单片机发送CMDl7(CMD_READ_SINGLE_BLOCK)命令,以SD卡指定数据块起始位地址作为参数,如果读取成功SD卡会返回1个R1命令作为响应。然后发送1个起始数据命令,接着发送单块字节数量的数据并接收SPI数据寄存器SPIDR中的数据,最后是2字节CRC校验。
3.6 应用层函数接口
FAT文件系统向应用层设计了如下几个初级程序接口:Get Filelnfo(UINT8*F Info,FileInfo*TempFilelnfo)(获取文件信息),OutPut _RootFileinfo(void)(输出根目录文件信息),DirOr(UINT8 FileAttrib)(判断目录),Get Next Cluster(UINTl6 TempCluster)(获取下一文件簇信息),OutPutFileCluster(UINTl6 TempStart Cluster)(输出文件簇地址),OutPutFile(UINTl6 Temp StartCluster)(输出文件内容),ShowClusterContent(UINTl6 TempCluster)(输出簇内容)。通过这些初级程序接口实现了OpenDir(UINTl6 TempStartCluster)(目录打开),FileDelete(文件删除),FileDataRead(文件数据读取),FileCreate(UINTl6 TempStartCluster,UINT32TempFileLength)(文件创建)等功能。
3.6.1 目录读取及文件信息获取
FAT文件系统的具体文件和目录项都是通过读取ROOT目录来进行查找的,所以FAT的文件排布是以树形的结构排布。对于FAT来说,目录项与文件项在同一目录中是同样占32个字节的属性项。研究中使用了1个数据结构Filelnfo来存储文件信息,并通过if(Temp_F_Info[0x0b]&0x l0)来分辨文件与目录。
在FAT文件系统中,文件是以簇的形式保存在SD卡中的,簇的排布是不连续的,1个文件如果大于1个簇的话,则要通过FAT表来查找该文件所有簇所在的位置,从而找到整个文件。目录一般只占有1个簇的大小,在FAT表中等同于小于1个簇的小文件,值显示为FF。
目录是以文件的形式存储在父目录中的,目录中的文件信息记录了该文件的起始簇以及文件的大小,知道了文件的起始簇,通过FAT表中的信息可以很方便地找到文件的下一个簇的位置,并由文件的大小判断出文件的结束位置。
3.6.2 文件的读写
在FAT文件系统中,读取文件只需要知道该文件的起始簇以及大小便可以很方便地得到整个文件的信息。读取步骤是:获取根目录信息,通过根目录信息找到下一层目录所在簇位置,通过下一层目录信息递归找到文件所在目录,读取文件信息属性,得到文件的起始簇位置和文件大小,通过FAT表递归查找到文件的全部簇地址,最终以FF结尾;根据文件大小判断文件的结束位置,最后输出整个文件。
文件的创建和写入则是通过FAT表查找未被使用的空簇(值为00),写满1簇之后再查找下一未被使用的空簇,并同时更新FAT1表和FAT2表。然后在文件所被创建的目录信息中添加文件信息,最终实现文件的创建。
3.6.3 文件的删除
在FAT文件系统中,对文件的删除不需要把整个文件信息全部清除,只需要清除FAT表中的文件簇信息以及目录中的文件信息,避免了对SD卡的频繁读写,同时也节省了时间。
结语
本设计将SD卡的存储方式应用到单片机系统中,简化了复杂的文件数据的存储设计,减小了系统的尺寸,提高了系统的可靠性,使得单片机对文件的读出和存取简单易行。对FAT裁减实现了嵌入式文件系统,提高了系统的存储能力,同时也增强了单片机与PC级之间的通信能力,简化了繁琐的调试。采用Freescale 16位单片机MC9S12XSl28MAA的串行外设接口SPI对SD卡进行访问,加快了整个系统的设计进度。实践证明,该设计读写SD卡文件信息的速度以及稳定性满足调试要求。该设计只需对底层驱动进行简单修改就可直接应用于MMC卡、Micro SD卡等其他存储介质上。
新闻来源:电子设计工程,文中所述为作者独立观点,不代表icspec立场。更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj。
暂无评论哦,快来评论一下吧!
2026-06-24
2026-07-21