基于SoPC的SD卡文件系统的设计
命令并等待响应R1=8‘H01,将卡复位到IDLE;(4)发送CMD1命令并等待响应R1=8’H00,激活卡的初始化进程;(5)发送CMD16命令并等待响应R1=8‘H00,设置一次读写BLOCK的长度。
SD卡的数据读取操作也大致可以分为以下步骤:(1)发送命令CMD17;(2)接受读数据起始令牌0xFE;(3)读取512B数据以及2B的CRC.借助于NIOSⅡ可以软件编写最底层的SPI操作函数来实现上述复杂的步骤:
externINT8USPI_Sendbyte(INT8Udata)
externINT8USPI_Recibyte(void)
上面分别是SPI发送1B以及接收1B,这2个函数的使用需要调用SoPC中的SPI核中的库函数,然后是SD卡的初始化和读写函数:初始化:externintSD_Reset(void);读一扇区:externintSD_ReadBlock(INT32U blockaddr,INT8U*recibuf);写一扇区:externintSD_WriteBlock(INT32U blockaddr,INT8U*sendbuf);通过这些代码,可以一步步的向SD卡发送CMD指令,使其复位,激活成SPI模式,并设置块大小为512B.
3 文件系统的设计
若读写操作都是以扇区为单位,SD卡仅相当于FLASH.为了管理SD卡中的数据,并方便在Windows系统中访问SD卡中的数据,就必须将SD卡中的数据有效组织起来,以文件的形式进行存储和访问,可以给SD卡创建一个文件系统,常见的是微软公司推出的FAT16和进化版FAT32. FAT存储原理[7-8]:FAT16由6部分组成,首先是引导扇区(DBR),引导扇区(DBR)即操作系统引导记录区,通常占用分区的第0扇区共512B.在512B中,又由跳转指令、厂商标志、操作系统版本号、BPB、扩展BPB、OS引导程序、结束标志几部分组成。如图3所示[9],根文件夹紧跟着的是FAT表(FAT1,FAT2,FAT2是FAT1的备份),FAT表是FAT16文件系统用来记录磁盘数据簇链结构的,FAT中磁盘空间按照一定数目的扇区为最单位进行划分,这种单位称为簇,一般每扇区分为512B,而簇的大小是2n(n为整数)个扇区,所以簇的大小一般是512B,1KB,2KB,4KB等,一般不超过32KB.以簇为单位的原因是扇区太小,如果用扇区的话对大文件的存取会消耗很多资源,增加FAT表的项数,这样文件系统的效率就非常低。
引导扇区根文件夹FAT1FAT2其他文件系统本质上就是把上层对文件的操作转换为底层对数据簇的操作(例如初始化,读扇区,写扇区等)。
图3 FAT结构
本文中最底层的2个函数如下:FAT_ReadSector,FAT_WriteSector文件系统目录的数据结构如下:typedefstruct{charName[8];charExtension[3];charAttribute;charreserved[2];unsignedshortCreateTime;unsignedshortCreateDate;unsignedshortLastAccessDate;unsignedshortLastWriteTime;unsignedshortLastWriteDate;unsignedshortFirstLogicalCluster;unsignedintFileSize;}FAT_DIRECTORY;对底层函数进行调用的应用层函数有:FAT_Init(初始化函数)
FAT_GetSize(获取磁盘大小)
FAT_Open_File(打开文件)
FAT_Read_File(读文件)
FAT_Create_Dir(新建文件夹)
FAT_Create_File(新建文件)
FAT_Dele_File(删除文件)
有了这些底层函数和API函数后,要对SD卡进行操作只需要在NIOS的顶层main.C文件里面调用这些函数。用软件的方法完成顺序执行的操作,而这正是硬件执行的软肋。下面列出main函数核心的代码:while(1){printf("。。。。。。\r\n");hfat=fat_mount(SD_CARD,0);if(hFat){printf("SD卡加载成功!\n");printf("读取根目录:\n");fat_test(hfat,"test.txt");fat_Unmount(hFat);printf("测试完成。重试请按KEY键\r\n");}else{printf("无法加载SD卡,请仔细检查是否插入并按KEY键重试\r\n");}while((IORD_ALTERA_AVALON_PIO_DATA(KEY_BASE)&0x08)==0x08);usleep(300*1000);}测试:在一张SD卡里存放了一个test.txt文件,插到开发板的SD卡槽里。最后的图4是NIOS控制台最终的运行结果,程序正确的显示出了卡里面的文件夹和文件,以及test.txt里面的文件内容,验证了本系统可以正确运行。
图4 NIOSⅡ运行结果
4结语
本设计基于SoPC以NIOSⅡ软核处理器为控制核心,根据标准的FAT32文件系统规范,完成了对SD卡的基础操作。该设计虽比硬件读取占用稍稍多点的资源,但是方便了开发者对嵌入式设备外设的操作和移植,有非常实际的可操作性和应用。
Nios II SPI SD卡 SoPC 嵌入式 相关文章:
- 基于FPGA的8段数码管动态显示IP核设计(02-03)
- 基于Nios II与FPS200的半导体指纹采集系统设计(04-11)
- 基于NiosII的智能多接口片上系统设计(09-18)
- 基于SOPC和DDS IP核的可重构信号源设计与实现(11-03)
- FPGA核心知识详解(3):那些让FPGA初学者纠结的仿真(11-28)
- 基于Nios软核的嵌入式Internet系统设计(07-23)