STM32 SDIO驱动SD卡学习(理论篇)

目录

一、SD卡简介

1.1历史

1.2 tf卡和SD卡的区别

1.3 mmc,emmc,nand,flash的关系

1.4 SD卡的规格等级

1.4.1按容量分

1.4.2 class等级

1.4.3 UHS总线模式

1.4.4 UHS速度等级

1.4.5 VSC视频速度等级

二、SD卡的内部结构

三、SDIO的学习

3.1 SDIO的主要功能

3.2 SDIO总线拓扑

​3.3 SDIO功能描述 

3.3.1 SDIO适配器

3.3.2 SDIO AHB接口

3.4卡功能描述

3.4.1卡识别模式

3.4.2 卡复位

3.4.3 操作电压范围确认

3.4.4 卡识别过程

3.4.5 写数据块

3.4.6 读数据块

3.4.7 数据流操作,数据流写入和数据流读出(只适用于多媒体卡)

3.4.8 擦除:成组擦除和扇区擦除

3.4.9 宽总线选择和解除选择

3.4.10 保护管理

3.4.10 卡状态寄存器

3.4.12 SD状态寄存器

3.4 13 SD的I/O模式

3.4.14 命令与响应

3.5 响应格式

3.5.1 R1(普通响应命令)

3.5.2 R1b

3.5.3 R2(CID、 CSD寄存器)

3.5.4 R3(OCR寄存器)

3.5.5 R4(快速I/O)

3.5.6 R4b

3.5.7 R5(中断请求)

3.5.8 R6(中断请求)

3.6 SDIO I/O卡特定的操作

3.6.1 使用SDIO_D2 信号线的SDIO I/O读等待操作

3.6.2 使用停止SDIO_CK的SDIO读等待操作

3.6.3 SDIO暂停/恢复操作

3.6.4 SDIO中断

3.7 CE-ATA特定操作

3.7.1 命令完成指示关闭

3.7.2 命令完成指示使能

3.7.3 CE-ATA中断

3.7.4 中止CMD61

3.8 硬件流控制


参考:

SD卡_百度百科

eMMC_百度百科

MMC(影院)_百度百科

MMC是什么-太平洋IT百科

Nand flash_百度百科

SD卡规格等级区别总结 – 知乎

《STM32中文参考手册》

ARM cortex-M3权威指南》

《SD Card Specification(V1.0)》

一、SD卡简介

1.1历史

        MMC(Multi-Media Card,多媒体卡)由西门子公司Siemens和SanDisk于1997年推出。由于它的封装技术较为先进,7针引脚,体积小、重量轻、非常符合移动存储的需要。MMC支持1bit模式,20MHz时钟,采用总线结构。 

        MMC卡在SM卡基础上诞生替代了东芝开发的SM卡。不久的几年后,在MMC卡基础上研发的SD卡又替代了MMC卡,成为了几乎一切便携式数码产品存储卡格式。 

SD卡结构

        SD卡是由松下电器东芝SanDisk联合推出,1999年8月发布。SD卡的数据传送和物理规范由MMC发展而来,大小和MMC卡差不多,尺寸为32mmx24mmx2.1mm。长宽和MMC卡一样,只是比MMC卡厚了0.7mm,以容纳更大容量的存贮单元。与MMC卡保持着向上的兼容,MMC卡可以被新的SD设备存取,兼容性则取决于应用软件,但SD卡却不可以被MMC设备存取。(SD卡外型采用了与MMC卡厚度一样的导轨式设计,以使SD设备可以适合MMC卡)。

         SD卡是东芝在MMC卡技术中加入加密技术硬件而成,由于MMC卡可能会较易让使用者复制数码音乐,东芝便加入这些技术希望令音乐业界安心。类似的技术包括索尼MagicGate,理论上加密技术可引入一些数码版权管理措施,但这功能甚少被应用。

        SD系列记忆卡都是SanDisk完成测试后送交SD卡协会认证规格,因此几乎所有专利权都掌控在SanDisk手上。不过在2007年,因为NAND市场的动荡SanDisk变卖了家当,给外界一种即将消失错觉。失去了很多自己的核心技术和专利,最重要的NAND工厂都卖给了美光。没多久,重新吸引外资换了脸面的SanDisk,无心再研发Flash技术和建立新厂。而是注资东芝与东芝合作,使用东芝制造工艺和技术生产芯片。之后东芝试产的新产品都会有两个品牌的LOGO。SD卡也不例外,两个品牌的产品拥有着很多相似之处,这两个牌子也是SD卡市场的主要供货来源。

        希望未来可以有国产的规则,而不用在去遵守他们的规则。

1.2 tf卡和SD卡的区别

 

        1、定义不同。SD卡是一个完全开放的标准(系统),多用于MP3、数码摄像机、数码相机、电子图书、AV器材等等TF卡又称microSD,是一种极细小的快闪存储器卡,由著名的存储厂商闪迪(SanDisk)公司发明创立。
        2、外观大小不同。TF卡又称T-Flash卡,全名: TransFLash,又名:MicroSD,由摩托罗拉与SANDISK共同研发,是目前一种超小型微型卡,其大小仅为11x15x1MM,约为SD卡的1/4。
        3、产品不同。目前基本所有的手机都使用的是TF卡,这主要是由于TF卡体积更小,更利于节省空间,而一般传统的SD卡则主要用于用于MP3、数码摄像机、数码相机、电子图书、AV器材等,不过TF卡也可以安装卡套充当SD卡来使用,SD卡由于体积较大,不能使用TF卡插槽。
        4、适用范围不同。TF卡是功能机必搭储存卡,且体积极小,所以主要应用于手机。随着TF卡存储容量的提升,它也量慢开始在GPS设备、便携式音乐播放器和一些闪存盘中得到使用。SD卡不仅体积小,而且数据传输速度快、可热插拔,所以在便携式装置领域的应用比较广泛。
        5、安全性能不同。一般来说,市面上的SD卡在卡的侧面会设置一个安全锁定的读写保护开关,可以有效地保护SD卡中的各类数据和信息,防止误删,安全性好。而TF卡由于体积比较小,就不具备这个功能,相对来说安全性不如SD卡。
        6、原理不同。TF卡全称为Trans-flashCard,又称MicroSD卡,是一种极细小的快闪存储器卡,俗称小卡。简单来说可以看作是一种记忆卡,使用了相对来说比较新的NANDMLC技术。SD卡全称为SecureDigitalMemoryCard,是一种基于半导体快闪记忆器的记忆设备,被发明出来的时间比较早,俗称大卡,是一种发展时间比较久的内存卡。

现在使用他们其实方法都是一样的,只是他们的引脚数量和体积有所不同加上,大卡的安全性高点。

1.3 mmc,emmc,nand,flash的关系

        核心都是flash,nand是一种flash,但是它的接口很恶心,所以在上面封装了一下,出现了emmc接口标准,但是emmc不是单纯的flash,他是有一块关系闪存的IC在里面的,这俩加一起构成了我们现在启动单片机所选择模式中的emmc模式。

        mmc和他们不同,是一种对卡形状的规范。它规定了卡的形状,尺寸和通信协议。

1.4 SD卡的规格等级

        存储卡有很多种类,CF卡、记忆棒、SD卡、XD卡、MMC卡、MS卡、TF卡、MicroSD卡等。平时最常见的有SD卡和MicroSD卡两种, SD卡和MicroSD只是两张卡的大小不同,规格版本是完全相同的,均由SD卡协会推出。

        SD卡有不少规范,常用包含存储空间和存储速度两种,厂商会把满足的规范的图标印在卡面上,所以通过卡上有的规格,就能很快判断出这张卡的容量、类型和最低速度,甚至适用场景。这样,在购买存储卡时便能够自己判断出是否为自己需要的卡。MicroSD卡的规范和SD卡相同。

1.4.1按容量分

这几种类别表示卡的容量大小:

SD:早期版本现在已经基本停用,最高容量2GB,分区格式为FAT12(FAT)或FAT16。

SDHC:技术很成熟的种类,容量为4GB-32GB,分区格式为FAT32。

SDXC:目前市场存储卡的主流,容量为64GB-2TB,分区格式为exFAT。

SDUC:新推出的版本,容量为2TB-128TB,分区格式为exFAT。

这些类别都是向下兼容的,例如使用SDXC的设备,一般也能使用SDHC。分类主要是因为使用的文件系统有区别。

1.4.2 class等级

存储卡的Class等级主要是标识存储卡的最低写入速度,Class后面的数字就代表了存储卡最低写入速度:

