简述sd卡2.0协议_【正点原子FPGA连载】第三十九章 SD卡读写测试实验-摘自【正点原子】开拓者 FPGA 开发指南...

1)实验平台:正点原子开拓者FPGA 开发板

2)摘自《开拓者FPGA开发指南》关注官方微信号公众号,获取更多资料:正点原子

3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-13912-1-1.html

4c3203da521e02b26990c8d63f2fb068.png

第三十九章 SD卡读写测试实验

SD存储卡是一种基于半导体快闪记忆器的新一代记忆设备。它具有体积小、传输速度快、

支持热插拔等优点,在便携式装置领域得到了广泛的应用,如数码相机、多媒体播放器、笔记

本电脑等。本章我们将使用FPGA开发板学习如何对SD卡进行读写操作并进行SD卡的读写测试实

验。

本章包括以下几个部分:

39.1 SD卡简介

39.2 实验任务

39.3 硬件设计

39.4 程序设计

39.5 下载验证

SD卡简介

SD卡的英文全称是Secure Digital Card,即安全数字卡(又叫安全数码卡),是在MMC卡

(Multimedia Card,多媒体卡)的基础上发展而来,主要增加了两个特色:更高的安全性和

更快的读写速度。SD卡和MMC卡的长度和宽度都是32mm x 24mm,不同的是,SD卡的厚度为2.1mm,

而MMC卡的厚度为1.4mm,SD卡比MMC卡略厚,以容纳更大容量的存贮单元,同时SD卡比MMC卡触

点引脚要多,且在侧面多了一个写保护开关。SD卡与MMC卡保持着向上兼容,也就是说,MMC卡

可以被新的SD设备存取,兼容性则取决于应用软件,但SD卡却不可以被MMC设备存取。SD卡和

MMC卡可通过卡片上面的标注进行区分,如下图左侧图片上面标注为“MultiMediaCard”字母

样式的为MMC卡,右侧图片上面标注为“SD”字母样式的为SD卡。

图 39.1.1 MMC外观图(左)和SD卡外观图(右)

上图中右侧图片的SD卡实际上为SDHC卡,SD卡从存储容量上分为3个级别,分别为: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卡采用的协议规范、容量等级及支持的文件系统。

表 39.1.1 SD卡的类型、协议规范、容量等级及支持的文件系统

44ee7dbb086943b03bfa383fe6ece65a.png

cfd3a9289d4579b48dca2317b9d5933b.png

不同协议规范的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。不同等级的读写速度和应用如下图所示。

fda380d6127d9d37fde1c4b4a69af0bf.png

图 39.1.2 SD卡不同速度等级表示法

SD卡共有9个引脚线,可工作在SDIO模式或者SPI模式。在SDIO模式下,共用到CLK、CMD、

DAT[3:0]六根信号线;在SPI模式下,共用到CS(SDIO_DAT[3])、CLK(SDIO_CLK)、MISO

(SDIO_DAT[0])、MOSI(SDIO_CMD)四根信号线。

SD卡接口定义以及各引脚功能说明如图 39.1.3

所示。

5c5d74a645773ea12c5434e61b2fb8c9.png

图 39.1.3 SD卡接口定义以及各引脚功能说明

市面上除标准SD卡外,还有MicroSD卡(原名TF卡),是一种极细小的快闪存储器卡,是

由SanDisk(闪迪)公司发明,主要用于移动手机。MicroSD卡插入适配器(Adapter)可以转换成SD卡,其操作时序和SD卡是一样的。MicroSD卡接口定义以及各引脚功能说明如图 39.1.4所

示。

f90f20329d2a06fb05f2c419bf2c94ff.png

图 39.1.4 MicroSD卡接口定义以及各引脚功能说明

标准SD卡2.0版本中,工作时钟频率可以达到50Mhz,在SDIO模式下采用4位数据位宽,理

论上可以达到200Mbps(50Mx4bit)的传输速率;在SPI模式下采用1位数据位宽,理论上可以

达到50Mbps的传输速率。因此SD卡在SDIO模式下的传输速率更快,同时其操作时序也更复杂。

对于使用SD卡读取音乐文件和图片来说,SPI模式下的传输速度已经能够满足我们的需求,因

此我们本章采用SD卡的SPI模式来对SD卡进行读写测试。

SD卡在正常读写操作之前,必须先对SD卡进行初始化,SD卡的初始化过程就是向SD中写入

命令,使其工作在预期的工作模式。在对SD卡进行读写操作时同样需要先发送写命令和读命令,

