新闻中心

EEPW首页>EDA/PCB>设计应用> 基于SoPC和NIOS II的SD卡文件系统的设计

基于SoPC和NIOS II的SD卡文件系统的设计

作者: 时间:2013-04-22 来源:网络 收藏

2 驱动程序的设计
SD卡处于SPI模式的驱动主要包含有:
(1)SPI底层的操作,SPI的命令和数据块都是以8个比特为单位进行分组和发送的。
(2)关于CMD的操作,主要有SD卡的初始化以及SD卡的读写,先发送命令然后再发送CRC校验。
(3)CRC校验使用Ⅱ来解决这个问题:Ⅱ软件架构建立在硬件抽象层HAL(Hardware Abstraction Layer)之上,HAL为软件开发者提供了编程接口、底层的设备驱动、HAL API、和C标准库等资源,表1为系统整体的架构示意。

本文引用地址://m.amcfsurvey.com/article/189630.htm

d.JPG


HAL的系统库为NIOSⅡ软件设计人员提供了应用程序与底层硬件交互的设备驱动接口,简化了应用程序的开发。HAL系统库也为应用程序与底层硬件驱动划分了一条清晰的分界线,提高了应用程序的复用性,使得应用程序不受底层硬件变化的影响。
SD卡的上电初始化过程可以分成以下5个步骤:
(1)适当延时等待SD就绪;
(2)发送74+个spi_clk,且保持spi_cs_n=1 spi_mosi=1;
(3)发送CMD0命令并等待响应R1=8’H01,将卡复位到IDLE;
(4)发送CMD1命令并等待响应R1=8’H00,激活卡的初始化进程;
(5)发送CMD16命令并等待响应R1=8’H00,设置一次读写BLOCK的长度。
SD卡的数据读取操作也大致可以分为以下步骤:
(1)发送命令CMD17;
(2)接受读数据起始令牌0xFE;
(3)读取512 B数据以及2 B的CRC。
借助于NIOSⅡ可以软件编写最底层的SPI操作函数来实现上述复杂的步骤:
extern INT8U SPI Sendbvte(INT8U data)
extern INT8U SPI_Recibyte(void)
上面分别是SPI发送1 B以及接收1 B,这2个函数的使用需要调用中的SPI核中的库函数,然后是SD卡的初始化和读写函数:
初始化: extern int SD_Reset(void);
读一扇区:extern inI SD_ReadBlock(INT32Ublockaddr,INT8U*recibuf);
写一扇区:extern int SD_WriteBlock(INT32Ublockaddr,INT8U*sendbuf);
通过这些代码,可以一步步的向SD卡发送CMD指令,使其复位,激活成SPI模式,并设置块大小为512 B。

3 文件系统的设计
若读写操作都是以扇区为单位,SD卡仅相当于FLASH。为了管理SD卡中的数据,并方便在Windows系统中访问SD卡中的数据,就必须将SD卡中的数据有效组织起来,以文件的形式进行存储和访问,可以给SD卡创建一个文件系统,常见的是微软公司推出的FAT16和进化版FAT32。
FAT存储原理:FAT16由6部分组成,首先是引导扇区(DBR),引导扇区(DBR)即操作系统引导记录区,通常占用分区的第0扇区共512 B。在512 B中,又由跳转指令、厂商标志、操作系统版本号、BPB、扩展BPB、OS引导程序、结束标志几部分组成。如图3所示,根文件夹紧跟着的是FAT表(FAT1,FAT2,FAT2是FAT1的备份),FAT表是FAT16文件系统用来记录磁盘数据簇链结构的,FAT中磁盘空间按照一定数目的扇区为最单位进行划分,这种单位称为簇,一般每扇区分为512 B,而簇的大小是2n(n为整数)个扇区,所以簇的大小一般是512 B,1 KB,2 KB,4 KB等,一般不超过32 KB。以簇为单位的原因是扇区太小,如果用扇区的话对大文件的存取会消耗很多资源,增加FAT表的项数,这样文件系统的效率就非常低。

e.JPG


文件系统本质上就是把上层对文件的操作转换为底层对数据簇的操作(例如初始化,读扇区,写扇区等)。
本文中最底层的2个函数如下:
f.JPG



评论


相关推荐

技术专区

关闭