Class 2 2MB/s

Class 4 4MB/s

Class 6 6MB/s

Class 10 10MB/s

存储卡的“最低写入速度”一般是最重要的,表示存储卡稳定使用的速度。Class等级越高传输速度越快,现在比较常见的都是速度最快的Class 10级别,简称C10。速度更低的C6、C4、C2的存储卡早已退出市场。

1.4.3 UHS总线模式

UHS(Ultra High Speed)超高速等级为全新的总线模式,目前有UHS-I、UHS-II、UHS-III三个等级划分,I的个数越多,接口支持的速度越高,目前UHS-III的存储卡市场上很少见。

支持UHS-I的SD卡最大读取速度可达104MB/s

支持UHS-II的SD卡最大读取速度可达312MB/s

支持UHS-III的SD卡最大读取速度可达624MB/s

SD Express I,最大读取速度可达985MB/s

实现UHS标准传输速度需要设备支持,高版本向下兼容低版本,不支持该标准可以兼容降速为普通存储卡使用。

1.4.4 UHS速度等级

UHS速度等级也是标识存储卡的最低写入速度,日常使用U1(最低写入速度10M/S)和U3(最低写入速度30M/S)的等级标识最低写入速度。

U1 10MB/s

U3 30MB/s

UHS速度等级在存储卡上的标志为字母U,中间包含等级的数字。此处的数字和UHS总线模式无关,即UHS-I的存储卡,也能达到U3的速度等级。

1.4.5 VSC视频速度等级

VSC(Video Speed Class)视频速度等级,是SD协会针对视频拍摄应用制定的视频速度等级,以识别字母V加上最低写入速度值的数字构成标识。V后面的数字为几,就代表最低写入速度为多少,即:V10最低写入速度10M/S;V30最低写入速度30M/S。VSC视频速度等级有如下几种:

V6 6MB/s

V10 10MB/s

V30 30MB/s

V60 60MB/s

V90 90MB/s

如果想支持拍摄4K高清视频,一般需要V30或者V60等级的存储卡。

二、SD卡的内部结构

上面两图描述了SDIO模式下的两种存储卡的接线

注意上下的图片中的箭头方向。

下面再看看SPI方式

 

后续我会录制一个讲解视频的。

到时候放到评论区

三、SDIO的学习

3.1 SDIO的主要功能

        SD/SDIO MMC卡主机模块(SDIO)在AHB外设总线和多媒体卡(MMC)、SD存储卡、SDIO卡和 CE-ATA设备间提供了操作接口。

         多媒体卡系统规格书由MMCA技术委员会发布,可以在多媒体卡协会的网站上(www.mmca.org) 获得。

        CE-ATA系统规格书可以在CE-ATA工作组的网站上(www.ce-ata.org)获得。

        SDIO的主要功能如下:

● 与多媒体卡系统规格书版本4.2全兼容。支持三种不同的数据总线模式:1位(默认)、4位和8 位。

● 与较早的多媒体卡系统规格版本全兼容(向前兼容)。

● 与SD存储卡规格版本2.0全兼容。

● 与SD I/O卡规格版本2.0全兼容:支持良种不同的数据总线模式:1位(默认)和4位。

● 完全支持CE-ATA功能(与CE-ATA数字协议版本1.1全兼容)。

● 8位总线模式下数据传输速率可达48MHz。

● 数据和命令输出使能信号,用于控制外部双向驱动器。

注:

1.SDIO没有SPI兼容的通信模式

2.在多媒体卡系统规格书版本2.11中,定义SD存储卡协议是多媒体卡协议的超集。只支持I/O 模式的SD卡或复合卡中的I/O部分不能支持SD存储设备中很多需要的命令,这里有些命令在SD I/O设备中不起作用,如擦除命令,因此SDIO不支持这些命令。另外,SD存储卡和SD I/O卡中 有些命令是不同的,SDIO也不支持这些命令。细节可以参考SD I/O卡规格书版本1.0。使用现有 的MMC命令机制,在MMC接口上可以实现CE-ATA的支持 。SDIO接口的电气和信号定义详见 MMC参考资料。 多媒体卡/SD总线将所有卡与控制器相连。 当前版本的SDIO在同一时间里只能支持一个SD/SDIO/MMC 4.2卡,但可以支持多个MMC版本 4.1或以前版本的卡。

3.2 SDIO总线拓扑

总线上的通信是通过传送命令和数据实现。
在多媒体卡/SD/SD I/O总线上的基本操作是命令/响应结构,这样的总线操作在命令或总线机制
下实现信息交换;另外,某些操作还具有数据令牌。
在SD/SDIO存储器卡上传送的数据是以数据块的形式传输;在MMC上传送的数据是以数据块或
数据流的形式传输;在CE-ATA设备上传送的数据也是以数据块的形式传输。

 注: 当有Busy(繁忙)信号时, SDIO(SDIO_D0被拉低)将不会发送任何数据

 

3.3 SDIO功能描述 

SDIO包含2个部分:
● SDIO适配器模块:实现所有MMC/SD/SD I/O卡的相关功能,如时钟的产生、命令和数据的
传送。
● AHB总线接口:操作SDIO适配器模块中的寄存器,并产生中断和DMA请求信号。
 

 

复位后默认情况下SDIO_D0用于数据传输。初始化后主机可以改变数据总线的宽度。
如果一个多媒体卡接到了总线上,则SDIO_D0、 SDIO_D[3:0]或SDIO_D[7:0]可以用于数据传
输。 MMC版本V3.31和之前版本的协议只支持1位数据线,所以只能用SDIO_D0。
如 果 一 个 SD 或 SD I/O 卡 接 到 了 总 线 上 , 可 以 通 过 主 机 配 置 数 据 传 输 使 用 SDIO_D0 或
SDIO_D[3:0]。所有的数据线都工作在推挽模式。
SDIO_CMD有两种操作模式:
● 用于初始化时的开路模式(仅用于MMC版本V3.31或之前版本)
● 用于命令传输的推挽模式(SD/SD I/O卡和MMC V4.2在初始化时也使用推挽驱动)
SDIO_CK是卡的时钟:每个时钟周期在命令和数据线上传输1位命令或数据。对于多媒体卡
V3.31协议,时钟频率可以在0MHz至20MHz间变化;对于多媒体卡V4.0/4.2协议,时钟频率可
以在0MHz至48MHz间变化;对于SD或SD I/O卡,时钟频率可以在0MHz至25MHz间变化。
SDIO使用两个时钟信号:
● SDIO适配器时钟(SDIOCLK=HCLK)
● AHB总线时钟(HCLK/2)
下表适用于多媒体卡/SD/SD I/O卡总线:
 

3.3.1 SDIO适配器

 

SDIO适配器是多媒体/加密数字存储卡总线的主设备(主机),用于连接一组多媒体卡或加密数字
存储卡,它包含以下5个部分:
● 适配器寄存器模块
● 控制单元
● 命令通道
● 数据通道
● 数据FIFO

注: 适配器寄存器和FIFO使用AHB总线一侧的时钟(HCLK/2),控制单元、命令通道和数据通道使用。

SDIO适配器一侧的时钟(SDIOCLK)。
适配器寄存器模块
适配器寄存器模块包含所有系统寄存器。该模块还产生清除多媒体卡中静态标记的信号,当在
SDIO清除寄存器中的相应位写’1’时会产生清除信号。
控制单元
控制单元包含电源管理功能和为存储器卡提供的时钟分频。
共有三种电源阶段:
● 电源关闭
● 电源启动
● 电源开
 上图为控制单元的框图,有电源管理和时钟管理子单元。
在电源关闭和电源启动阶段,电源管理子单元会关闭卡总线上的输出信号。
时钟管理子单元产生和控制SDIO_CK信号。 SDIO_CK输出可以使用时钟分频或时钟旁路模式。
下述情况下没有时钟输出:
● 复位后
● 在电源关闭和电源启动阶段
● 当启动了省电模式并且卡总线处于空闲状态(命令通道和数据通道子单元进入空闲阶段后的8
个时钟周期)
命令通道
命令通道单元向卡发送命令并从卡接收响应。

● 命令通道状态机(CPSM)
─ 当写入命令寄存器并设置了使能位,开始发送命令。命令发送完成时,命令通道状态机
(CPSM)设置状态标志并在不需要响应时进入空闲状态(见下图)。当收到响应后,接收到
的CRC码将会与内部产生的CRC码比较,然后设置相应的状态标志。
 

        当进入等待(Wait)状态时,命令定时器开始运行;当CPSM进入接收(Receive)状态之前,产生了超时,则设置超时标志并进入空闲(Idle)状态。