因此SD卡的命令格式是学习SD卡的重要内容。SD卡的命令格式由6个字节组成,发送数据时高

位在前,SD卡的写入命令格式如下图所示:

8f3ddad0514e9019070e6a3a114131fb.png

图 39.1.5 SD卡命令格式

Byte1:命令字的第一个字节为命令号(如CMD0、CMD1等),格式为“0 1 x x x x x x”。

命令号的最高位始终为0,是命令号的起始位;次高位始终为1,是命令号的发送位;低6位为

具体的命令号(如CMD55,8’d55 = 8’b0011_0111,命令号为 0 1 1 1 0 1 1 1 = 0x77)。

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

为0。

Byte6:前7位为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卡的常用命令说明如下表(表 39.1.2)所示。

表 39.1.2 SD卡常用命令说明

ddf15068061c2ce368461fd5ca4a1b10.png

b2a8ea03a9fa53be936a4bbc3b1b010f.png

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

bfe25c6e98a51ca0e1b47e3f2cf21996.png

图 39.1.6 SD卡返回类型R1数据格式

由上图可知,SD卡返回类型R1格式共返回1个字节,最高位固定为0,其它位分别表示对应

状态的标志,高电平有效。

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

2be87300c627c5bc0154745419cfdc8a.png

图 39.1.7 SD卡返回类型R3数据格式

由上图可知,SD卡返回类型R3格式共返回5个字节,首先返回的第一个字节为前面介绍的

R1的内容,其余字节为OCR(Operation Conditions Register,操作条件寄存器)寄存器的内

容。

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

321785de93cfe1acba7c0a98c511c6f2.png

图 39.1.8 SD卡返回类型R7数据格式

由上图可知,SD卡返回类型R7格式共返回5个字节,首先返回的第一个字节为前面介绍的

R1的内容,其余字节包含SD卡操作电压信息和校验字节等内容。其中电压范围是一个比较重要

的参数,其具体内容如下所示:

Bit[11:8]:操作电压反馈

0:未定义

1:2.7V~3.6V

2:低电压

4:保留位

8:保留位

其它:未定义

SD卡在正常读写操作之前,必须先对SD卡进行初始化,使其工作在预期的工作模式。SD卡

1.0版本协议和2.0版本协议在初始化过程中有区别,只有SD2.0版本协议的SD卡才支持CMD8命

令,所以响应此命令的SD卡可以判断为SD2.0版本协议的卡,否则为SD1.0版本协议的SD卡或者

MMC卡;对于CMD8无响应的情况,可以发送CMD55 + ACMD41命令,如果返回0,则表示SD1.0协

议版本卡初始化成功,如果返回错误,则确定为MMC卡;在确定为MMC卡后,继续向卡发送CMD1

命令,如果返回0,则MMC卡初始化成功,否则判断为错误卡。

由于市面上大多采用SD2.0版本协议的SD卡,接下来我们仅介绍SD2.0版本协议的初始化流

程,以下提到的SD卡均代表基于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模式,并开始进行下一步,如果返回的值为其它值,则重新执行第

2步;

4、 拉低片选CS引脚,发送命令CMD8(0x48)查询SD卡的版本号,只有SD2.0版本的卡才

支持此命令,命令发送完成后等待SD卡返回响应数据;

5、 SD卡返回响应数据后,先等待8个时钟周期再拉高片选CS信号,此时判断返回的响应

数据。如果返回的电压范围为4’b0001即2.7V~3.6V,说明此SD卡为2.0版本,进行下一

步,否则重新执行第4步;

6、 拉低片选CS引脚,发送命令CMD55(0x77)告诉SD卡下一次发送的命令是应用相关

命令,命令发送完成后等待SD卡返回响应数据;

7、 SD卡返回响应数据后,先等待8个时钟周期再拉高片选CS信号,此时判断返回的响应

数据。如果返回的数据为空闲信号0x01,开始进行下一步,否则重新执行第6步。

8、 拉低片选CS引脚,发送命令ACMD41(0x69)查询SD卡是否初始化完成,命令发送完

成后等待SD卡返回响应数据;

9、 SD卡返回响应数据后,先等待8个时钟周期再拉高片选CS信号,此时判断返回的响应

数据。如果返回的数据为0x00,此时初始化完成,否则重新执行第6步。

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

d233ae067660f7c4f39710c982e93274.png

图 39.1.9 SD卡上电及复位命令时序图

至此,SD卡完成了复位以及初始化操作,进入到SPI模式的读写操作。需要注意的是:SD

