RISC-V MCU中文社区

【分享】 震惊!SD卡模块还能这样写

发表于 全国大学生集成电路创新创业大赛 2021-07-07 16:28:23
0
2194
3

一、团队介绍

我们的队伍名称为:我要吃火锅

队伍编号为: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卡的初始化,需要先给予至少74CLK后,再发送CMD0,因为CMD0没有参数,后面发出3个字节的0即可,再加上校验码0x95,共六个字节,发送完之后就可以读取SD卡的回应码,返回1即表明SD卡进入空闲状态,接着发送CMD41,同样没有参数发送0即可,校验码为0xffSD卡即跳出空闲状态,可以接受命令了。因为在上电初期,电压的上升过程据SD卡组织的计算约合64CLK周期才能到达SD卡的正常工作电压,这个时间被称为Supply ramp up time,其后的10CLK是为了与SD卡同步,因此,在S_INIT状态下,要给予74CLK

四、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寄存器

写入一个CMD命令时,首先将CS拉低,在SD卡的DIN引脚输入命令及相应的参数和校验码后,再附加8CLK,此处写即是为了读,因为必须有时钟才能读数据的,现在就可以从接受缓冲寄存器里面读数据了,因为写入的是无效的指令,所以SD卡不会给予反应,在此期间SD卡的片选都应该是低电平,这样才能正确的读出数据。

写命令时发送要写的命令和地址参数,后跟校验码,SD卡会以R1回应,然后校验R1返回的数据是否正确。如果不正确,则进入错误状态,如果正确,当命令的数据长度不为0时,进入S_CMD_DATA状态。

S_CMD_DATA状态下,CMD8会返回5个字节的数据,首先接收到第一个字节格式为R1的数据,这个数据只要判断是否为0X01即可,如果为0X01,表示SD卡响应了CMD8命令,如果不为0X01,则表示SD卡不支持CMD8命令。在接收到0X01之后,随后需要接收4字节数据,其中31-28位为command version,即命令的类型,然后27-12位是保留的数据位,通常为0 11-8位是SD卡支持的电压范围,最后一个字节是我们在CMD8的命令中发送给SD卡的数据,SD卡又原模原样的返回来了。

五、SD卡读步骤

读步骤主要分为两步,第一步首先发送一条指令,如果发送是CMD17,则表示是对单块进行读操作,如果是CMD18,则表示对多块进行读操作,这两条指令会返回0X00。第二步,首先接受数据开始位:fe,然后接受512Bytes数据和2BytesCRC校验。根据这个时序就能够完成对SD卡一个扇区或者多个扇区的读操作,而写操作是通过上位机写入,此次项目并没有用硬件实现。

六、FAT文件系统

我们的项目是将权重数据存入SD卡,由于权重数据量较大,从上位机写入SD卡后,可能并非写在SD卡的连续的扇区,所以如果SD卡只能按照扇区读取,可能会出现错误,所以需要考虑文件系统,按照文件名读出所需要的文件。

此次项目中,SD卡模块能够自动适配FAT16FAT32文件系统。

FAT文件系统用作为数据单元。一个由一组连续的扇区组成,簇所含的扇区数必须是2的整数次幂。簇的最大值为64个扇区,即32KB。所有簇从2开始进行编号,每个簇都有一个自己的地址编号。用户文件和目录都存储在簇中。

FAT文件系统的数据结构中有两个重要的结构:文件分配表和目录项。文件和文件夹内容储存在簇中,如果一个文件或文件夹需要多余一个簇的空间,则用FAT表来描述如何找到另外的簇。FAT结构用于指出文件的下一个簇,同时也说明了簇的分配状态。FAT12FAT16FAT32这三种文件系统之间的主要区别在与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码是否在我们需要的区间直接,如果不是则不输出。



喜欢3
用户评论
clever

clever 实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板