注: 命令超时固定为64个SDIO_CK时钟周期。
        如果在命令寄存器设置了中断位,则关闭定时器, CPSM等待某一个卡发出的中断请求。如果命令寄存器中设置挂起位, CPSM进入挂起(Pend)状态并等待数据通道子单元发出的CmdPend
信号,在检测到CmdPend信号时, CPSM进入发送(Send)状态,这将触发数据计数器发送停止
命令的功能。
注: CPSM保持在空闲状态至少8个SDIO_CK周期,以满足NCC和NRC时序限制。 NCC是两个主机命令间的最小间隔; NRC是主机命令与卡响应之间的最小间隔。


 

● 命令格式

─ 命令:命令是用于开始一项操作。主机向一个指定的卡或所有的卡发出带地址的命令或广
播命令(广播命令只适合于MMC V3.31或之前的版本)。命令在CMD线上串行传送。所有
命令的长度固定为48位,下表给出了多媒体卡、 SD存储卡和SDIO卡上一般的命令格式。
 

CE-ATA命令是MMC V4.2命令的扩充,所以具有相同的格式。

命令通道操作于半双工模式,这样命令和响应可以分别发送和接收。如果CPSM不处在发
送状态, SDIO_CMD输出处于高阻状态,如图189所示。 SDIO_CMD上的数据与
SDIO_CK的上升沿同步。

响应:响应是由一个被指定地址的卡发送到主机,对于MMC V3.31或以前版本所有的卡
同时发送响应;响应是对先前接收到命令的一个应答。响应在CMD线上串行传送。
SDIO支持2种响应类型, 2种类型都有CRC错误检测:
● 48位短响应
● 136位长响应
注: 如果响应不包含CRC(如CMD1的响应),设备驱动应该忽略CRC失败状态

命令寄存器包含命令索引(发至卡的6位)和命令类型;命令本身决定了是否需要响应和响应的类
型、 48位还是136位(见20.9.4节)。命令通道中的状态标志示于下表:
 CRC发生器计算CRC码之前所有位的CRC校验和,包括开始位、发送位、命令索引和命令参数
(或卡状态)。对于长响应格式, CRC校验和计算的是CID或CSD的前120位;注意,长响应格式
中的开始位、传输位和6个保留位不参与CRC计算。
CRC校验和是一个7位的数值:
CRC[6:0] = 余数[(M(x) * x7) / G(x)]
G(x) = x7 + x3 + 1
M(x) = (开始位) * x39 + … + (CRC前的最后一位) * x0, 或
M(x) = (开始位) * x119 + … + (CRC前的最后一位) * x0, 或
数据通道
数据通道子单元在主机与卡之间传输数据。下图是数据通道的框图

在时钟控制寄存器中可以配置卡的数据总线宽度。如果选择了4位总线模式,则每个时钟周期四
条数据信号线(SDIO_D[3:0])上将传输4位数据;如果选择了8位总线模式,则每个时钟周期八条
数据信号线(SDIO_D[7:0])上将传输8位数据;如果没有选择宽总线模式,则每个时钟周期只在
SDIO_D0上传输1位数据。
根据传输的方向(发送或接收),使能时数据通道状态机(DPSM)将进入Wait_S或Wait_R状态:
● 发送: DPSM进入Wait_S状态。如果发送FIFO中有数据,则DPSM进入发送状态,同时数
据通道子单元开始向卡发送数据。
● 接收: DPSM进入Wait_R状态并等待开始位;当收到开始位时, DPSM进入接收状态,同
时数据通道子单元开始从卡接收数据。
数据通道状态机(DPSM)
DPSM工作在SDIO_CK频率,卡总线信号与SDIO_CK的上升沿同步。 DPSM有6个状态,如下
图所示
 

● 空闲(Idle):数据通道不工作, SDIO_D[7:0]输出处于高阻状态。当写入数据控制寄存器并设
置使能位时, DPSM为数据计数器加载新的数值,并依据数据方向位进入Wait_S或Wait_R
状态。
● Wait_R:如果数据计数器等于0,当接收FIFO为空时DPSM进入到空闲(Idle)状态。如果数
据计数器不等于0, DPSM等待SDIO_D上的开始位。如果DPSM在超时之前接收到一个开
始位,它会进入接收(Receive)状态并加载数据块计数器。如果DPSM在检测到一个开始位
前出现超时,或发生开始位错误, DPSM将进入空闲状态并设置超时状态标志。
● 接收(Receive):接收到的串行数据被组合为字节并写入数据FIFO。根据数据控制寄存器中
传输模式位的设置,数据传输模式可以是块传输或流传输:
─ 在块模式下,当数据块计数器达到0时, DPSM等待接收CRC码,如果接收到的代码与内
部产生的CRC码匹配,则DPSM进入Wait_R状态,否则设置CRC失败状态标志同时
DPSM进入到空闲状态。
─ 在流模式下,当数据计数器不为0时, DPSM接收数据;当计数器为0时,将移位寄存器中
的剩余数据写入数据FIFO,同时DPSM进入Wait_R状态。
如果产生了FIFO上溢错误, DPSM设置FIFO的错误标志并进入空闲状态。
● Wait_S:如果数据计数器为0, DPSM进入空闲状态;否则DPSM等待数据FIFO空标志消失
后,进入发送状态。
注: DPSM会在Wait_S状态保持至少2个时钟周期,以满足NWR的时序要求, NWR是接收到卡的响应
至主机开始数据传输的间隔。
● 发送(Send): DPSM开始发送数据到卡设备。根据数据控制寄存器中传输模式位的设置,数
据传输模式可以是块传输或流传输:

在块模式下,当数据块计数器达到0时, DPSM发送内部产生的CRC码,然后是结束位,
并进入繁忙状态。
在流模式下,当使能位为高同时数据计数器不为0时, DPSM向卡设备发送数据,然后进
入空闲状态。

如果产生了FIFO下溢错误, DPSM设置FIFO的错误标志并进入空闲状态。
● 繁忙(Busy): DPSM等待CRC状态标志:


如果没有接收到正确的CRC状态,则DPSM进入空闲状态并设置CRC失败状态标志。
如果接收到正确的CRC状态,则当SDIO_D0不为低时(卡不繁忙)DPSM进入Wait_S状
态。

当DPSM处于繁忙状态时发生了超时, DPSM则设置数据超时标志并进入空闲状态。
当DPSM处于Wait_R或繁忙状态时,数据定时器被使能,并能够产生数据超时错误:
─ 发送数据时,如果DPSM处于繁忙状态超过程序设置的超时间隔,则产生超时。

接收数据时,如果未收完所有数据,并且DPSM处于Wait_R状态超过程序设置的超时间
隔,则产生超时。

● 数据:数据可以从主机传送到卡,也可以反向传输。数据在数据线上传输。数据存储在一
个32字的FIFO中,每个字为32位宽。

数据FIFO
数据FIFO(先进先出)子单元是一个具有发送和接收单元的数据缓冲区。
FIFO包含一个每字32位宽、共32个字的数据缓冲区,和发送与接收电路。因为数据FIFO工作在
AHB时钟区域(HCLK/2),所有与SDIO时钟区域(SDIOCLK)连接的信号都进行了重新同步。
依据TXACT和RXACT标志,可以关闭FIFO、使能发送或使能接收。 TXACT和RXACT由数据通
道子单元设置而且是互斥的:
─ 当TXACT有效时,发送FIFO代表发送电路和数据缓冲区
─ 当RXACT有效时,接收FIFO代表接收电路和数据缓冲区
● 发送FIFO:当使能了SDIO的发送功能,数据可以通过AHB接口写入发送FIFO。
发送FIFO有32个连续的地址。发送FIFO中有一个数据输出寄存器,包含读指针指向的数据
字。当数据通道子单元装填了移位寄存器后,它移动读指针至下个数据并传输出数据。
如果未使能发送FIFO,所有的状态标志均处于无效状态。当发送数据时,数据通道子单元
设置TXACT为有效。
 

● 接收FIFO:当数据通道子单元接收到一个数据字,它会把数据写入FIFO,写操作结束后,
写指针自动加一;在另一端,有一个读指针始终指向FIFO中的当前数据。如果关闭了接收
FIFO,所有的状态标志会被清除,读写指针也被复位。在接收到数据时数据通道子单元设
置RXACT。下表列出了接收FIFO的状态标志。通过32个连续的地址可以访问接收FIFO。
 

