SD卡读写测试(一)

        SD存储卡是一种基于半导体快闪记忆器的新一代记忆设备。它具有体积小、传输速度快、支持热差拔等优点,在便携式装置领域得到了广泛的应用,如数码相机、多媒体播放器、笔记本电脑等(TF卡也就是MicroSD卡,简称SD卡)

1.1简介

        SD卡的英文全称是Secure Digital Card,即安全数字卡(又叫安全数码卡),是在MMC卡(Multimedia Card,多媒体卡)的基础上发展而来,具有两个突出的优点:更高的安全性和更高的读写速度。SD卡和MMC卡的长度和宽度都是32mm*24mm,不同的是SD卡的厚度为2.1mm,而MMC卡的厚度为1.4mm,SD卡比MMC卡略厚,以容纳更大容量的存储单元,同时SD卡比MMC卡触点引脚要多,且咋侧面多了一个写保护开关。SD卡与MMC卡保持着向上兼容,也就是说MMC卡可以被新的SD设备存取,兼容性则取决于应用软件,但SD卡不可以被MMC设备存取.SD卡和MMC卡可以通过卡面上的标注进行区分,如下图左侧图片上面标注为“MultiMediaCard”字母样式的为MMC卡,右侧图片上面标注为“SD”字母样式的为SD卡。                                                        ​​​​​​​        ​​​​​​​        ​​​​​​​        

        上图中右侧的SD卡实际上为SDHC卡,SD卡从存储容量上分为三个级别,分别为SD卡、SDHC卡(Secure Digital High Capacity,高容量安全数字卡)和SDXC卡(SD eXtended Capacity,容量扩大化的安全存储卡)。SD卡在MMC卡的基础上发展而来,使用FAT12/FAT16文件系统,SD卡采用SD1.0协议规范,该协议规定了SD卡的最大存储容量为2GB;SDHC卡是大容量存储SD卡,使用FAT32文件系统,SDHC卡采样SD2.0协议规范,该协议规定了SDHC卡的存储容量范围为2GB~32GB;SDXC卡是新提出的标准,不同于SD卡和SDHC卡使用的FAT文件系统,SDXC卡使用eXFAT文件系统,即扩展FAT系统。SDXC卡采用SD3.0协议规范,该协议规定了SDXC卡的存储容量范围32GB~2TB(2048GB),一般用于中高端单反相机和高清摄像机。下表为SD卡采用的协议规范、容量等级及读写速度:

        不同协议规范的SD卡有着不同速度等级的表示方法。在SD1.0协议规范中,使用“X”表示不同的速度等级;在SD2.0协议规范中,使用SpeedClass表示不同的速度等级;在SD3.0协议规范中,使用UHS(Ultra High Speed)表示不同的速度等级。SD2.0规范中对SD卡的速度等级划分为普通卡(class2、class4、class6)和高速卡(class10);SD3.0规范对SD卡的速度等级划分为UHS速度等级1和3;SD卡不同速度等级表示法

        SD卡共有9根引脚线,可工作在SDIO模式或者SPI模式。在SDIO模式下共用到CLK、CMD、DAAT[3:0]六根信号线;在SPI模式下共用到CS(SDIO_DAT[3])、CLK (SDIO_CLK)、MISO(SDIO_DAT[0])、MOSI(SDIO_CMD)四根信号线。SD卡接口定义以及各引脚功能说明如下图        市面上除标准SD卡外,还有MicroSD卡(原名TF卡),是一种极细小的快闪存储器卡,是由SanDisk(闪迪)公司发明,主要用于移动手机。MicroSD卡插入适配器(Adapter)可以转换成SD卡,其操作时序和SD卡一样,MicroSD卡接口定义以及各引脚功能说明如下图所示。

        标准SD卡2.0版本中,工作时钟频率可以达到50MHZ,在SDIO模式下采用4位数据位宽,理论上可以达到200Mbps(50Mx4bit)的传输速率,在SPI模式下采用1位数据位宽,理论上可以达到50Mbps的传输速率。因此SD卡在SDIO模式下传输效率更快,同时其操作时序也更复杂,对于SD卡读取音乐文件和图片来说,SPI模式下的传输速度已经能够满足我们的需求。

        SD卡在正常读写操作之前,必须先对SD卡进行初始化,SD卡初始化过程就是向SD中写入命令,使其工作在预期的工作模式,在SD卡进行读写操作时,同样需要先发送写命令和读命令,因此SD卡的命令格式就是学习SD卡的总要内容。SD卡的命令格式由6个字节组成,发送数据时高位在前,SD卡的写入命令格式如下图所示

Byte1:命令字的第一个字节为命令号(如CMD0、CMD1等)格式为“01xx xxxx”。命令号的最高位始终为0,是命令号的起始位;次高位始终为1,是命令号的发送位;第六位为具体的命令号(如CMD55,8'd55=8'b00110111’,命令号为01110111=0x77)。

Byte2~Byte5:命令参数,有些命令参数是保留位,没有定义参数的内容,保留位应设置为0。

