CN102436428A - 基于fpga的sd卡文件管理控制器 - Google Patents
基于fpga的sd卡文件管理控制器 Download PDFInfo
- Publication number
- CN102436428A CN102436428A CN2011103579366A CN201110357936A CN102436428A CN 102436428 A CN102436428 A CN 102436428A CN 2011103579366 A CN2011103579366 A CN 2011103579366A CN 201110357936 A CN201110357936 A CN 201110357936A CN 102436428 A CN102436428 A CN 102436428A
- Authority
- CN
- China
- Prior art keywords
- card
- command
- file
- data
- register
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 230000004044 response Effects 0.000 claims abstract description 5
- 230000003139 buffering effect Effects 0.000 claims description 3
- 238000002054 transplantation Methods 0.000 abstract description 2
- 238000007726 management method Methods 0.000 description 23
- 238000012986 modification Methods 0.000 description 9
- 230000004048 modification Effects 0.000 description 9
- 238000012360 testing method Methods 0.000 description 8
- VLCQZHSMCYCDJL-UHFFFAOYSA-N tribenuron methyl Chemical compound COC(=O)C1=CC=CC=C1S(=O)(=O)NC(=O)N(C)C1=NC(C)=NC(OC)=N1 VLCQZHSMCYCDJL-UHFFFAOYSA-N 0.000 description 6
- 238000010586 diagram Methods 0.000 description 5
- 230000006870 function Effects 0.000 description 4
- 238000000034 method Methods 0.000 description 4
- 230000007547 defect Effects 0.000 description 2
- 238000012545 processing Methods 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 238000013524 data verification Methods 0.000 description 1
- 230000007812 deficiency Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000007689 inspection Methods 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 230000001360 synchronised effect Effects 0.000 description 1
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种基于FPGA的SD卡文件管理控制器,包括FPGA芯片、串行配置芯片、SDRAM存储器、主控器接口、SD卡插座、FAT32文件管理单元、SD卡接口单元;FAT32文件管理单元为主控器提供主控器接口、操作文件系统的用户命令,主控器通过该接口在SD卡文件管理控制器的寄存器中写入用户命令;SD卡接口单元在FAT32文件管理单元的控制下,负责SD卡命令的产生和应答接收,以及SD卡中数据的读写;该发明能解决SD卡接口控制装置接口通用性差、移植困难,操作接口复杂、使用不方便,读写SD卡的速度慢等问题,提供了一种通用性强、操作接口方便、能高速读写SD卡的文件管理控制器。
Description
技术领域
本发明涉及一种对SD接口卡进行控制的装置,具体涉及一种基于FPGA的SD卡文件管理控制器。
背景技术
SD卡(Secure Digital Memory Card)是一种基于半导体闪存工艺的存储卡,1999年,由日本松下、东芝及美国SanDisk公司共同研制完成。当前,人们对大数据量的高速存储需求越来越高。SD卡作为新一代数据存储设备,具有体积小、容量高、数据传输速率快、移动灵活性好以及安全性高等特点,很好地满足了市场的具体需求,被广泛用于便携式消费类电子设备和工业控制领域中。
SD卡中的数据是以块为单位进行存储的,但是为了更有效地组织和管理SD卡中的数据,必须采用文件的格式组织数据。目前,SD卡一般采用FAT32文件系统。
面对人们对大数据量的高速存储需求,目前市场上的SD卡接口控制装置存在着明显的缺陷:1.读写SD卡的速度慢。目前的SD卡接口控制器大多采用了SD卡的SPI模式或者1位的SD模式读写SD卡,而很少采用4位数据线的SD模式,即使采用了4位的SD模式,由于控制装置内的缓冲区小、很多处理模块非硬件实现等原因导致读写的速度不高。2.提供的操作接口复杂,使用不方便。目前的SD卡接口控制装置没有提供便捷的SD卡文件管理的功能,用户需要对SD卡底层的物理规范协议很熟悉才能通过控制装置完成对SD卡的操作。3.提供的接口不通用,移植性差。目前的SD卡接口控制装置提供给用户的接口很少采用标准的总线,大多是针对特定的应用而开发的,因而导致了移植困难,通用性差。
发明内容
本发明的目的是克服现有技术中的不足之处,提供一种基于FPGA的SD卡文件管理控制器。
本发明是通过下述技术方案实现的。
基于FPGA的SD卡文件管理控制器,包括FPGA芯片、串行配置芯片、SDRAM存储器、主控器接口、SD卡插座,其中在FPGA内部实现FAT32文件管理单元和SD卡接口单元;
FAT32文件管理单元为主控器提供主控器接口、操作文件系统的用户命令,主控器通过该接口在SD卡文件管理控制器的寄存器中写入用户命令即可完成对SD卡中FAT32文件系统的管理;
SD卡接口单元在FAT32文件管理单元的控制下,负责SD卡命令的产生和应答接收,以及SD卡中数据的读写;
在读写SD卡中的数据时,采用了4位数据线宽的SD模式;
所述的FAT32文件管理单元包括:NIOS II处理器、EPCS控制模块、SDRAM控制模块、主控器接口模块、Avalon总线、Avalon接口模块;
所述NIOS II处理器通过主控器接口模块获取主控器输入的用户命令与数据,并反馈信息给主控器;
所述NIOS II处理器通过Avalon接口模块与SD卡接口单元进行通信。
所述的FAT32文件管理单元上面移植了FATFS文件系统模块。
所述的SD卡接口单元包括:读写缓冲FIFO模块、 SD卡数据控制模块、SD卡命令控制模块和SD卡时钟控制模块;
所述读写缓冲FIFO模块负责缓存读写SD卡时的数据;
所述SD卡数据控制模块负责DAT线上数据的接收和发送以及数据的校验;
所述SD卡命令控制模块负责控制CMD线上命令发送和回复接收;
所述SD卡时钟控制模块负责控制CLK时钟线的频率,以控制读写SD卡的数据速率。
所述的SD卡接口单元由FPGA内部逻辑资源组成,用硬件电路的方式来实现数据高速接收与发送。
所述的主控器接口为8位地址线、8位数据线、读使能、写使能、中断信号、时钟信号、复位信号和片选信号。
所述操作文件系统的用户命令包括新建、打开、读写、关闭文件,新建、打开、关闭目录,磁盘容量查询、空闲扇区查询、以扇区或字节为单位对文件进行读写。
本发明具有的有益效果是:
1、本发明提供8位地址线ADDR0~ADDR7、8位数据线DATA0~DATA7、读使能RD、写使能WR、中断信号INT、时钟信号CLK、复位信号RESERT和片选信号CS的主控器接口,主控器通过此接口往SD卡文件管理控制器的寄存器中写入特定的用户命令来完成对SD卡中FAT32文件系统的管理。主控器可以很容易和本发明进行连接,操作本发明就像访问同步SRAM存储器一样。解决了传统SD卡接口控制器装置接口不通用,移植性差的缺陷;
2、本发明提供了新建、打开、读写、关闭文件;新建、打开、关闭目录;磁盘容量查询、空闲扇区查询,以扇区或字节为单位对文件进行读写等常用的操作文件系统的用户命令,屏蔽了SD卡中FAT32文件系统的组织形式。用户只需往本发明对应的寄存器中写入既定的用户命令,即可实现上述所有的操作。上述机制使得本发明操作简单,易于使用;
3、本发明为用户屏蔽了SD卡底层的物理规范协议,即使用户完全不熟悉SD卡底层的物理规范协议也能够使用本发明完成对SD卡中数据的读写。在读写SD卡中的数据时,采用了4位数据线宽的SD模式以及大容量的读写FIFO,实现了对SD卡中文件的快速读写。
附图说明
图1是基于FPGA的SD卡文件管理控制器的框图,
图2是FPGA里的FAT32文件管理单元电路结构图,
图3是FPGA里的SD卡接口单元电路结构图,
图4是运行在软核处理器上的程序流程图。
图中示出:
1--FPGA芯片,2--FAT32文件管理单元,3--SD卡接口单元,4--串行配置芯片,5-- SDRAM存储器,6--主控器接口,7--NIOS II处理器,8-- EPCS控制模块,9-- SDRAM控制模块,10--主控器接口模块,11-- Avalon总线,12-- Avalon接口模块,13--读写缓冲FIFO模块,14-- SD卡数据控制模块,15-- SD卡插座,16-- SD卡命令控制模块,17--SD卡时钟控制模块。
具体实施方式
下面结合实施例,对本发明进行详细说明。
如图1所示,本发明包括FPGA芯片1、串行配置芯片4、SDRAM存储器5、主控器接口6、SD卡插座15,其中在FPGA1内部实现FAT32文件管理单元2和SD卡接口单元3所述的FAT32文件管理单元2包括NIOS II处理器7、EPCS控制模块8、SDRAM控制模块9和主控器接口模块10、Avalon总线11、Avalon接口模块12;
所述的SD卡接口单元3包括读写缓冲FIFO模块13、 SD卡数据控制模块14、SD卡命令控制模块16和SD卡时钟控制模块17。
如图2所示的是所述FPGA里的FAT32文件管理单元电路结构图。FAT32文件管理单元由NIOS II处理器7、EPCS控制模块8、SDRAM控制模块9、主控器接口模块10、Avalon总线11和Avalon接口模块12组成。图中,EPCS控制模块8通过FPGA芯片1的特定引脚与串行配置芯片4采用的EPCS16芯片进行连接;引脚addr_sdram[12..0]、ba_sdram[1..0]、cas_n_sdram、cke_sdram、cs_n_sdram、dq_sdram[15..0]、dqm_sdram[1..0]、ras_n_sdram、we_n_sdram为SDRAM控制模块9的引出端口,并且与SDRAM存储器5所采用的HY57V561620T芯片的A12~A0、BA1~BA0、CAS、CKE、CS、DQ15~DQ0、DQM1~DQM0、RAS、WE端口对应连接;引脚mcu_rst、mcu_clk、mcu_wren、mcu_rden、mcu_int、mcu_address[7..0]、mcu_data[7..0]为主控器接口模块10的引出端口;sd_interface_clk、sd_interface_reset、sd_cmd_ctrl[15..0]、sd_cmd_status[3..0]、divider[7..0]、sd_data_ctrl[15..0]、sd_data_status[3..0]、nios_data[7..0]、nios_wrreq、nios_rdreq、nios_fifo_clk为Avalon接口模块12的引出端口。
NIOS II处理器7通过EPCS控制模块8和SDRAM控制模块9来控制FPGA外部的串行配置芯片4和SDRAM存储器5;NIOS II处理器7通过主控器接口模块10来获取来自主控器的用户命令与数据,并反馈信息给主控器。NIOS II处理器7通过Avalon接口模块12与SD卡接口单元进行通信,以实现快速读写SD卡。
如图3所示为SD卡接口单元电路结构图。SD卡接口单元3由读写缓冲FIFO模块13、SD卡数据控制模块14、SD卡命令控制模块16和SD卡时钟控制模块17组成。图中,读写缓冲FIFO模块13负责SD卡数据的缓冲,其端口nios_data[7..0]、nios_wrreq、nios_rdreq、nios_fifo_clk与Avalon接口模块12的nios_data[7..0]、nios_wrreq、nios_rdreq、nios_fifo_clk相连,host_data[7..0]、host_wrreq、host_rdreq、host_fifo_clk与SD卡数据控制模块14的host_data[7..0]、host_wrreq、host_rdreq、host_fifo_clk相连;SD卡数据控制模块14负责DAT线上数据的接收和发送以及数据的检验,其端口reset_n、sd_cmd_ctrl[15..0]、sd_cmd_status[3..0]与Avalon接口模块12的sd_interface_reset、sd_cmd_ctrl[15..0]、sd_cmd_status[3..0]相连,sd_data[3..0]与SD卡插座15的DAT[3..0]相连;SD卡命令控制模块16主要负责控制CMD线上命令发送和回复接收,其端口reset_n、sd_data_ctrl[15..0]、sd_data_status[3..0]与Avalon接口模块12的sd_interface_reset、sd_data_ctrl[15..0]、sd_data_status[3..0]相连,sd_cmd与SD卡插座15的CMD相连;SD卡时钟控制模块17负责控制CLK时钟线的频率,以控制读写SD卡的数据速率,其端口clk、reset_n、divider[7..0]与Avalon接口模块12的sd_interface_clk、sd_interface_reset、divider[7..0]相连,sd_clk与SD卡数据控制模块14的clk、SD卡命令控制模块16的clk以及SD卡插座15的CLK相连。
如附图4所示为在软核处理器上的程序流程图。程序包括以下步骤:
(1)系统初始化;
(2)主控器是否往SD卡文件管理控制器中写入用户命令,是则进入步骤(3),否则返回步骤(2);
(3)读命令寄存器,获取主控器写入的用户命令号;
(4)根据用户命令号调用FATFS文件系统模块对应的接口函数;
(5) FATFS文件系统模块调用底层磁盘IO模块操作Avalon总线接口模块;
(6)通过Avalon总线往SD卡接口单元写入SD卡物理层命令的命令号和命令参数。
(7) SD卡接口单元根据写入的SD卡命令号和命令参数产生并发送相应的命令到SD卡中。
(8)命令执行完毕进入步骤(9)否则返回步骤(8)继续等待
(9)返回命令响应和命令的执行状态,产生中断并返回步骤(2)
本发明提供8位地址线,8位地址线可以寻址256个单元,这256个单元对应着主控器接口模块中的256个寄存器。主控器接口模块中寄存器空间的分配方式如表1所示。
如软件流程图中所述,主控器通过主控器接口模块往本发明的寄存器中写入特定的用户命令即可完成磁盘管理和文件管理操作。各种用户命令的代码、功能、名称、输入、输出数据如表2所示(表中后缀H表是十六进制数)。各种命令的详细介绍如下:
CMD_DISK_MOUNT:
该命令用来完成SD卡的初始化工作。主控器先往命令寄存器中写入命令CMD_DISK_MOUNT的代码00H,然后往执行命令寄存器中写入01H,即可操作本发明完成SD卡的挂载和初始化工作。本发明将命令的响应反馈在状态寄存器中,主控器通过读取状态寄存器获取SD卡的状态。所有命令返回值的定义如表3所示。本发明提供查询和中断两种方式通知主控器所发出的命令已经执行结束。CMD_DISK_MOUNT命令的返回状态为FR_OK、FR_NOT_READY。操作成功则返回FR_OK,操作失败返回FR_NOT_READY。只有SD卡初始化成功了才能进行其他的磁盘或者文件操作。
CMD_CREATE_DIR:
该命令用于新建子目录,特指文件夹。在根目录下建立子目录时,先按照表2所示分配的寄存器中依次填入目录名(本发明只支持短文件名,所以目录名不能超过8个字节)、属性字段、创建时间。属性字段描述了文件或者目录的属性,大小为1个字节。其值为00H表示读写、01H时表示只读、02H表示隐藏、04表示系统文件H、08H表示卷标、0FH表示该目录项为长文件名目录项在本发明中没有任何意义。10H表示目录、20H表示存档。所以在新建目录时在此字段中填入10H即可。若主控器有实时时钟RTC则往创建时间寄存器中写入实时时间,若主控器没有实时时钟,则系统默认时间为2011年10月01日11点10时01分。填写完目录信息后,往命令寄存器中写入命令CMD_CREATE_DIR的代码01H,往执行命令寄存器中写入01H即可完成目录的创建工作。命令执行完成后将会产生中断。主控器可以读取状态寄存器来查询CMD_CREATE_DIR命令的执行状态。CMD_CREATE_DIR可能的状态为FR_OK, FR_DISK_ERR, FR_INT_ERR, FR_NOT_READY, FR_NO_PATH, FR_INVALID_NAME, FR_DENIED, FR_EXIST, FR_WRITE_PROTECTED FR_NO_FILESYSTEM。各种返回状态的意义请见表3。 当创建多级目录时,需要先使用打开目录命令CMD_OPEN_DIR打开各级父目录,然后按照上面的操作方式使用新建目录命令即可。
CMD_OPEN_DIR:
该命令用于打开已存在的目录。当打开根目录下的一级子目录时,首先往文件名寄存器中写入需要打开的目录名称且不超过8个字节,在命令寄存器中写入CMD_OPEN_DIR的命令代码02H,往执行命令寄存器中写入01H即可执行命令。命令执行完毕后将会产生中断。主控器通过查询状态寄存器来获取CMD_OPEN_DIR命令的操作状态。CMD_OPEN_DIR命令的可能返回状态为FR_OK, FR_DISK_ERR, FR_INT_ERR, FR_NOT_READY, FR_NO_PATH, FR_INVALID_NAME, FR_NO_FILESYSTEM。当打开多级目录时,需要重复使用CMD_OPEN_DIR命令一级一级的打开。每一级目录的打开方式如同根目录下打开一级子目录的方式。
CMD_READ_DIR_STAT:
该命令用于获取目录的信息。如果目录为多级目录时,需要使用“打开目录”命令依次打开目录。然后往文件名寄存器中写入需要查询的目录名,往命令寄存器中写入CMD_READ_DIR_STAT命令的代码03H,往执行命令寄存器中写入01H即可执行CMD_READ_DIR_STAT命令。命令执行完成后将会产生中断。在状态寄存器中保存了命令的执行结果,在寄存器03H~22H 32个字节的空间中保存了目录的信息。CMD_READ_DIR_STAT命令的可能返回值为FR_OK, FR_DISK_ERR, FR_INT_ERR, FR_NOT_READY, FR_NO_FILE, FR_NO_PATH, FR_INVALID_NAME, FR_NO_FILESYSTEM。当返回为FR_OK时表示读取目录信息成功,主控器可以从寄存器中读取相关信息。
CMD_READ_DIR_ITEM:
该命令用于获取目录的目录项。每一个目录项包含了该目录下文件的文件名、扩展名、属性字节、文件的最近修改时间、最近访问时间、文件的创建日期、文件的首簇号、文件的长度等信息。往文件名寄存器中写入目录名,往命令寄存器中写入CMD_READ_DIR_ITEM命令的代码04H、执行命令寄存器中写入01H即可执行命令。命令执行完毕后会产生中断。主控器需要先查询状态寄存器获取命令的执行情况,当返回值为FR_OK时,才能读取寄存器03H~22H获取目录项的信息。当返回其它值时,表明命令执行失败。读完一条目录项后,主控器可以往命令寄存器中写入CMD_READ_CONTINUE命令、执行命令寄存器中写入01H来继续读取下一条目录项。当所有的目录项读取完毕后,状态寄存器中的返回值为FR_READ_ALL。
CMD_CHANGE_DIR_STAT:
该命令用于修改目录的属性包括属性字段、目录名、创建时间。如果目录为多级目录时,需要使用打开目录命令依次打开各级目录。往属性字段寄存器、文件名寄存器、创建时间寄存器中填入数据,在文件信息修改标志位寄存器中指定需要修改的属性。01H表示修改目录名、02H表示修改属性字段、04H表示修改创建时间。主控器可以选择性的修改这3个属性。往命令寄存器中写入CMD_CHANGE_DIR_STAT的命令代码05H,往执行命令寄存器中写入01H即可执行命令。命令执行完成后将会产生中断。主控器可以查询状态寄存器来获取命令的执行状况。命令CMD_CHANGE_DIR_STAT可能的返回值为FR_OK, FR_DISK_ERR, FR_INT_ERR, FR_NOT_READY, FR_NO_FILE, FR_NO_PATH, FR_INVALID_NAME, FR_NO_FILESYSTEM, FR_WRITE_PROTECTED, FR_EXIST。当返回值为FR_OK时表明属性修改成功。
CMD_GET_CURRENT_DIR:
该命令用于获取当前目录的路径名。往命令寄存器中写入命令CMD_GET_CURRENT_DIR 的代码06H、往执行命令寄存器中写入01H即可执行此命令。当命令执行完毕后会产生中断。若命令执行成功,状态寄存器中的值为FR_OK,数据寄存器80H~FFH中为目录的绝对路径名。本发明不支持超过128个字节的路径名。路径名的末尾以“\0”结束。此命令的可能返回值为FR_OK, FR_DISK_ERR, FR_INT_ERR, FR_NOT_READY, FR_NO_FILESYSTEM。
CMD_CHANGE_DIR:
该命令用于切换目录。往数据寄存器80H~FFH中写入需要切换的目录名包括目录的绝对路径,且路径名需小于128个字节、往命令寄存器中写入命令CMD_CHANGE_DIR的代码07H、往执行命令寄存器中写入01H即可执行命令。目录的绝对路径以“/”开始。“/”表示根目录。“/Test”表示根目录下的“Test”子目录。“/file.txt”表示根目录下的文件“file.txt”。“/Test/file.txt”表示根目录下的一级子目录“Test”中的文件“file.txt”。“.”表示当前目录,“. .”表示当前目录的父目录。命令行完毕后会产生中断。若命令执行成功,则状态寄存器中的值为FR_OK。此命令的可能返回值为FR_OK, FR_DISK_ERR, FR_INT_ERR, FR_NOT_READY, FR_NO_FILESYSTEM, FR_INVALID_NAME, FR_NO_PATH。
CMD_DELETE_DIR:
该命令用于删除目录。往数据寄存器80H~FFH中写入需要删除的目录名包括目录的绝对路径,且路径名需小于128个字节、往命令寄存器中写入CMD_DELETE_DIR的代码08H、往执行命令寄存器中写入01H即可执行命令。命令执行完毕后会产生中断。若状态寄存器中的值为FR_OK,则命令执行成功。此命只能用于删除空的文件夹,若文件夹非空则操作失败。
CMD_CREATE_FILE:
该命令用于创建文件。此命令可以参考CMD_CREATE_DIR命令的相关细节。在寄存器03H~22H中依次填入新创建文件的文件名、扩展名、属性字节、创建时间、在命令寄存器中写入命令CMD_CREATE_FILE的代码09H、在执行命令寄存器中写入01H即可执行此命令。命令执行完毕后会产生中断。若状态寄存器中的返回值为FR_OK,表明文件创建成功。此命令的可能返回值为FR_OK, FR_DISK_ERR, FR_INT_ERR, FR_NOT_READY, FR_NO_PATH, FR_INVALID_NAME, FR_DENIED, FR_EXIST, FR_WRITE_PROTECTED FR_NO_FILESYSTEM。
CMD_OPEN_FILE:
此命令用于打开已存在的文件。在文件名寄存器中写入需要打开的文件名、在命令寄存器中写入命令CMD_OPEN_FILE的代码0AH,在执行命令寄存器中写入01H即可执行此命令。命令执行完毕后会产生中断。若状态寄存器中的值为FR_OK表示打开文件成功。在进行文件的读写、文件指针的移动之前必须先成功打开文件。此命令的可能返回值为FR_OK, FR_DISK_ERR, FR_INT_ERR, FR_NOT_READY, FR_NO_PATH, FR_INVALID_NAME, FR_DENIED, FR_EXIST, FR_WRITE_PROTECTED FR_NO_FILESYSTEM。
CMD_BYTE_READ:
该命令用于以字节为单位读取指定字节数的数据。往文件名寄存器中写入文件名,往数据大小寄存器23H~26H中写入读取的字节数,字节数的低位放在低地址寄存器中,高位放在高地址寄存器中。往命令寄存器中写入命令CMD_BYTE_READ的代码0BH、往执行命令寄存器中写入01H即可执行命令。命令执行完毕后会产生中断。若命令执行成功,则状态寄存器中的返回值为FR_OK,“可读写字节数”寄存器中为数据寄存器80H~FFH中有效的字节数。主控器根据“可读写字节数”寄存器中的值来从数据寄存器80H单元开始读取数据。数据寄存器80H~FFH中最多只能保存128字节的数据,当主控器读取的字节数大于128个字节时,需要分多次读取。主控器从数据寄存器80H~FFH单元读完128个字节的数据后,往命令寄存器中写入命令CMD_READ_CONTINUE,往执行命令寄存器中写入01H即可读取下128个字节的数据。当读取到文件的末尾或读取的字节数完毕后,状态寄存器中的值为FR_READ_ALL。此命令可能返回值为FR_OK、FR_DISK_ERR、FR_INT_ERR、FR_NOT_READY、FR_READ_ALL。
CMD_SECTOR_READ:
该命令用于以扇区为单位读取文件。此命令的用法可以参考CMD_BYTE_READ。往文件名寄存器中写入文件名,往数据大小寄存器23H~26H中写入读取的扇区数,扇区数的低位放在低地址寄存器中,高位放在高地址寄存器中。往命令寄存器中写入命令CMD_SECTOR_READ的代码0CH、往执行命令寄存器中写入01H即可执行命令。命令执行完毕后会产生中断。若命令执行成功,则状态寄存器中的返回值为FR_OK,“可读写字节数”寄存器中为数据寄存器80H~FFH中有效的字节数。主控器根据“可读写字节数”寄存器中的值来从数据寄存器80H单元开始读取数据。数据寄存器80H~FFH中最多只能保存128字节的数据,每个扇区的大小是128字节的整数倍。所以以扇区为单位读时,需要主控器反复的读取128字节的数据。主控器从数据寄存器80H~FFH单元读完128个字节的数据后,往命令寄存器中写入命令CMD_READ_CONTINUE,往执行命令寄存器中写入01H即可读取下128个字节的数据。当读取到文件的末尾或读取的书扇区数完毕后,状态寄存器中的值为FR_READ_ALL。此命令可能返回值为FR_OK、FR_DISK_ERR、FR_INT_ERR、FR_NOT_READY、FR_READ_ALL。
CMD_BYTE_WRITE:
该命令用于以字节为单位往文件中写入数据。此命令的用法可以参考命令CMD_BYTE_READ。往文件名寄存器中写入文件名,往数据寄存器80H~FFH中写入数据,往“可读写字节数”寄存器中写入本次数据寄存器中有效的字节数,往命令寄存器中写入命令CMD_BYTE_WRITE的代码0DH、往执行命令寄存器中写入01H即可执行命令。命令执行完毕后会产生中断。若命令执行成功,则状态寄存器中的返回值为FR_OK,“可读写字节数”寄存器中为实际写入文件中的字节数。若操作失败主控器可根据“可读写字节数”寄存器中的值来确定已经写入了多少数据。数据寄存器80H~FFH中最多只能保存128字节的数据,当主控器写入的字节数大于128个字节时,需要分多次写。当主控器写完128个字节的数据后,往数据寄存器80H~FFH中再次写入数据,往“可读写字节数”寄存器中写入本次操作的字节数、往命令寄存器中写入命令CMD_WRITE_CONTINUE,往执行命令寄存器中写入01H即可连续的往文件中写入数据。此命令可能返回值为FR_OK、FR_DISK_ERR、FR_INT_ERR、FR_NOT_READY。
CMD_SECTOR_WRITE:
该命令用于以扇区为单位往文件中写入数据。此命令的用法可以参考命令CMD_BYTE_WRITE。往文件名寄存器中写入文件名,往数据寄存器80H~FFH中写入数据,往“可读写字节数”寄存器中写入本次数据寄存器中有效的字节数,往命令寄存器中写入命令CMD_SECTOR_WRITE的代码0EH、往执行命令寄存器中写入01H即可执行命令。命令执行完毕后会产生中断。若命令执行成功,则状态寄存器中的返回值为FR_OK,“可读写字节数”寄存器中为实际写入文件中的字节数。若操作失败主控器可根据“可读写字节数”寄存器中的值来确定已经写入了多少数据。数据寄存器80H~FFH中最多只能保存128字节的数据,而FAT32文件系统的扇区大小都是128字节的整数倍。主控器需要分多次才能写完一个扇区。当主控器写完128个字节的数据后,往数据寄存器80H~FFH中再次写入128字节数据,往“可读写字节数”寄存器中写入128、往命令寄存器中写入命令CMD_WRITE_CONTINUE,往执行命令寄存器中写入01H即可连续的往文件中写入数据。此命令可能返回值为FR_OK、FR_DISK_ERR、FR_INT_ERR、FR_NOT_READY。
CMD_GET_POINTER:
该命令用于读写文件时获取当前文件的指针。往命令寄存器中写入命令CMD_GET_POINTER代码0FH、往执行命令寄存器中写入01H即可执行此命令。命令执行完毕后会产生中断。若命令执行成功,则状态寄存器中的返回值为FR_OK,数据大小寄存器23H~26H中为文件指针到文件开头的偏移量。偏移量的低位存放在低地址,高位存放在高地址。
CMD_MOVE_POINTER:
该命令用于读写文件时移动文件的指针。往数据大小寄存器23H~26H中写入移动的偏移量,偏移量为4个字。往命令寄存器中写入CMD_MOVE_POINTER命令的代码10H、往执行命令寄存器中写入01H即可执行命令。命令执行完毕后会产生中断。若命令执行成功,状态寄存器中的返回值为FR_OK。此命令可能的返回值为FR_OK、FR_DISK_ERR、FR_INT_ERR、FR_NOT_READY。
CMD_GET_FILE_STAT:
该命令用于获取文件的读写属性、创建时间、文件大小、文件首簇号、文件最后的访问时间、文件最后修改的时间。当文件位于根目录下时,往文件名寄存器中写入文件名、往命令寄存器中写入命令CDM_GET_FILE_STAT的代码11H、往执行命令寄存器中写入01H即可执行命令。命令执行完毕后会产生中断。若命令执行成功,则状态寄存器中的返回值为FR_OK,寄存器03H~22H为文件的信息。每一项信息在寄存器中的位置详见表1。当文件位于多级目录下时,需要使用打开目录命令打开多级目录,然后获取文件的信息。此命令的可能返回值为FR_OK、FR_DISK_ERR、 FR_INT_ERR、 FR_NOT_READY、FR_NO_FILE, FR_INVALID_NAME, FR_DENIED, FR_EXIST, FR_NO_FILESYSTEM。
CMD_END_OF_FILE:
该命令用于测试文件指针是否到达了文件的末尾。往命令寄存器中写入命令CMD_END_OF_FILE代码12H、往执行命令寄存器中写入01H即可执行命令。命令执行完毕后会产生中断。若命令执行成功且文件指针到达文件的末尾处,状态寄存器中的返回值为FR_END_OF_FILE,没有到达文件的末尾处则返回FR_OK。
CDM_TEST_FILE_ERROR:
该命令用于测试文件是否发生了错误。往命令寄存器中写入命令CMD_TEST_FIL_ERROR代码13H、往执行命令寄存器中写入01H即可执行命令。命令执行完毕后会产生中断。若命令执行成功且文件没有错误则状态寄存器中的返回值为FR_OK。
CMD_CHANGE_FILE_STAT:
该命令用于修改文件的属性包括属性字段、文件名、创建时间。当文件位于根目录下时,往属性字段寄存器、文件名寄存器、创建时间寄存器中填入修改的数据,在文件信息修改标志位寄存器中指定需要修改的属性。01H表示修改文件名、02H表示修改属性字段、04H表示修改创建时间。主控器可以选择性的修改这3个属性。往命令寄存器中写入CMD_CHANGE_FILE_STAT的命令代码14H,往执行命令寄存器中写入01H即可执行命令。命令执行完成后将会产生中断。主控器可以查询状态寄存器来获取命令的执行状况。命令CMD_CHANGE_FILE_STAT可能的返回值为FR_OK, FR_DISK_ERR, FR_NO_PATH,FR_NOT_READY,FR_WRITE_PROTECTED,FR_INT_ERR,FR_NO_FILE,FR_INVALID_NAME, FR_EXIST FR_NO_FILESYSTEM。当返回值为FR_OK时表明属性修改成功。
CDM_READ_CONTINUE:
该命令用于以字节或扇区为单位连续的读同一个文件。
CMD_WRITE_CONTINUE:
该命令用于以字节或扇区为单位连续的写同一个文件。
CMD_GET_FREE_SECTOR:
该命令用于获取SD卡中空闲的扇区号。往命令寄存器中写入命令CMD_GET_FREE_SECTOR代码17H、往执行命令寄存器中写入01H即可执行命令。若命令执行成功,状态寄存器中的返回值为FR_OK,数据大小寄存器23H~26H中为空闲的扇区号。
CMD_GET_DISK_CAPACITY:
该命令用于获取磁盘的容量。往命令寄存器中写入命令CMD_GET_DISK_CAPACITY代码18H、往执行命令寄存器中写入01H即可执行命令。若命令执行成功,状态寄存器中的返回值为FR_OK,数据大小寄存器23H~26H中为磁盘中所有的扇区数。
表3定义了所有的命令返回值。
表1
寄存器地址 | 字节数 | 寄存器定义 | 宏定义 |
00H | 1 | 状态寄存器 | OPERATION_STATUS |
01H | 1 | 执行命令寄存器 | EXECUTE_CMD |
02H | 1 | 命令寄存器 | CMD_REGISTER |
03~0AH | 8 | 文件名寄存器 | FILE_NAME |
0BH~0DH | 3 | 扩展名寄存器 | EXTENSION_NAME |
0EH | 1 | 属性字节寄存器 | FILE_ATTRIBUTE |
0FH | 1 | 文件信息修改标志位 | FILE_MODIFY |
10H | 1 | 创建时间10毫秒位 | FILE_CRTTIMETENTH |
11H~12H | 2 | 文件创建时间 | FILE_CRTTIME |
13H~14H | 2 | 文件创建日期 | FILE_CRTDATE |
15H~16H | 2 | 文件最后访问日期 | FILE_LASTACCDATE |
17H~18H | 2 | 文件起始簇号高16位 | FILE_FSTCLUSHI |
19H~1AH | 2 | 文件最近的修改时间 | FILE_WRITETIME |
1BH~1CH | 2 | 文件最近的修改时间 | FILE_WRITEDAYE |
1DH~1EH | 2 | 文件起始簇号低16 | FILE_FSTCLUSLO |
1FH~22H | 4 | 文件的长度 | FILE_SIZE |
23H~26H | 4 | 数据大小寄存器 | OPERATION_SIZE |
27H | 1 | 可读写字节数寄存器 | AVAILABLE_COUNT |
80H~FFH | 数据寄存器 | DATA_REG_BASE |
表2
代码 | 功能 | 命令名称 | 输入数据 | 输出数据 | 是否产生中断 |
00H | SD卡初始化 | CMD_DISK_MOUNT | 操作状态 | 是 | |
01H | 新建目录 | CMD_CREATE_DIR | FAT32短目录项 | 操作状态 | 是 |
02H | 打开目录 | CMD_OPEN_DIR | 目录名 | 操作状态 | 是 |
03H | 读取目录信息 | CMD_READ_DIR_STAT | 目录名 | 目录信息和操作状态 | 是 |
04H | 读取目录项 | CMD_READ_DIR_ITEM | 目录名 | FAT32短目录项和操作状态 | 是 |
05H | 修改目录属性 | CMD_CHANGE_DIR_STAT | 目录名和需修改的属性 | 操作状态 | |
06H | 获取当前目录 | CMD_GET_CURRENT_DIR | 当前目录路径名和操作状态 | 是 | |
07H | 切换目录 | CMD_CHANGE_DIR | 目录名(包括路径名) | 操作状态 | 是 |
08H | 删除目录 | CMD_DELETE_DIR | 目录名(包括路径名) | 操作状态 | 是 |
09H | 新建文件 | CMD_CREATE_FILE | FAT32短目录项 | 操作状态 | 是 |
0AH | 打开文件 | CMD_OPEN_FILE | 文件名 | 操作状态 | 是 |
0BH | 以字节为单位读文件 | CMD_BYTE_READ | 文件名和读取的字节数 | 数据寄存器中有效字节数和数据 | 是 |
0CH | 以扇区为单位读文件 | CMD_SECTOR_READ | 文件名和读取的扇区数 | 数据寄存器中有效字节数和数据 | 是 |
0DH | 以字节为单位写文件 | CMD_BYTE_WRITE | 文件名、写入的字节数、写入数据和数据寄存器中有效字节数 | 本次操作实际写入的字节数和操作状态 | 是 |
0EH | 以扇区为单位写文件 | CMD_SECTOR_WRITE | 文件名、写入的扇区数、写入数据和数据寄存器中有效字节数 | 本次操作实际写入的字节数和操作状态 | 是 |
0FH | 获取当前文件指针 | CMD_GET_POINTER | 文件名 | 当前文件指针的偏移量和操作状态 | 是 |
10H | 移动当前文件的指针 | CMD_MOVE_POINTER | 文件名和偏移的字节数 | 操作状态 | 是 |
11H | 获取文件的信息 | CMD_GET_FILE_STAT | 文件名 | FAT32短目录项操作状态 | 是 |
12H | 测试是否到达文件的末尾 | CMD_END_OF_FILE | 文件名 | 操作状态 | 是 |
13H | 测试文件是否发生错误 | CMD_TEST_FILE_ERROR | 文件名 | 操作状态 | 是 |
14H | 修改文件的属性 | CMD_CHANGE_FILE_STAT | 文件名、属性指示位和文件属性 | 操作状态 | 是 |
15H | 继续执行读操作 | CMD_READ_CONTINUE | 操作状态 | 是 | |
16H | 继续执行写操作 | CMD_WRITE_CONTINUE | 操作状态 | 是 | |
17H | 查询空闲扇区号 | CMD_GET_FREE_SECTOR | 空闲扇区号和操作状态 | 是 | |
18H | 查询磁盘容量 | CMD_GET_DISK_CAPACITY | 磁盘的扇区总数和操作状态 | 是 |
表3
代码 | 状态名称 | 备注 |
00H | FR_OK | 命令操作成功 |
01H | FR_NOT_READY | 挂在SD卡或者初始化文件系统失败 |
02H | FR_INT_ERR | 要求失败 |
03H | FR_DISK_ERR | 不可恢复性错误 |
04H | FR_NO_FILE | 找不到指定的文件 |
05H | FR_NO_PATH | 找不到指定的路径 |
06H | FR_INVALID_NAME | 指定的路径名不合法 |
07H | FR_DENIED | 指定的操作被拒绝执行 |
08H | FR_EXIST | 指定的目录名或者文件名已经存在 |
09H | FR_WRITE_PROTECTED | 对写保护的磁盘进行写操作 |
0AH | FR_NO_FILESYSTEM | SD卡上面没有FAT32文件系统 |
0BH | FR_TOO_MANY_OPEN_FILES | 打开的文件太多超过允许的数目 |
0CH | FR_READ_ALL | 所有的读/写操作完毕 |
0DH | FR_END_OF_FILE | 文件指针到达文件末尾 |
Claims (6)
1.基于FPGA的SD卡文件管理控制器,其特征在于包括FPGA芯片(1)、串行配置芯片(4)、SDRAM存储器(5)、主控器接口(6)、SD卡插座(15),其中在FPGA(1)内部实现FAT32文件管理单元(2)和SD卡接口单元(3);
所述FAT32文件管理单元(2)为主控器提供主控器接口(6)、操作文件系统的用户命令,主控器通过该接口在SD卡文件管理控制器的寄存器中写入用户命令即可完成对SD卡中FAT32文件系统的管理;
所述SD卡接口单元(3)在FAT32文件管理单元(2)的控制下,负责SD卡命令的产生和应答接收,以及SD卡中数据的读写;
在读写SD卡中的数据时,采用了4位数据线宽的SD模式。
2.根据权利要求1所述的一种基于FPGA的SD卡文件管理控制器,其特征在于:所述的FAT32文件管理单元(2)包括NIOS II处理器(7)、EPCS控制模块(8)、SDRAM控制模块(9)、主控器接口模块(10)、Avalon总线(11)、Avalon接口模块(12);
所述NIOS II处理器(7)通过主控器接口模块(10)获取主控器输入的用户命令与数据,并反馈信息给主控器;
所述NIOS II处理器(7)通过Avalon接口模块(12)与SD卡接口单元(3)进行通信;
所述NIOS II处理器(7)通过EPCS控制模块(8)、SDRAM控制模块(9)分别与FPGA外部的串行配置芯片(4)和SDRAM存储器(5)相连。
3.根据权利要求1所述的一种基于FPGA的SD卡文件管理控制器,其特征在于:所述的FAT32文件管理单元(2)上面移植了FATFS文件系统模块。
4.根据权利要求1所述的一种基于FPGA的SD卡文件管理控制器,其特征在于:所述的SD卡接口单元(3)包括读写缓冲FIFO模块(13)、 SD卡数据控制模块(14)、SD卡命令控制模块(16)和SD卡时钟控制模块(17);
所述读写缓冲FIFO模块(13)负责缓存读写SD卡时的数据,
所述SD卡数据控制模块(14)负责DAT线上数据的接收和发送以及数据的校验,
所述SD卡命令控制模块(16)负责控制CMD线上命令发送和回复接收,
所述SD卡时钟控制模块(17)负责控制CLK时钟线的频率,以控制读写SD卡的数据速率。
5.根据权利要求1所述的一种基于FPGA的SD卡文件管理控制器,其特征在所述的主控器接口为8位地址线、8位数据线。
6.根据权利要求1所述的一种基于FPGA的SD卡文件管理控制器,其特征在于所述操作文件系统的用户命令包括新建、打开、读写、关闭文件,新建、打开、关闭目录,磁盘容量查询、空闲扇区查询、以扇区或字节为单位对文件进行读写。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2011103579366A CN102436428A (zh) | 2011-11-11 | 2011-11-11 | 基于fpga的sd卡文件管理控制器 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2011103579366A CN102436428A (zh) | 2011-11-11 | 2011-11-11 | 基于fpga的sd卡文件管理控制器 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN102436428A true CN102436428A (zh) | 2012-05-02 |
Family
ID=45984499
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2011103579366A Pending CN102436428A (zh) | 2011-11-11 | 2011-11-11 | 基于fpga的sd卡文件管理控制器 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102436428A (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102708075A (zh) * | 2012-05-15 | 2012-10-03 | 山东大学 | 一种sd卡硬件控制装置及控制方法 |
CN103309828A (zh) * | 2013-05-31 | 2013-09-18 | 杭州晟元芯片技术有限公司 | 一种sd卡从控制器及控制方法 |
CN105739927A (zh) * | 2016-01-29 | 2016-07-06 | 武汉精测电子技术股份有限公司 | 一种基于软核处理器的移动存储卡读写方法及文件升级系统 |
CN114647449A (zh) * | 2020-12-17 | 2022-06-21 | 航天科工惯性技术有限公司 | 一种终端设备的数据处理方法、装置及其系统 |
CN117991995A (zh) * | 2024-03-26 | 2024-05-07 | 中国人民解放军海军潜艇学院 | 一种sd卡文件连续读或写控制方法、系统及存储设备 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101634071A (zh) * | 2009-08-13 | 2010-01-27 | 浙江理工大学 | 一种基于fpga的电子提花机控制系统 |
-
2011
- 2011-11-11 CN CN2011103579366A patent/CN102436428A/zh active Pending
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101634071A (zh) * | 2009-08-13 | 2010-01-27 | 浙江理工大学 | 一种基于fpga的电子提花机控制系统 |
Non-Patent Citations (2)
Title |
---|
何伟等: "基于FPGA的SD卡控制器设计及应用", 《世界科技研究与发展》 * |
杨爽等: "基于NiosⅡ和SD卡的数据采集系统的设计", 《核电子学与探测技术》 * |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102708075A (zh) * | 2012-05-15 | 2012-10-03 | 山东大学 | 一种sd卡硬件控制装置及控制方法 |
CN103309828A (zh) * | 2013-05-31 | 2013-09-18 | 杭州晟元芯片技术有限公司 | 一种sd卡从控制器及控制方法 |
CN103309828B (zh) * | 2013-05-31 | 2016-03-09 | 杭州晟元数据安全技术股份有限公司 | 一种sd卡从控制器及控制方法 |
CN105739927A (zh) * | 2016-01-29 | 2016-07-06 | 武汉精测电子技术股份有限公司 | 一种基于软核处理器的移动存储卡读写方法及文件升级系统 |
CN105739927B (zh) * | 2016-01-29 | 2019-01-04 | 武汉精测电子集团股份有限公司 | 一种基于软核处理器的移动存储卡读写方法及文件升级系统 |
CN114647449A (zh) * | 2020-12-17 | 2022-06-21 | 航天科工惯性技术有限公司 | 一种终端设备的数据处理方法、装置及其系统 |
CN114647449B (zh) * | 2020-12-17 | 2024-02-20 | 航天科工惯性技术有限公司 | 一种终端设备的数据处理方法、装置及其系统 |
CN117991995A (zh) * | 2024-03-26 | 2024-05-07 | 中国人民解放军海军潜艇学院 | 一种sd卡文件连续读或写控制方法、系统及存储设备 |
CN117991995B (zh) * | 2024-03-26 | 2024-06-07 | 中国人民解放军海军潜艇学院 | 一种sd卡文件连续读或写控制方法、系统及存储设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6678785B2 (en) | Flash management system using only sequential write | |
US7318117B2 (en) | Managing flash memory including recycling obsolete sectors | |
US10831734B2 (en) | Update-insert for key-value storage interface | |
US5715455A (en) | Apparatus and method for storing file allocation table efficiently in memory | |
JP5149912B2 (ja) | 複数の異種のソリッドステート・ストレージ・ロケーションの選択的利用 | |
CN114840138A (zh) | 基于存储器装置的区域的文件系统存储分配 | |
US11030156B2 (en) | Key-value store with partial data access | |
US10956071B2 (en) | Container key value store for data storage devices | |
KR101055324B1 (ko) | 강화된 호스트 인터페이스 | |
US20230065300A1 (en) | Preserving application data order in memory devices | |
WO2020077301A1 (en) | Efficient file storage and retrieval system, method and apparatus | |
CN102436428A (zh) | 基于fpga的sd卡文件管理控制器 | |
US11630595B2 (en) | Methods and systems of efficiently storing data | |
US20170153842A1 (en) | Data allocation in hard drives | |
WO2017184477A1 (en) | Adapted block translation table (btt) | |
US20240330175A1 (en) | Storage device for classifying data based on stream class number, storage system, and operating method thereof | |
CN115729461A (zh) | 双模式存储设备 | |
CN102375781B (zh) | 数据保护方法、存储器控制器及可携式存储器储存装置 | |
CN202362777U (zh) | 基于fpga的sd卡文件管理控制器 | |
CN101089842A (zh) | 复制文件到嵌入式设备中的方法 | |
US20140201167A1 (en) | Systems and methods for file system management | |
Micheloni et al. | Solid state drives (ssds) | |
CN106557275B (zh) | 一种数据处理的方法及装置 | |
US20100274828A1 (en) | Electronic Device, Storage Area Allocation Method for File System, and Computer Product | |
Lerner et al. | External Interfaces |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C02 | Deemed withdrawal of patent application after publication (patent law 2001) | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20120502 |