3.3.2 SDIO AHB接口

 AHB接口产生中断和DMA请求,并访问SDIO接口寄存器和数据FIFO。它包含一个数据通道、
寄存器译码器和中断/DMA控制逻辑。
SDIO中断
当至少有一个选中的状态标志为高时,中断控制逻辑产生中断请求。有一个屏蔽寄存器用于选
择可以产生中断的条件,如果设置了相应的屏蔽标志,则对应的状态标志可以产生中断。
SDIO/DMA接口:在SDIO和存储器之间数据传输的过程
在下面的例子中,主机控制器使用CMD24(WRITE_BLOCK)从主机传送512字节到MMC卡,
DMA控制器用于从存储器向SDIO的FIFO填充数据。
1. 执行卡识别过程
2. 提高SDIO_CK频率
3. 发送CMD7命令选择卡
4. 按下述步骤配置DMA2:
        a) 使能DMA2控制器并清除所有的中断标志位
        b) 设置DMA2通道4的源地址寄存器为存储器缓冲区的基地址, DMA2通道4的目标地址寄
        存器为SDIO_FIFO寄存器的地址
        c) 设置DMA2通道4控制寄存器(存储器递增,非外设递增,外设和源的数据宽度为字宽度)
        d) 使能DMA2通道4
5. 发送CMD24(WRITE_BLOCK),操作如下:
        a) 设置SDIO数据长度寄存器(SDIO数据时钟寄存器应该在执行卡识别过程之前设置好)
        b) 设置SDIO参数寄存器为卡中需要传送数据的地址
        c) 设置SDIO命令寄存器: CmdIndex置为24(WRITE_BLOCK); WaitRest置为1(SDIO卡
        主机等待响应); CPSMEN置为1(使能SDIO卡主机发送命令),保持其它域为他们的复
        位值。
        d) 等待SDIO_STA[6]=CMDREND中断,然后设置SDIO数据寄存器: DTEN置为1(使能
        SDIO卡主机发送数据); DTDIR置为0(控制器至卡方向); DTMODE置为0(块数据传
        送); DMAEN置为1(使能DMA); DBLOCKSIZE置为9(512字节);其它域不用设置。
        e) 等待SDIO_STA[10]=DBCKEND

6. 查询DMA通道的使能状态寄存器,确认没有通道仍处于使能状态

3.4卡功能描述

3.4.1卡识别模式

        在卡识别模式,主机复位所有的卡、检测操作电压范围、识别卡并为总线上每个卡设置相对地址(RCA)。在卡识别模式下,所有数据通信只使用命令信号线(CMD)。

3.4.2 卡复位

        GO_IDLE_STATE命令(CMD0)是一个软件复位命令,它把多媒体卡和SD存储器置于空闲状
态。 IO_RW_DIRECT命令(CMD52)复位SD I/O卡。上电后或执行CMD0后,所有卡的输出端都
处于高阻状态,同时所有卡都被初始化至一个默认的相对卡地址(RCA=0x0001)和默认的驱动器
寄存器设置(最低的速度,最大的电流驱动能力)。

 

3.4.3 操作电压范围确认

        所有的卡都可以使用任何规定范围内的电压与SDIO卡主机通信,可支持的最小和最大电压VDD数值由卡上的操作条件寄存器(OCR)定义。
        内部存储器存储了卡识别号(CID)和卡特定数据(CSD)的卡,仅能在数据传输VDD条件下传送这些信息。当SDIO卡主机模块与卡的VDD范围不一致时,卡将不能完成识别周期,也不能发送CSD数据;因此,在VDD范围不匹配时, SDIO卡主机可以用下面几个特殊命令去识别和拒绝卡:
SEND_OP_COND(CMD1) 、 SD_APP_OP_COND(SD 存 储 卡 的 ACMD41) 和
IO_SEND_OP_COND(SD I/O卡的CMD5)。 SDIO卡主机在执行这几个命令时会产生需要的VDD
电压。不能在指定的电压范围进行数据传输的卡,将从总线断开并进入非激活状态。
        使用这些不包含电压范围作为操作数的命令, SDIO卡主机能够查询每个卡并在确定公共的电压范围前,把不在此范围内的卡置于非激活状态。当SDIO卡主机能够选择公共的电压范围或用户
需要知道卡是否能用时, SDIO卡主机可以进行这样的查询。

3.4.4 卡识别过程

        多媒体卡和SD卡的卡识别过程是有区别的;对于多媒体卡,卡识别过程以时钟频率Fod开始,所有SDIO_CMD输出为开路驱动,允许在这个过程中的卡的并行连接,识别过程如下:
1. 总线被激活
2. SDIO卡主机广播发送SEND_OP_COND(CMD1)命令,并接收操作条件
3. 得到的响应是所有卡的操作条件寄存器内容的“线与”
4. 不兼容的卡会被置于非激活状态
5. SDIO卡主机广播发送ALL_SEND_CID(CMD2)至所有激活的卡
6. 所有激活的卡同时串行地发送他们的CID号,那些检测到输出的CID位与命令线上的数据
不相符的卡必须停止发送,并等待下一个识别周期。最终只有一个卡能够成功地传送完整
的CID至SDIO卡主机并进入识别状态。
7. SDIO卡主机发送SET_RELATIVE_ADDR(CMD3)命令至这个卡,这个新的地址被称为相
对卡地址(RCA),它比CID短,用于对卡寻址。至此,这个卡转入待机状态,并不再响应
新的识别过程,同时它的输出驱动从开路转变为推挽模式。
8. SDIO卡主机重复上述步骤5至7,直到收到超时条件。

        对于SD卡而言,卡识别过程以时钟频率Fod开始,所有SDIO_CMD输出为推挽驱动而不是开路驱动,识别过程如下:
1. 总线被激活
2. SDIO卡主机广播发送SEND_APP_OP_COND(ACMD41)命令
3. 得到的响应是所有卡的操作条件寄存器的内容
4. 不兼容的卡会被置于非激活状态
5. SDIO卡主机广播发送ALL_SEND_CID(CMD2)至所有激活的卡
6. 所有激活的卡发送回他们唯一卡识别号(CID)并进入识别状态。
7. SDIO卡主机发送SET_RELATIVE_ADDR(CMD3)命令和一个地址到一个激活的卡,这个
新的地址被称为相对卡地址(RCA),它比CID短,用于对卡寻址。至此,这个卡转入待机
状态。 SDIO卡主机可以再次发送该命令更改RCA,卡的RCA将是最后一次的赋值。
8. SDIO卡主机对所有激活的卡重复上述步骤5至7。

        对于SD I/O卡而言,卡识别过程如下:
1. 总线被激活
2. SDIO卡主机发送IO_SEND_OP_COND(CMD5)命令
3. 得到的响应是卡的操作条件寄存器的内容
4. 不兼容的卡会被置于非激活状态

5. SDIO卡主机发送SET_RELATIVE_ADDR(CMD3)命令和一个地址到一个激活的卡,这个
新的地址被称为相对卡地址(RCA),它比CID短,用于对卡寻址。至此,这个卡转入待机
状态。 SDIO卡主机可以再次发送该命令更改RCA,卡的RCA将是最后一次的赋值
 

3.4.5 写数据块

        执行写数据块命令(CMD24-27)时,主机把一个或多个数据块从主机传送到卡中,同时在每个数据块的末尾传送一个CRC码。一个支持写数据块命令的卡应该始终能够接收由WRITE_BL_LEN
定义的数据块。如果CRC校验错误,卡通过SDIO_D信号线指示错误,传送的数据被丢弃而不
被写入,所有后续(在多块写模式下)传送的数据块将被忽略。
        如果主机传送部分数据,而累计的数据长度未与数据块对齐,当不允许块错位(未设置CSD的参数WRITE_BLK_MISALIGN),卡将在第一个错位的块之前检测到块错位错误(设置状态寄存器中
的ADDRESS_ERROR错误位)。当主机试图写一个写保护区域时,写操作也会被中止,此时卡
会设置WP_VIOLATION位。
        设置CID和CSD寄存器不需要事先设置块长度,传送的数据也是通过CRC保护的。如果CSD或CID寄存器的部分是存储在ROM中,则这个不能更改的部分必须与接收缓冲区的对应部分相一
