一、团队介绍
我们的队伍名称为:我要吃火锅
队伍编号为:CICC2882
这是我们团队分享的第五篇文章,其他四篇文章链接如下:
DDR200T LCD显示模块_全国大学生集成电路创新创业大赛_RISC-V论坛讨论_RISC-V MCU中文社区 (rvmcu.com)
基于蜂鸟E203处理器的DMA模块设计_全国大学生集成电路创新创业大赛_RISC-V论坛讨论_RISC-V MCU中文社区 (rvmcu.com)
DDR200T中DDR的使用与时序介绍_全国大学生集成电路创新创业大赛_RISC-V论坛讨论_RISC-V MCU中文社区 (rvmcu.com)
NICE接口介绍_全国大学生集成电路创新创业大赛_RISC-V论坛讨论_RISC-V MCU中文社区 (rvmcu.com)
二、模块总述
我们项目中完成了SD卡控制模块的设计,其基本功能:FPGA作为SD-host, 指定扇区号读取扇区内容,或者指定文件名能读取文件内容。为了使读取SD卡速度更快,性能更佳,项目中使用SD总线实现,而不是SPI总线,并且考虑到兼容性的问题,该SD控制模块能够自动适配SD卡版本,自动适配FAT16/FAT32文件系统。
三、SD卡初始化
SD卡的初始化,需要先给予至少74个CLK后,再发送CMD0,因为CMD0没有参数,后面发出3个字节的0即可,再加上校验码0x95,共六个字节,发送完之后就可以读取SD卡的回应码,返回1即表明SD卡进入空闲状态,接着发送CMD41,同样没有参数发送0即可,校验码为0xff,SD卡即跳出空闲状态,可以接受命令了。因为在上电初期,电压的上升过程据SD卡组织的计算约合64个CLK周期才能到达SD卡的正常工作电压,这个时间被称为Supply ramp up time,其后的10个CLK是为了与SD卡同步,因此,在S_INIT状态下,要给予74个CLK。
四、SD卡命令
常用SD卡命令如下
命令 |
回应 |
描述 |
CMD0(0X00) |
R1 |
复位SD卡 |
CMD8(0X08 |
R7 |
发送接口状态命令 |
CMD9(0X09) |
R1 |
读取卡特定数据寄存器 |
CMD10(0X0A) |
R1 |
读取卡标志数据寄存器 |
CMD16(0X10) |
R1 |
设置块大小(字节数) |
CMD17(0X11) |
R1 |
读取一个块的数据 |
CMD24(0X18) |
R1 |
写入一个块的数据 |
CMD41(0X29) |
R3 |
发送给主机容量支持信息和激活卡初始化过程 |
CMD55(0X37) |
R1 |
告诉SD卡,下一个是特定应用命令 |
CMD58(0X3A) |
R3 |
读取OCR寄存器 |
五、SD卡读步骤
读步骤主要分为两步,第一步首先发送一条指令,如果发送是CMD17,则表示是对单块进行读操作,如果是CMD18,则表示对多块进行读操作,这两条指令会返回0X00。第二步,首先接受数据开始位:fe,然后接受512Bytes数据和2Bytes的CRC校验。根据这个时序就能够完成对SD卡一个扇区或者多个扇区的读操作,而写操作是通过上位机写入,此次项目并没有用硬件实现。
六、FAT文件系统
我们的项目是将权重数据存入SD卡,由于权重数据量较大,从上位机写入SD卡后,可能并非写在SD卡的连续的扇区,所以如果SD卡只能按照扇区读取,可能会出现错误,所以需要考虑文件系统,按照文件名读出所需要的文件。
此次项目中,SD卡模块能够自动适配FAT16和FAT32文件系统。
FAT文件系统用“簇”作为数据单元。一个“簇”由一组连续的扇区组成,簇所含的扇区数必须是2的整数次幂。簇的最大值为64个扇区,即32KB。所有簇从2开始进行编号,每个簇都有一个自己的地址编号。用户文件和目录都存储在簇中。
FAT文件系统的数据结构中有两个重要的结构:文件分配表和目录项。文件和文件夹内容储存在簇中,如果一个文件或文件夹需要多余一个簇的空间,则用FAT表来描述如何找到另外的簇。FAT结构用于指出文件的下一个簇,同时也说明了簇的分配状态。FAT12、FAT16、FAT32这三种文件系统之间的主要区别在与FAT项的大小不同。FAT文件系统的每一个文件和文件夹都被分配到一个目录项,目录项中记录着文件名、大小、文件内容起始地址以及其他一些元数据。
在FAT文件系统中,文件系统的数据记录在“引导扇区中(DBR)”中。引导扇区位于整个文件系统的0号扇区,是文件系统隐藏区域(也称为保留区)的一部分,称其为DBR扇区,DBR中记录着文件系统的起始位置、大小、FAT表个数及大小等相关信息。
在FAT文件系统中,同时使用“扇区地址”和“簇地址”两种地址管理方式。这是因为只有存储用户数据的数据区使用簇进行管理,所有簇都位于数据区。其他文件系统管理数据区域是不以簇进行管理的,这部分区域使用扇区地址进行管理,文件系统的起始扇区为0号扇区。
根据FAT文件系统,我们在硬件实现时利用一个有限状态机实现,DBR状态下,判断出文件系统是FAT16还是FAT32,(此次项目中实际利用的为FAT32文件系统),判断出来后,根据FAT表找到存储该文件的各个扇区,然后将其通过读扇区模块,全部输出。
七、ASCII码转换
由于上位机写入SD卡是以TXT文件写入,TXT文件按照ASCII码存入我们的权重数据而不是按照十六进制存入,由于我们需要的数据都是16进制数而不是字符,并且文件中还有一些多余的换行符和空格,所以在项目中,我们还利用硬件将ASCII码转换为需要的16进制数,并且过滤掉其他的无关字符,只需要判度输出的数据ASCII码是否在我们需要的区间直接,如果不是则不输出。