Byte6:前七位为CRC(循环冗余校验)校验位,最后一位为停止位0。SD卡在SPI模式下默认不开启CRC校验,在SDIO模式下开启CRC校验,也就是说在SPI模式下,CRC校验位必须要发,但是SD卡在读到CRC校验位时会自动忽略它,所以校验位全部设置为1即可。需要注意的是,SD卡上电默认是SDIO模式,在接收SD卡返回CMD0的响应命令时,拉低片选CS,进入SPI模式。所以在发送CMD0命令的时候,SD卡处于SDIO模式,需要开启CRC校验。另外CMD8的CRC校验是始终启用的,也需要启用CRC校验。除了这两个命令,其他命令的CRC可以不用做校验。

        SD卡的命令分为标准命令(如CMD0)和应用相关命令(如ACMD41)。ACMD命令是特殊命令,发送方法同标准命令一样,但是在发送应用相关命令之前,必须先发送CMD55命令,告诉SD卡接下来发送的命令是应用相关命令,而非标准命令。发送完命令之后SD卡会返回响应命令的信息,不同的CMD命令会有不同类型的返回值,常用的返回值类型有R1类型、R3类型和R7类型(R7类型是CMD8命令专用)。SD卡的常用命令如下表所示:

SD卡返回类型R1数据格式如下图所示: 

        由上图可知,SD卡返回类型R1格式共返回1字节,最高位固定位0,其他分别表示对应状态的标志,高电平有效。

        SD卡返回类型R3数据格式如下图所示:

        由上图可知,SD卡返回类型R3格式共返回五个字节,首先返回的第一个字节为前面介绍的R1的内容,其余字节为OCR(Operation Conditions Register,操作条件寄存器)寄存器的内容

        SD卡返回类型R7数据格式如下图所示:

        由上图可知,SD卡返回类型R7格式共返回五个字节,首先返回的第一个字节为前面介绍的R1的内容,其余字节包含SD卡操作电压信息和校验字节等内容。其中电压范围是一个比较重要的参数。

        SD卡在正常读写操作之前,必须先对SD卡进行初始化,使其工作在预期的工作模式。SD卡1.0版本协议,和2.0版本协议在初始化的过程中有区别,只有SD2.0版本协议的SD卡才支持CMD8命令,所以响应此命令的SD卡可以判断为SD2.0版本协议的卡,否则为SD1.0版本协议的卡或者MMC卡;对于CMD8无响应的情况,可以发送CMD55+ACMD41命令,如果返回0,则表示SD1.0协议版本卡初始化成功,如果返回错误,则确定为MMC卡;在确定MMC卡后,继续向卡发送CMD1命令,如果返回0,则MMC卡初始化成功,否则判断为错误卡。

        SD2.0版本协议的SDHC卡,初始化步骤如下:

1. SD卡上电完成后,主机FPGA先对从机SD卡发送至少74个以上的同步时钟,在上电同步期间,片选CS引脚和MOSI引脚必须为高电平(MOSI引脚除发送命令或数据外,其余时刻都为高电平);

2. 拉低片选CS引脚,发送命令CMD0(0X40)复位SD卡,命令发送完成后等待SD卡返回响应数据;

3.SD卡返回响应数据后,先等待8个时钟周期在拉高片选CS信号,此时判断返回的响应数据。如果返回的数据为复位完成信号0x01,在接收返回信息期间片选CS为低电平,此时SD卡进入SPI模式,并开始进行下一步,如果返回值为其他值,则从新执行第二步。

4.拉低片选CS引脚,发送命令CMD8(0X48)查询SD卡的版本号,只有SD2.0版本的卡才支持此命令,命令发送完成后等待SD卡返回响应数据;

5. SD卡返回响应数据后,先等待8个时钟周期在拉高片选CS信号,此时判断返回的响应数据如果返回的电压范围为4'b0001即2.7V~3.6V,说明SD卡为2.0版本,进行下一步,否则从新执行第四步;

6. 拉低片选CS引脚,发送命令CMD55(0X77)告诉SD卡下一次发送的命令是应用相关命令,命令发送完成后等待SD卡返回响应数据;

7. SD卡返回响应数据后,先等待八个时钟周期再拉高片选CS信号,此时判断返回的响应数据。如果返回的数据为空闲信号0X01,开始进行下一步,否则从新执行第六步。

8. 拉低片选CS引脚,发送命令ACMD41(0x69)查询SD卡是否初始化完成,命令发送完成后等待SD卡返回响应数据;

9. SD卡返回响应数据后,先等待8个时钟周期在拉高片选CS信号,此时判断返回的响应数据。如果返回的数据为0x00,此时初始化完成,否则重新执行第六步。

        SD卡上电复位及初始化命令时序如下图所示:

        SD卡复位时序图:

SD卡初始化时序图:

        至此,SD卡完成了复位以及初始化操作,进入到SPI模式的读写操作。需要注意的是:SD卡在初始化的时候,SPI_CLK的时钟频率不能超过400KMZ,在初始化完成之后,在将SPI_CLK的时钟频率切换到SD卡的最大时钟频率。

        SD卡读写一次的数据量必须为512字节的整数倍,即对SD卡读写操作的最小数据量为512个字节。可以通过CMD16这个命令来配置单次读写操作的数据长度,以使每次读写的数据量为(n*512)个字节(n>=1),SD卡的默认配置是单次读写操作的数据量为512字节 。

        SD卡初始化完成后即可对SD卡进行读写测试,SD卡读写测试是先向SD卡中写入数据,再从SD卡中读出数据,并验证数据的正确性。SD卡的写操作时序图如下图所示:

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值