致,如果有不一致之处,卡将报告一个错误同时不修改任何寄存器的内容。有些卡需要长的甚
至不可预计的时间完成写一个数据块,在接收一个数据块并完成CRC检验后,卡开始写操作,
如果它的写缓冲区已经满并且不能再从新的WRITE_BLOCK命令接受新的数据时,它会把
SDIO_D信号线拉低。主机可以在任何时候使用SEND_STATUS(CMD13)查询卡的状态,卡将
返回当前状态。 READY_FOR_DATA状态位指示卡是否可以接受新的数据或写操作是否还在进
行。主机可以使用CMD7(选择另一个卡)不选中某个卡,而把这个卡置于断开状态,这样可以释
放SDIO_D信号线而不中断未完成的写操作;当重新选择了一个卡,如果写操作仍然在进行并且
写缓冲区仍不能使用,它会重新通过拉低SDIO_D信号线指示忙的状态。

3.4.6 读数据块

        在读数据块模式下,数据传输的基本单元是数据块,它的大小在CSD中(READ_BL_LEN)定义。如果设置了READ_BL_PARTIAL,同样可以传送较小的数据块,较小数据块是指开始和结束地址完全包含在一个物理块中, READ_BL_LEN定义了物理块的大小。为保证数据传输的正确,
每个数据块后都有一个CRC校验码。 CMD17(READ_SINGLE_BLOCK)启动一次读数据块操
作,在传输结束后卡返回到发送状态。
        CMD18(READ_MULTIPLE_BLOCK)启动一次连续多个数据块的读操作。
        主机可以在多数据块读操作的任何时候中止操作,而不管操作的类型。发送停止传输命令即可中止操作。
        如果在多数据块读操作中(任一种类型)卡检测到错误(例如:越界、地址错位或内部错误),它将停止数据传输并仍处于数据状态;此时主机必须发送停止传输命令中止操作。在停止传输命令
的响应中报告读错误。
        如果主机发送停止传输命令时,卡已经传输完一个确定数目的多个数据块操作中的最后一个数据块,因为此时卡已经不在数据状态,主机会得到一个非法命令的响应。如果主机传输部分数
据块,而累计的数据长度不能与物理块对齐同时不允许块错位,卡会在出现第一个未对齐的块
时检测出一个块对齐错误,并在状态寄存器中设置ADDRESS_ERROR错误标志。

3.4.7 数据流操作,数据流写入和数据流读出(只适用于多媒体卡)
 

在数据流模式,数据按字节传输,同时每个数据块后没有CRC。
数据流写(只适用于多媒体卡)
WRITE_DAT_UNTIL_STOP(CMD20)开始从SDIO卡主机至卡的数据传输,从指定的地址开始
连续传输直到SDIO卡主机发出一个停止命令。如果允许部分数据块传输(设置了CSD参数
WRITE_BL_PARTIAL),则数据流可以在卡的地址空间中的任意地址开始和停止,否则数据流
只能在数据块的边界开始和停止。因为传输的数据数目没有事先设定,不能使用CRC校验。如
果发送数据时达到了存储器的最大地址,即使SDIO卡主机没有发送停止命令,随后传输的数据
也会被丢弃。
数据流写操作的最大时钟频率可以通过下式计算
(8 x 2writebllen)(-NSAC)
Maximumspeed = Min(TRANSPEED, )
TAAC x R2WFACTOR
● Maximumspeed = 最大写频率
● TRANSPEED = 最大数据传输率
● writebllen = 最大写数据块长度
● NSAC = 以CLK周期计算的数据读操作时间2
● TAAC = 数据读操作时间1
● R2WFACTOR = 写速度因子
如果主机试图使用更高的频率,卡可能不能处理数据并停止编程,同时在状态寄存器中设置
OVERRUN错误位,丢弃所有随后传输的数据并(在接收数据状态)等待停止命令。如果主机试图
写入一个写保护区域,写操作将被中止,同时卡将设置WP_VIOLATION位。
数据流读(只适用于多媒体卡)
READ_DAT_UNTIL_STOP(CMD11)控制数据流数据传输。
这 个 命 令 要 求 卡 从 指 定 的 地 址 读 出 数 据 , 直 到SDIO卡 主 机 发 送STOP_TRANSMISSION
(CMD12)。因为串行命令传输的延迟,停止命令的执行会有延迟,数据传送会在停止命令的结
束位后停止。如果发送数据时达到了存储器的最大地址, SDIO卡主机没有发送停止命令,随后
传输的数据将是无效数据。
数据流读操作的最大时钟频率可以通过下式计算
(8 x 2readbllen)(-NSAC)
Maximumspeed = Min(TRANSPEED, )
TAAC x R2WFACTOR
● Maximumspeed = 最大写频率
● TRANSPEED = 最大数据传输率
● readbllen = 最大读数据块长度
● NSAC = 以CLK周期计算的数据读操作时间2
● TAAC = 数据读操作时间1
● R2WFACTOR = 写速度因子
如 果 主 机 试 图 使 用 更 高 的 频 率 , 卡 将 不 能 处 理 数 据 传 输 , 此 时 卡 在 状 态 寄 存 器 中 设 置UNDERRUN错误位,中止数据传输并在数据状态等待停止命令。
 

3.4.8 擦除:成组擦除和扇区擦除

        多媒体卡的擦除单位是擦除组,擦除组是以写数据块计算,写数据块是卡的基本写入单位。擦除组的大小是卡的特定参数,在CSD中定义。
        主机可以擦除一个连续范围的擦除组,开始擦除操作有三个步骤。
        首先,主机使用ERASE_GROUP_START(CMD35)命令定义连续范围的开始地址,然后使用
ERASE_GROUP_END(CMD36) 命 令 定 义 连 续 范 围 的 结 束 地 址 , 最 后 发 送 擦 除 命 令
ERASE(CMD38)开始擦除操作。擦除命令的地址域是以字节为单位的擦除组地址。卡会舍弃未
与擦除组大小对齐的部分,把地址边界对齐到擦除组的边界。
        如果未按照上述步骤收到了擦除命令,卡在状态寄存器中设置ERASE_SEQ_ERROR位,并重新等待第一个步骤。如 果 收 到 了 除 SEND_STATUS 和 擦 除 命 令 之 外 的 其 它 命 令 , 卡 在 状 态 寄 存 器 中 设 置ERASE_RESET位,解除擦除序列并执行新的命令。

        如果擦除范围包含了写保护数据块,这些块不被擦除,只有未保护的块被擦除,同时卡在状态寄存器中设置WP_ERASE_SKIP状态位。
        在擦除过程中,卡拉低SDIO_D信号。实际的擦除时间可能很长,主机可以使用CMD7解除卡的选择.

3.4.9 宽总线选择和解除选择

        可以通过SET_BUS_WIDTH(ACMD6)命令选择或不选择宽总线(4位总线宽度)操作模式,上电后或GO_IDLE_STATE(CMD0)命令后默认的总线宽度为1位。 SET_BUS_WIDTH(ACMD6)命令仅
在传输状态时有效,即只有在使用SELECT/DESELECT_CARD(CMD7)命令选择了卡后才能改
变总线宽度。

3.4.10 保护管理

SDIO卡主机模块支持三种保护方式:
1. 内部卡保护(卡内管理)
2. 机械写保护开关(仅由SDIO卡主机模块管理)
3. 密码管理的卡锁操作
内部卡的写保护
        卡的数据可以被保护不被覆盖或擦除。在CSD中永久地或临时地设置写保护位,生产厂商或内容提供商可以永久地对整个卡施行写保护。对于支持在CSD中设置WP_GRP_ENABLE位从而
提供一组扇区写保护的卡,部分数据可以被保护,写保护可以通过程序改变。写保护的基本单
位是CSD参数WP_GRP_SIZE个扇区。 SET_WRITE_PROT和CLR_WRITE_PROT命令控制指
定组的保护, SEND_WRITE_PROT命令与单数据块读命令类似,卡送出一个包含32个写保护
位(代表从指定地址开始的32个写保护组)的数据块,跟着一个16位的CRC码。写保护命令的地
址域是一个以字节为单位的组地址。
卡将截断所有组大小以下的地址。
机械写保护开关
        在卡的侧面有一个机械的滑动开关,允许用户设置或清除卡的写保护。当滑动开关置于小窗口打开的位置时,卡处于写保护状态,当滑动开关置于小窗口关闭的位置时,可以更改卡中内