卡在初始化的时候,SPI_CLK的时钟频率不能超过400KHz,在初始化完成之后,再将SPI_CLK的

时钟频率切换至SD卡的最大时钟频率。尽管目前市面上的很多SD卡支持以较快的时钟频率进行

初始化,为了能够兼容更多的SD卡,在SD卡初始化的时候时钟频率不能超过400KHz。

SD卡读写一次的数据量必须为512字节的整数倍,即对SD卡读写操作的最少数据量为512个

字节。我们可以通过命令CMD16来配置单次读写操作的数据长度,以使每次读写的数据量为

(n*512)个字节(n≥1),本次SD卡的读写操作使用SD卡默认配置,即单次读写操作的数据

量为512个字节。

SD卡初始化完成后,即可对SD卡进行读写测试,SD卡的读写测试是先向SD卡中写入数据,

再从SD卡中读出数据,并验证数据的正确性。SD卡的写操作时序图如下图所示:

77bc2ed7411ac05668eb250902dcea42.png

图 39.1.10 SD卡写操作时序图

SD卡的写操作流程如下:

1、 拉低片选CS引脚,发送命令CMD24(0x58)读取单个数据块,命令发送完成后等待

SD卡返回响应数据;

2、 SD卡返回正确响应数据0x00后,等待至少8个时钟周期,开始发送数据头0xfe;

3、 发送完数据头0xfe后,接下来开始发送512个字节的数据;

4、 数据发送完成后,发送2个字节的CRC校验数据。由于SPI模式下不对数据进行CRC校

验,直接发送两个字节的0xff即可;

5、 校验数据发送完成后,等待SD卡响应;

6、 SD卡返回响应数据后会进入写忙状态(MISO引脚为低电平),即此时不允许其它操

作。当检测到MISO引脚为高电平时,SD卡此时退出写忙状态;

7、 拉高CS引脚,等待8个时钟周期后允许进行其它操作。

SD卡的读操作时序图如下图所示:

811fb93552de49527d2c0a6e448cf963.png

图 39.1.11 SD卡读操作时序图

SD卡的读操作流程如下:

1、 拉低片选CS引脚,发送命令CMD17(0x51)读取单个数据块,命令发送完成后等待

SD卡返回响应数据;

2、 SD卡返回正确响应数据0x00后,准备开始解析SD卡返回的数据头0xfe;

3、 解析到数据头0xfe后,接下来接收SD卡返回的512个字节的数据;

4、 数据解析完成后,接下来接收两个字节的CRC校验值。由于SPI模式下不对数据进行

CRC校验,可直接忽略这两个字节;

5、 校验数据接收完成后,等待8个时钟周期;

6、 拉高片选CS引脚,等待8个时钟周期后允许进行其它操作。

在前面介绍的SD卡读写操作中,使用的是SD卡的SPI模式,即采用SPI协议进行读写操作。

SPI和IIC都是芯片上常用的通信协议,SPI相比于IIC具有更高的通信速率,但同时占用更多的

引脚线,接下来我们了解一下SPI的协议及传输时序。

SPI(Serial Peripheral interface)是由摩托罗拉公司定义的一种串行外围设备接口,

是一种高速、全双工、同步的通信总线,只需要四根信号线即可,节约引脚,同时有利于PCB

的布局。正是出于这种简单易用的特性,现在越来越多的芯片集成了SPI通信协议,如FLASH、

AD转换器等。

SPI的通信原理比较简单,它以主从方式工作,通常有一个主设备(此处指FPGA)和一个或多个从设备(此处指SD卡)。SPI通信需要四根线,分别为SPI_CS、SPI_CLK、SPI_MOSI和

SPI_MISO。其中SPI_CS、SPI_CLK和SPI_MOSI由主机输出给从机,而SPI_MISO由从机输出给主

机。SPI_CS用于控制芯片是否被选中,也就是说只有片选信号有效时(对于SD卡来说是低电平

有效),对芯片的操作才有效;SPI_CLK是由主机产生的同步时钟,用于同步数据;SPI_MOSI

和SPI_MISO是主机发送和接收的数据脚。

一般而言,SPI通信有4种不同的模式,不同的从设备在出厂时被厂家配置为其中一种模式,

模式是不允许用户修改的。主设备和从设备必须在同一模式下进行通信,否则数据会接收错误。

SPI的通信模式是由CPOL(时钟极性)和CPHA(时钟相位)来决定的,四种通信模式如下:

模式0:CPOL = 0,CPHA = 0;

模式1:CPOL = 0,CPHA = 1;

模式2:CPOL = 1,CPHA = 0

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值