容。在卡的插槽上的对应部位也有一个开关指示SDIO卡主机模块,卡是否处于写保护状态。卡
的内部电路不知道写保护开关的位置。
密码保护
        密码保护功能允许SDIO卡主机模块使用密码对卡实行上锁或解锁。密码存储在128位的PWD寄存器中,它的长度设置在8位的PWD_LEN寄存器中。这些寄存器是不可挥发的,即掉电后它们
的内容不丢失。已上锁的卡能够响应和执行相应的命令,即允许SDIO卡主机模块执行复位、初
始化和查询状态等操作,但不允许操作卡中的数据。当设置了密码后(即PWD_LEN的数值不为
0),上电后卡自动处于上锁状态。正如CSD和CID寄存器写命令,上锁/解锁命令仅在传输状态
下有效,在这个状态下,命令中没有地址参数,但卡已经被选中。卡的上锁/解锁命令具有单数
据块写命令的结构和总线操作类型,传输的数据块包含所有命令所需要的信息(密码设置模式、
PWD内容和上锁/解锁指示)。在发送卡的上锁/解锁命令之前,命令数据块的长度由SDIO卡主机
模块定义,,命令结构示于表142。
位的设置如下:
● ERASE:设置该位将执行强制擦除,所有其它位必须为0,只发送命令字节。
● LOCK_UNLOCK:设置该位锁住卡, LOCK_UNLOCK与SET_PWD可以同时设置,但不能
与CLR_PWD同时设置。
● CLR_PWD:设置该位清除密码数据。
● SET_PWD:设置该位将密码数据保存至存储器。
● PWD_LEN:以字节为单位定义密码的长度。

● PWD:密码(依不同的命令,新的密码或正在使用的密码)

以下几节列出了设置/清除密码、上锁/解锁和强制擦除的命令序列。
设置密码
1. 选择一个卡(SELECT/DESELECT_CARD, CMD7)。
2. 定义要在8位的卡上锁/解锁模式下发送的数据块长度(SET_BLOCKLEN, CMD16), 8位
的PWD_LEN,新密码的字节数目。当更换了密码后,发送命令的数据块长度必须同时考
虑新旧密码的长度。
3. 以合适的数据块长度在数据线上发送LOCK/UNLOCK(CMD42)命令,并包含16位的CRC
码。数据块包含了操作模式(SET_PWD=1)、长度(PWD_LEN)和密码(PWD)。当更换了密
码后,长度数值(PWD_LEN)包含了新旧两个密码的长度, PWD域包含了旧的密码(正在
使用的)和新的密码。
4. 当旧的密码匹配后,新的密码和它的长度被分别存储在PWD和PWD_LEN域。如果送出
的旧密码与期望的密码(长度或内容)不吻合,则设置状态寄存器中的
LOCK_UNLOCK_FAILED错误位,同时密码不变。
密码长度域(PWD_LEN)指示当前是否设置了密码,如果该域为非零,则表示使用了密码,卡在
上电时自动上锁。在不断电的情况下,如果设置了密码,可以通过设置LOCK_UNLOCK位或发
送一个额外的上锁命令,立即锁住卡。
清除密码
1. 选择一个卡(SELECT/DESELECT_CARD, CMD7)。
2. 定义要在8位的卡上锁/解锁模式下发送的数据块长度(SET_BLOCKLEN, CMD16), 8位
的PWD_LEN,当前使用密码的字节数目。
3. 当密码匹配后, PWD域被清除同时PWD_LEN被设为0。如果送出的密码与期望的密码(长
度或内容)不吻合,则设置状态寄存器中的LOCK_UNLOCK_FAILED错误位,同时密码不
变。
卡上锁
1. 选择一个卡(SELECT/DESELECT_CARD, CMD7)
2. 定义要在8位的卡上锁/解锁模式(见表142的字节0)下发送的数据块长度
(SET_BLOCKLEN, CMD16), 8位的PWD_LEN,和当前密码的字节数目。
3. 以合适的数据块长度在数据线上发送LOCK/UNLOCK(CMD42)命令,并包含16位的CRC
码。数据块包含了操作模式(LOCK_UNLOCK=1)、长度(PWD_LEN)和密码(PWD)。
4. 当密码匹配后,卡被上锁并则设置状态寄存器中的CARD_IS_LOCKED状态位。如果送出
的密码与期望的密码(长度或内容)不吻合,则设置状态寄存器中的
LOCK_UNLOCK_FAILED错误位,同时上锁操作失败。
设置密码和为卡上锁可以在同一个操作序列中进行,此时SDIO卡主机模块按照前述的步骤设置
密码,但在发送新密码命令的第3步需要设置LOCK_UNLOCK位。
如果曾经设置过密码(PWD_LEN不为0),卡会在上电复位时自动地上锁。对已经上锁的卡执行
上 锁 操 作 或 对 没 有 密 码 的 卡 执 行 上 锁 操 作 会 导 致 失 败 , 并 设 置 状 态 寄 存 器 中 的
LOCK_UNLOCK_FAILED错误位。
卡解锁
1. 选择一个卡(SELECT/DESELECT_CARD, CMD7)
2. 定义要在8位的卡上锁/解锁模式(见表142的字节0)下发送的数据块长度
(SET_BLOCKLEN, CMD16), 8位的PWD_LEN,和当前密码的字节数目。
3. 以合适的数据块长度在数据线上发送LOCK/UNLOCK(CMD42)命令,并包含16位的CRC
码。数据块包含了操作模式(LOCK_UNLOCK=0)、长度(PWD_LEN)和密码(PWD)。
4. 当密码匹配后,卡锁被解除,同时状态寄存器中的CARD_IS_LOCKED位被清除。如果送
出的密码与期望的密码(长度或内容)不吻合,则设置状态寄存器中的
LOCK_UNLOCK_FAILED错误位,同时卡仍保持上锁状态。
解锁状态只在当前的供电过程中有效,只要不清除PWD域,下次上电后卡会被自动上锁。
试 图 对 已 经 解 了 锁 的 卡 执 行 解 锁 操 作 会 导 致 操 作 失 败 , 并 设 置 状 态 寄 存 器 中 的
LOCK_UNLOCK_FAILED错误位。
强制擦除
如果用户忘记了密码(PWD的内容),可以在清除卡中的所有内容后使用卡。强制擦除操作擦除
所有卡中的数据和密码。
1. 选择一个卡(SELECT/DESELECT_CARD, CMD7)
2. 设置发送的数据块长度(SET_BLOCKLEN, CMD16)为1,仅发送8位的卡上锁/解锁字节
(见表142的字节0)。
3. 以合适的数据块长度在数据线上发送LOCK/UNLOCK(CMD42)命令,并包含16位的CRC
码。数据块包含了操作模式(ERASE=1)所有其它位为0。
4. 当ERASE位是数据域中仅有的位时,卡中的所有内容将被擦除,包括PWD和PWD_LEN
域,同时卡不再被上锁。如果有任何其它位不为0,则设置状态寄存器中的
LOCK_UNLOCK_FAILED错误位,卡中的数据保持不变,同时卡仍保持上锁状态。
试 图 对 已 经 解 了 锁 的 卡 执 行 擦 除 操 作 会 导 致 操 作 失 败 , 并 设 置 状 态 寄 存 器 中 的LOCK_UNLOCK_FAILED错误位。
 

3.4.10 卡状态寄存器

        响应格式R1包含了一个32位的卡状态域,这个域是用于向卡主机发送卡的状态信息(这些信息有可能存在本地的状态寄存器中)。除非特别说明,卡返回的状态始终是与之前的命令相关的。
表129定义了不同的状态信息。表中有关类型和清除条件域的缩写定义如下:
类型:
● E: 错误位
● S: 状态位
● R: 检测位,并依据实际的命令响应而设置
● X: 检测位,在命令的执行中设置。 SDIO卡主机通过发送状态命令读出这些位而查询卡的状
态。
清除条件:
● A: 依据卡的当前状态
● B: 始终与之前的命令相关。接收到正确的命令即可清除(具有一个命令的延迟)。
● C: 读即可清除

 

 

3.4.12 SD状态寄存器

        SD状态包含与SD存储器卡特定功能相关的状态位和一些与未来应用相关的状态位, SD状态的长度是一个512位的数据块。收到ACMD13命令(CMD55,然后是CMD13)后,这个寄存器的内
容被传送到SDIO卡主机。只有卡处于传输状态时(卡已被选择)才能发送ACMD13命令。
表130定义了不同的SD状态寄存器信息。表中有关类型和清除条件域的缩写定义如下:
类型:
● E: 错误位
● S: 状态位
● R: 检测位,并依据实际的命令响应而设置
● X: 检测位,在命令的执行中设置。 SDIO卡主机通过发送状态命令读出这些位而查询卡的状
态。
清除条件:
● A: 依据卡的当前状态
● B: 始终与之前的命令相关。接收到正确的命令即可清除(具有一个命令的延迟)。
● C: 读即可清除
 

SIZE_OF_PROTECTED_AREA
标准容量卡和高容量卡设置该位的方式不同。对于标准容量卡,受保护区域的容量由下式计
算:
受保护区域 = SIZE_OF_PROTECTED_AREA * MULT * BLOCK_LEN
SIZE_OF_PROTECTED_AREA的单位是MULT * BLOCK_LEN。
对于高容量卡,受保护区域的容量由下式计算:
受保护区域 = SIZE_OF_PROTECTED_AREA
SIZE_OF_PROTECTED_AREA的单位是字节。
SPEED_CLASS
这8位指示速度的类型和可以通过计算PW/2的数值(PW是写的性能)。
 

PERFORMANCE_MOVE
这8位以1MB/秒为单位指示移动性能(Pm)。如果卡不用RU(纪录单位)移动数据,应该认为Pm是
无穷大。设置这个域为FFh表示无穷大。
 

AU_SIZE
这4位指示AU的长度,数值是16K字节为单位2的幂次的倍数。
 

 

依据卡的容量,最大的AU长度由下表定义。卡可以在RU长度和最大的AU长度之间设置任意的
AU长度。
 

ERASE_SIZE
这个16位域给出了NERASE,当NERASE个AU被擦除时, ERASE_TIMEOUT定义了超时时间。主
机应该确定适当的一次操作中擦除的AU数目,这样主机可以显示擦除操作的进度。如果该域为
0,则不支持擦除的超时计算。
 

 

ERASE_TIMEOUT
这6位给出了TERASE,当ERASE_SIZE指示的多个AU被擦除时,这个数值给出了从偏移量算起
的擦除超时。 ERASE_TIMEOUT的范围可以定义到最多63秒,卡的生产商可以根据具体实现选
择 合 适 的 ERASE_SIZE 与 ERASE_TIMEOUT 的 组 合 , 先 确 定 ERASE_TIMEOUT 再 确 定
ERASE_SIZE。
 

ERASE_OFFSET
这2位给出了TOFFSET,当ERASE_SIZE和ERASE_TIMEOUT同为0时这个数值没有意义
 

3.4 13 SD的I/O模式

SD的I/O中断
        为了让SD I/O卡能够中断多媒体卡/SD模块,在SD接口上有一个具有中断功能的引脚——第8
脚,在4位SD模式下这个脚是SDIO_D1,卡用它向多媒体卡/SD模块提出中断申请。对于每一
个卡或卡内的功能,中断功能是可选的。 SD I/O的中断是电平有效,即在被识别并得到多媒体
卡/SD模块的响应之前,中断信号线必须保持有效电平(低),在中断过程结束后保持无效电平
(高)。在多媒体卡/SD模块服务了中断请求后,通过一个I/O写操作,写入适当的位到SD I/O卡的
内部寄存器,即可清除中断状态位。所有SD I/O卡的中断输出是低电平有效,多媒体卡/SD模块
在 所 有 数 据 线 (SDIO/D[3:0]) 上 提 供 上 拉 电 阻 。 多 媒 体 卡 /SD 模 块 在 中 断 阶 段 对 第 8 脚(SDIO_D/IRQ)采样并进行中断检测,其它时间该信号线上的数值将被忽略。
存储器操作和I/O操作都具有中断阶段,单个数据块操作的中断阶段定义与多个数据块传输操作
的中断阶段定义不同。
SD的I/O暂停和恢复
在一个多功能的SD I/O卡或同时具有I/O和存储器功能的卡中,多个设备(I/O和存储器)共用
MMC/SD总线。为了使MMC/SD模块中的多个设备能够共用总线, SD I/O卡和复合卡可以有选
择地实现暂停/恢复的概念;如果一个卡支持暂停/恢复, MMC/SD模块能够暂时地停止一个功能
或存储器的数据传输操作(暂停),借此让出总线给具有更高优先级的其它功能或存储器,在这个
具有更高优先级的传输完成后,再恢复原先暂停的传输。支持暂停/恢复的操作是可选的。在
MMC/SD总线上执行暂停/恢复操作有下述步骤:
1. 确定SDIO_D[3:0]信号线的当前功能
2. 请求低优先级或慢的操作暂停
3. 等待暂停操作完成,确认设备已暂停
4. 开始高优先级的传输
5. 等待高优先级的传输结束
6. 恢复暂停的操作
SD I/O读等待(ReadWait)
        可选的读等待(RW)操作只适用于SD卡的1位或4位模式。读等待操作允许MMC/SD模块在一个
卡正在读多个寄存器(IO_RW_EXTENDED, CMD53)时,要求它暂时停止数据传输,同时允许
MMC/SD模块发送命令到SD I/O设备中的其他功能。判断一个卡是否支持读等待协议,
MMC/SD模块应该检测卡的内部寄存器。读等待的时间与中断阶段相关。
 

3.4.14 命令与响应

应用相关命令和通用命令
        SD卡主机模块系统是用于提供一个适用于多种应用类型的标准接口,但同时又要兼顾特定用户和 应 用 的 功 能 , 因 此 标 准 中 定 义 了 两 类 通 用 命 令 : 应 用 相 关 命 令 (ACMD) 和 通 用 命 令(GEN_CMD)。
        当卡收到APP_CMD(CMD55)命令时,卡期待下一个命令是应用相关命令。应用相关命令
(ACMD)具有普通多媒体卡相同的格式结构,并可以使用相同的CMD号码,因为它是出现在
APP_CMD(CMD55)后面,所以卡把它识别为ACMD命令。如果跟随APP_CMD(CMD55)之后不
是一个已经定义的应用相关命令,则认为它是一个标准命令;例如:有一个SD_STATUS
(ACMD13)应用相关命令,如果在紧随APP_CMD(CMD55)之后收到CMD13,它将被解释为
SD_STATUS(ACMD13);但是如果卡在紧随APP_CMD(CMD55)之后收到CMD7,而这个卡没
有定义ACMD7,则它将被解释为一个标准的CMD7(SELECT/DESELECT_CARD)命令。
如果要使用生产厂商自定义的ACMD, SD卡主机需要做以下操作:
1. 发送APP_CMD(CMD55)命令
卡送回响应给多媒体/SD卡模块,指示设置了APP_CMD位并等待ACMD命令。

2. 发送指定的ACMD

卡送回响应给多媒体/SD卡模块,指示设置了APP_CMD位,收到的命令已经正确地按照
ACMD命令解析;如果发送了一个非ACMD命令,卡将按照普通的多媒体卡命令处理同时
清除卡中状态寄存器的APP_CMD位。
如果发送了一个非法的命令(不管是ACMD还是CMD),将被按照标准的非法多媒体卡命令进行
错误处理。
GEN_CMD 命 令 的 总 线 操 作 过 程 , 与 单 数 据 块 读 写 命 令 (WRITE_BLOCK , CMD24 或
READ_SINGLE_BLOCK, CMD17)相同;这时命令的参数表示数据传输的方向而不是地址,数
据块具有用户自定义的格式和意义。
发送GEN_CMD(CMD56)命令之前,卡必须被选中(状态机处于传输状态),数据块的长度由
SET_BLOCKLEN(CMD16)定义。 GEN_CMD(CMD56)命令的响应是R1b格式。
命令类型
应用相关命令和通用命令有四种不同的类型:
1. 广播命令(BC):发送到所有卡,没有响应返回。
2. 带响应的广播命令(BCR):发送到所有卡,同时收到从所有卡返回的响应。
3. 带寻址(点对点)的命令(AC):发送到选中的卡,在SDIO_D信号线上不包括数据传输。
4. 带寻址(点对点)的数据传输命令(AC):发送到选中的卡,在SDIO_D信号线上包含数据传
输。
命令格式
命令格式参见表122。
多媒体卡/SD卡模块的命令

 

 

 

 

3.5 响应格式

所有的响应是通过MCCMD命令在SDIO_CMD信号线上传输。响应的传输总是从对应响应字的
位串的最左面开始,响应字的长度与响应的类型相关。
一个响应总是有一个起始位(始终为0),跟随着传输的方向位(卡=0)。下表中标示为x的数值表示
一个可变的部分。除了R3响应类型,所有的响应都有CRC保护。每一个命令码字都有一个结束
位(始终为1)。
共有5种响应类型,它们的格式定义如下:
 

3.5.1 R1(普通响应命令)

代码长度=48位。位45:40指示要响应的命令索引,它的数值介于0至63之间。卡的状态由32位
进行编码

3.5.2 R1b

与R1格式相同,但可以选择在数据线上发送一个繁忙信号。收到这些命令后,依据收到命令之
前的状态,卡可能变为繁忙。

3.5.3 R2(CID、 CSD寄存器)

代码长度=136位。 CID寄存器的内容将作为CMD2和CMD10的响应发出。 CSD寄存器的内容将
作为CMD9的响应发出。卡只送出CID和CSD的位[127…1],在接收端这些寄存器的位0被响应
的结束位所取代。卡通过拉低MCDAT指示它正在进行擦除操作;实际擦除操作的时间可能非常
长,主机可以发送CMD7命令不选中这个卡。
 

 

3.5.4 R3(OCR寄存器)

代码长度=48位。 OCR寄存器的内容将作为CMD1的响应发出。电平代码的定义是:限制的电压
窗口 = 低,卡繁忙 = 低。
 

3.5.5 R4(快速I/O)

代码长度=48位。参数域包含指定卡的RCA、需要读出或写入寄存器的地址、和它的内容。
表147 R4响应
 

3.5.6 R4b

仅适合SD I/O卡:一个SDIO卡收到CMD5后将返回一个唯一的SDIO响应R4。
表148 R4b响应

当一个SD I/O卡收到命令CMD5,卡的I/O部分被使能并能够正常地响应所有后续的命令。 I/O卡
的使能状态将保持到下一次复位、断电或收到I/O复位的CMD52命令。注意,一个只包含存储器
功能的SD卡可以响应CMD5命令,它的正确响应可以是:当前存储器=1, I/O功能数目=0。按照
SD存储器卡规范版本1.0设计的只包含存储器功能的SD卡,可以检测到CMD5命令为一个非法
命令并不响应它。可以处理I/O卡的主机将发送CMD5命令,如果卡返回响应R4,则主机会依据
R4响应中的数据确定卡的配置。

3.5.7 R5(中断请求)

仅适用于多媒体卡。代码长度=48位。如果这个响应由主机产生,则参数中的RCA域为0x0。
 

3.5.8 R6(中断请求)

仅适用于SD I/O卡。这是一个存储器设备对CMD3命令的正常响应。
 

当发送CMD3命令到只有I/O功能的卡时,卡的状态位[23:8]会改变;此时,响应中的16位将是只
有I/O功能的SD卡中的数值:
● 位15 = COM_CRC_ERROR
● 位14 = ILLEGAL_COMMAND
● 位13 = ERROR
● 位[12:0] = 保留

3.6 SDIO I/O卡特定的操作

下述功能是SD I/O卡特定的操作:
● 由SDIO_D2信号线实现的SDIO读等待操作。
● 通过停止时钟实现的SDIO读等待操作。
● SDIO暂停/恢复操作(写和读暂停)
● SDIO中断
只有设置了SDIO_DCTRL[11]位时, SDIO才支持这些操作;但读暂停除外,因为它不需要特殊
的硬件操作
 

3.6.1 使用SDIO_D2 信号线的SDIO I/O读等待操作

        在收到第一个数据块之前即可以开始读等待过程,使能数据通道(设置SDIO_DCTRL[0]位)、使能 SDIO 特 定 操 作 ( 设 置 SDIO_DCTRL[11] 位 ) 、 开 始 读 等 待 (SDIO_DCTRL[10]=0 并 且
SDIO_DCTRL[8]=1),同时数据传输方向是从卡至SDIO主机(SDIO_DCTRL[1]=1), DPSM将直
接从空闲进入读等待状态。在读等待状态时, 2个SDIO_CK时钟周期后, DPSM驱动SDIO_D2
为’0’,在此状态,如果设置RWSTOP位(SDIO_DCTRL[9]),则DPSM会在等待状态多停留2个
SDIO_CK时钟周期, (根据SDIO规范)并在一个时钟周期中驱动SDIO_D2为’1’。然后DPSM开始
等待从卡里接收数据。在接收数据块时,即使设置了开始读等待, DPSM也不会进入读等待,
读等待过程将在收到CRC后开始。必须清除RWSTOP才能开始新的读等待操作。在读等待期
间, SDIO主机可以在SDIO_D1上监测SDIO中断。

3.6.2 使用停止SDIO_CK的SDIO读等待操作

        如果SDIO卡不能支持前述的读等待操作, SDIO可以停止SDIO_CK进入读等待(按照20.6.1节介绍的方式设置SDIO_DCTRL,但置SDIO_DCTRL[10]=1),在接收当前数据块结束位之后的2个
SDIO_CK周期后, DSPM停止时钟,在设置了读等待开始位后恢复时钟。
        因为SDIO_CK停止了,可以向卡发送任何命令。在读等待期间, SDIO主机可以在SDIO_D1上监测SDIO中断。

3.6.3 SDIO暂停/恢复操作

        在向卡发送数据时, SDIO可以暂停写操作。设置SDIO_CMD[11]位,这指示CPSM当前的命令是一个暂停命令。 CPSM分析响应,在从卡收到ACK时(暂停被接受),它确认在收到当前数据块
的CRC后进入空闲状态。
硬件不会保存结束暂停操作之后,剩余的发送数据块数目。
可以通过软件暂停写操作:在收到卡对暂停命令的ACK时,停止DPSM(SDIO_DCTRL[0]=0),
DPSM即可进入空闲状态。
暂停读操作: DPSM在Wait_r状态等待,在停止数据传输进入暂停之前,已经发送完成完整的数
据包。随后应用程序继续读出RxFIFO直到FIFO变空,最后DPSM自动地进入空闲状态。

3.6.4 SDIO中断

当设置了SDIO_DCTRL[11]位, SDIO主机在SDIO_D1信号线上监测SDIO中断。

3.7 CE-ATA特定操作

下面是CE-ATA的特定操作:
● 送出命令完成信号能够关闭CE-ATA设备
● 从CE-ATA设备接收命令完成信号
● 使用状态位和/或中断,向CPU发送CE-ATA命令完成信号
仅当设置了SDIO_CMD[14]位时,即SDIO主机只对CE-ATA的CMD61命令支持这些操作。

3.7.1 命令完成指示关闭

        如果未设置SDIO_CMD[12]中的“允许CMD结束位”并且设置了SDIO_CMD[13]中的“非中断
使能位”,则在收到一个短响应后的8个位周期之后,发出命令完成关闭信号。
在命令移位寄存器中写入关闭序列“00001”并且在命令计数器中写入43,则CPSM进入暂停状
态。 8个周期后,一个触发将CPSM移至发送状态。当命令计数器达到48时,因为没有要等待的
响应, CPSM变为空闲状态。

3.7.2 命令完成指示使能

        如果设置SDIO_CMD[12]中的“允许CMD结束位”并且设置了SDIO_CMD[13]中的“非中断使
能位”, CPSM在Waitcpl状态下等待命令完成信号。
当在CMD信号上收到’0’, CPSM进入空闲状态。在个7位周期之内不能发送新命令。然后,在最
后5个周期(上述7个周期之外),在推挽模式下CMD信号变为’1’。

3.7.3 CE-ATA中断

        命令完成是由状态位SDIO_STA[23]通知CPU,使用清除位SDIO_ICR[23]可以清除该位。
根据屏蔽位SDIO_MASKx[23]的设置, SDIO_STA[23]状态位可以在每一个中断线上产生中断。

3.7.4 中止CMD61

        如果还未发送”命令完成指示关闭”信号,但需要中止CMD61命令,命令状态机必须被关闭。然后它变成空闲,并且可以发送CMD12命令。在此操作期间,不传送”命令完成指示关闭”信号。

3.8 硬件流控制

        使用硬件流控制功能可以避免FIFO下溢(发送模式)和上溢(接收模式)错误。
操作过程是停止SDIO_CK并冻结SDIO状态机,在FIFO不能进行发送和接收数据时,数据传输
暂停。只有由SDIOCLK驱动的状态机被冻结, AHB接口还在工作。即使在流控制起作用时,仍
然可以读出或写入FIFO。
必须设置SDIO_CLKCR[14]位为’1’,才能使能硬件流控制。复位后,硬件流控制功能关闭。

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 SDIO驱动SD卡学习(理论篇)

发表评论