分享

第12章 SD卡和SDIO接口(一)

 望穿墙 2020-05-06

转: https://www./blog/132624786906939392

SD卡(Secure Digital Memory Card)是一种基于半导体闪存工艺的存储卡, 被广泛应用于消费数码设备中。SD卡可以通过SPI或者SDIO接口访问,其中SDIO接口是在SD卡协议基础上发展而来的一种IO接口规范,它不但兼容SD卡,还可以用来连接SD I/O接口的设备,本章来了解SD卡和SDIO接口的相关内容。

12.1 从SD卡说起

12.1.1 SD卡形状

SD卡按照外形大小分为标准尺寸SD卡、Mini SD卡和Micro SD卡,如图12-1所示。

除了外形有所差异外,引脚数量与编号也有所不同,其中Mini SD相对于标准SD,增加了2个NC引脚,Micro SD相对于标准SD,减少了1个VSS引脚。

1.jpg

图12-1 标准SD、Mini SD、Micro SD对比图

12.1.2 卡容量

根据卡容量区分主要分为三种类型,标准SD卡、高容量SD卡(简称SDHC)、容量扩大化SD卡(简称SDXC)。

其中标准SD卡:最高支持2GB;高容量SD卡:生活中常用的一类SD卡,支持大于2GB,最高32GB,注意只有支持SD 2.0及以上协议才能识别高容量SD卡;还有一种容量扩大化的SD卡支持的容量相对于高容量SD卡要更大,理论容量是32GB~2TB。

SD卡遵循向下兼容原则,即如果主机(host)设备能够支持高容量SD卡,那一定支持标准SD卡,反之并不一定成立。

12.1.3 速度等级

SD卡拥有4个速度等级,用于表示SD卡的最小速率,如下所示:

Class 0 – 这种卡不定义具体性能,代表了划分速度等级之前的所有卡

Class 2 –表示最小2MB/s的性能;

Class 4 –表示最小4MB/s的性能;

Class 6 –表示最小6MB/s的性能;

Class 8 –表示最小8MB/s的性能;

Class 10–表示最小10MB/s的性能;

目前最高为Class10,SD卡速度等级表示方法如图12-2红色方框所示

2.jpg

图12- 2 SD卡速度等级标识图

12.1.4 总线拓扑

SD卡与Flash、EEPROM类似,属于一主多从结构,其中SD卡为从设备,只能由主机发起请求。当总线上有多个SD卡时,它们共用VDD、VSS、CLK,但是DAT0~3和CMD必须分开,不可共用,SD卡总线拓扑结构如图12-3所示。

3.jpg

图12-3 SD卡总线拓扑

12.2 SD卡结构

标准SD卡主要由硬件接口、卡接口控制器、内部寄存器、存储器以及电源检测单元等部分组成,如图12-4所示。

4.jpg

图12-4 标准SD卡结构图

12.2.1 硬件接口

SD卡支持SD和SPI两种通信接口,标准SD卡总共有6条信号线和3条电源线,分别支持SD和SPI两种模式,两种模式下其引脚关系如表13-1所示。SD卡支持1线到4线数据传输设置,上电后,SD卡默认为1线模式,即使用DAT0传输数据。初始化后,主机可以改变线宽(采用1~4线任意模式)。

5.jpg

1、电源线

VDD和VSS为供电引脚,按照支持电压不同,SD卡分为两种,一种是“高电压SD卡”,额定电压为2.7~3.6V;另一种为“双电压SD卡”,可以工作在低电范围(T.B.D)和2.7~3.6V两种电压范围。

2、信号线

CMD:命令/响应线,用于主机向SD卡发送命名和接收SD卡响应;

CLK:时钟信号线,每个周期传输一个命令或数据位,频率为0~50Mhz;

DAT0~3:数据线,用于主机与SD卡之间传输数据,除此之外DAT3还具有卡检测功能。

实际使用时,通常在DAT0~3和CMD引脚加上拉电阻,保护数据免受到总线浮动影响,当没有卡插入,或者所有卡驱动都处于高阻抗模式, DAT0-3 线应处上拉至高电平。SD总线电路图连接方式如图12-5所示。

如果DAT3引脚作为卡检测工作,需要将RDAT下拉至地。一旦有卡插入,SD卡内部通过50KΩ把DATA3信号拉高至高电平,主机通过检测DAT3线的电平判断SD卡的插拔状况。

6.jpg

图12-5 SD卡电路图

12.2.2 SD卡寄存器

卡的接口中定义了8个寄存器:OCR,CID,CSD,RCA,DSR,SCR,SSR,CSR。这些寄存器只能通过对应的命令访问。其中OCR,CID,CSD,SCR 寄存器保存了卡/内容的特定信息,RCA和 DSR 寄存器是配置寄存器,存储当前的配置参数,SD卡寄存器描述如表12-2所示。

8.jpg

1、操作条件寄存器——OCR

32位的操作条件寄存器(OCR)存储了卡的 VDD 电压描述和2个状态信息位,如表12-3所示。

bit7是新定义的,用于双电压卡,默认设置为0。如果双电压卡没有收到CMD8,则该位为0,如果收到 CMD8,则该位为1。

bit31 – 卡上电状态位,这个状态位在卡的上电流程完成后设置。

bit30 – 卡容量状态位,如果是高容量卡,设置为 1,如果是标准卡,设置为 0。卡容

量状态位只有在上电流程完成,且 bit31 设置为 1 之后才有效。主机应该读取这个状态位来判断卡的种类。

9.jpg

3、特定数据寄存器——CSD

CSD 分为V1.0和V2.0两个版本,其中V2.0只适用于高容量 SD 卡,本文也是以V2.0为参考,相应寄存器位如表12-5所示。插入的区域名字是固定值,并且主机不一定要求涉及这些区域。这些区域的固定值使主机保持对 CSD V1.0 的兼容。单元类型区域中,R=可读,W(1)=写一次,W=反复写。

10.jpg

CSD寄存器相应寄存器位描述如下:

最大数据传速速率(TRAN_SPEED)

对于标准SD卡,这个区域值应该总是 0 0110 010b(32h),这个等于 25Mhz,是强制的SD卡最大操作频率。

对于高速卡来说,这个值应该是 0 1011 010b(5Ah),这个值代表 50Mhz,当时序通过 CMD6和 CMD0 命令回到默认的时候,这个值会重新设置为 032h。

读数据块最大长度(READ_BL_LEN)

其值固定为 9h,代表 READ_BL_LEN=512byte。

READ_BL_PARTIAL

这个值固定为 0,表明不允许部分块读操作,只能按块进行访问。

WRITE_BLK_MISALIGN

这个值固定为 0,表明高容量卡中,写操作不允许越过物理块边界

READ_BLK_MISALIGN

这个值固定为 0,表明高容量卡中,读操作不允许越过物理块边界

DSR_IMP

定义是否可配置驱动阶段在卡上整合了。如果设置了,驱动阶段寄存器(DSR)就应该使用,0—不实现 DSR,1—实现DSR。

C_SIZE

这个值有 22bit,可以支持最大到 2Tbyte(和通过 32Bit 块地址指定的最大存储空间一致)这个参数是用来计算 sd 卡的用户数据区域容量的(不包括保护区域)。公式如下:

存储容量=(C_SIZE + 1)×512K byte。鉴于 V2.0 支持的最大容量是 32GB,超过 6bit 的部分都设置为 0。

ERASE_BLK_EN

这个值固定为 1,代表着主机可以擦除 1 个或者多个 512 字节单位。

SECTOR_SIZE

这个值固定是 7Fh,这个代表 64 字节。这个值同擦除操作没关系。V2.0 的卡通过 AU 尺寸来表明存储边界,不用这个值。

WP_GRP_SIZE

这个值固定是 0,高容量 SD 卡不支持写保护组。

WP_GRP_ENABLE

这个值固定为 0,高容量卡不支持写保护组。

R2W_FACTOR

这个值固定是 2h,代表 4 倍。写超时可以通过读访问时间和 R2W_FACTOR 的乘积计算。但是,对于写超时,主机不应该用这个参数,而是应该用固定的 250ms。

WRITE_BL_LEN

这个值固定是 9h,代表 WRITE_BL_LEN=512Byte。

WRITE_BL_PARTIAL

这个值固定是 0,表明部分块写不支持,值支持块整数倍的写操作。

FILE_FORMAT_GRP

这个值固定是 0,主机不应该使用这个值。

COPY

定义是否内容是原始的(0),或者是拷贝的(1)。拷贝位对于销售到终端用户的 OTP 和 MTP设备来说是设置为 1 的,这表明卡的内容是拷贝的。拷贝位是一次性编程位。

PERM_WRITE_PROTECT

永久保护整个卡内容,不允许写和擦除(所有相关命令都无效)。默认值是 0,非永久写保护。

TMP_WRITE_PROTECT

临时保护卡的内容,不允许写和擦除(所有相关命令都临时无效)。这个值可以设置和复位,默认值是 0,非写保护。

FILE_FORMAT

这个值固定为 0,主机不应该使用这个值

4、相对地址寄存器——RCA

可写的16位卡相对地址寄存器,在卡的初始化期间,由卡向外发布的卡地址。这个地址用于卡初始化进程之后,主机同卡之间的交互寻址。默认的 RCA 寄存器值是0x0000,这个值保留着,用来通过CMD7设置所有卡到stand-by状态。

5、驱动阶段寄存器——DSR

16 位驱动阶段寄存器,在 6.5 章详细描述。是可选的,可以用来在扩展操作条件中,提高总线性能(受总线长度,传输速率和卡数目的影响)。CSD 寄存器中有 DSR 寄存器是否使用的标志。DSR 默认值是 0x404。

6、SD配置寄存器——SCR

64bit的SD配置寄存器作为 CSD 寄存器的补充,提供了SD卡的特殊功能的信息,如表12-6所示。

11.jpg

DATA_STAT_AFTER_ERASE

定义了擦除之后的数据状态,可能是 0 或者 1,由厂家定义。

SD_BUS_WIDTHS

描述了卡支持的所有 DAT 总线宽度,如表12-7所示。SD 卡最少应该支持1bit和4bit的宽度,所以SD 卡的bit0和bit2必须有一个为1。

12.jpg

12.2.3 SD卡存储器

前面所学习W25Q128属于随机存储设备(NOR型Flash),用于数据量较小的场合,而且操作是以自“字节”单位;SD卡属于连续存储介质(NAND型Flash),它是由许多小的区块组成,每个区块都可以存储一定数量的数据,因此SD卡的读写是以“数据块”为单位进行传输的。

n 块(Block):是文件系统上的概念,指最小读写单位,块的长度是字节的整数倍,一般为512字节,有的SD卡的数据块为1024或2048等等,要修改SD卡中一个字节,必须重写整个数据块。

n 扇区:扇区是擦除单位,表示擦除操作要擦除的块的数目,通常:1扇区=128块=64KByte。注意:文件系统中,V2.0的卡通过AU尺寸来表明存储边界,不使用扇区。

n AU(分配单元),也称为簇,是文件系统为每一个单元地址划分的空间大小,类似于一栋大楼将它换分为若干房间,并分配相应的门牌号,其中房间的大小就是所说的分配单元大小。

存储文件时,系统将文件按照分配单元的大小分为若干部分,比如分配单元为4096Byte,一个4096Byte的文件刚好放进一个分配单元中,如果是4097Byte的文件则需占用两个分配单元。擦除时也是同样道理,一次最小擦除一个分配单元。因此分配单元越小,越节约空间,但是浪费读取时间;分配单元越大,越节约读取时间,但是浪费空间。

卡的容量决定最大的AU大小,默认分为:2048Byte、4096Byte,8192Byte,16KB,32KB和64KB,最大为一个扇区即64KB,一般默认设置为4096Byte,格式化时分配单元设置示意图如图12-6所示。

13.jpg

图12- 6 分配单元(AU)

12.3 SDIO总线接口

注意了,从现在起开始打起精神,以下才是本章的重总之中。

SDIO是在SD标准上定义了一种外设接口,故名思义,就是SD的I/O 接口的意思。SD 本来是记忆卡的标准,但是现在把SD连接一些外围I/O使用,这样边形成了SDIO接口。SDIO本身只是一种接口技术,类似于SPI接口,通过I/O引脚来连接外部设备,并且与外围设备之间传输数据,所以这些外围设备又被称为SD I/O卡。

现在已经有非常多的手机或是手持装置都支持SDIO的功能,而且许多SDIO外围设备也都被开发出来,让手机外接外围更加容易,并且开发上不需要再内建外围电路。目前常见的 SDIO 外围(SD I/O卡)有:蓝牙、无线网卡、电视卡、GPS Card、照相模块等。

12.3.1 SDIO总线协议

SDIO协议在SD协议之上添加了CMD52(用于访问寄存器)和CMD53(字节和块传输)命令,因此SDIO协议完全兼容SD协议。其次SD I/O卡与SD卡规范之间的一个重要区别是增加了低速标准,即仅使用DAT0数据线。低速卡的目标应用是以最小的硬件开支,支持低速I/ O能力。

SDIO标准定义有两种类型的卡,全速卡(full-speed card)和低速卡(low-speed card),全速卡支持SPI、1 bit SD和4 bit SD模式,时钟范围0~25Mhz,传输速率最大达到100Mhz;低速卡仅支持SPI和1 bit SD模式,时钟速率为0~400Khz。

SDIO总线上的通信是通过传送命令和数据实现,而MMC/SD/SD I/O卡的基本操作也是基于命令/数据结构,数据在SD/SD I/O卡上是以数据块的形式实现信息交换,在MMC上传送的数据是以数据块或数据流的形式传输,命令/响应结构如图12-7所示。

14.jpg

图12-7 SDIO“无响应”和“无数据”操作(1)

15.jpg

图12- 7 SDIO(多)数据块读操作(2)

16.jpg

图12- 7 SDIO(多)数据块写操作(3)

其实SD卡的命令/响应操作与 SPI操作Flash类似,主机发送一条命令,从机收到命令后返回响应,具体命令和响应的内容和格式如下所示。

1、命令(Command):命令用于发起一个操作,只能由主机发送到卡。

(1)命令格式

命令共48bit,按照高位在前,低位在后的顺序在SDIO_CMD线上是连续传输,其结构和格式如图12-8和表12-8所示。

17.jpg

图12- 8命令结构

18.jpg

起始位:表示命令的开始,始终为“0”。

传输位:表示传输方向,为1,表示主机->SD卡。

命令号:表示命令序号,占6bit,共64个命令(表示CMD0~CMD63)。

地址/参数:用于传输命名附带的信息,比如地址、参数等等,占32位。

CRC7校验位:采用7位CRC校验,用于验证命令传输内容准确性。

终止位:命令结束标志位,始终为“1”。

(2)命令类型

SDIO应用相关命令和通用命令共有四种不同的类型,了解即可:

1. 广播命令(BC):发送到所有卡,没有响应返回。

2. 带响应的广播命令(BCR):发送到所有卡,同时收到从所有卡返回的响应。

3. 带寻址(点对点)的命令(AC):发送到选中的卡,在SDIO_D信号线上不包括数据传输。

4. 带寻址(点对点)的数据传输命令(AC):发送到选中的卡,在SDIO_D信号线上包含数据传输。

(3)命令内容

对SD卡的所有操作都是基于命令进行的,不同协议版本的卡的命令略微有所不同,但遵循向前兼容原则。由于SD卡命令众多,切记不要死记硬背,即用即查,SD卡2.0协议的操作命令,如表12-9所示。

19.jpg

1、响应(Response):响应从卡发送给主机,作为接收到命令的回答。

响应也是在SDIO_CMD线上连续传输的,响应总是以起始位“0”开始,接着是传输方向位为“0”。除了 R3 类型之外,所有响应都用 CRC7(7位CRC校验码)来保护,所有响应也是以结束位结束“1”。响应分为短响应(48bit)和长响应(136bit),取决于卡收到命令的类型,即不同命令对应的响应不同。SD卡有5种响应类型,SD I/O卡增加了的 R4,R5类型的响应,关于响应格式也是了解即可,不需要记忆,SD卡响应如下所示:

(1)R1(正常响应命令):

bit [45:40]代表响应的命令码(0-63),卡的状态存储在bit [39:8]。注意:如果有传输到卡的数据,那么每个块传输完成后,数据线上会有busy信号。主机在发送完数据后,应该检查 busy信号,R1响应格式如表12-10所示。

20.jpg

(1)R1b响应:

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

(2)R2(CID、 CSD寄存器)响应:

SD卡的卡识别寄存器(CID)的内容作为CMD2和CMD10的响应发送。卡特定数据寄存器(CSD)的内容作为CMD9的响应发送。只传输CID和CSD寄存器的[127:1]位,这些寄存器的第[0]位被响应的结束位替代了,R2响应格式如表12-11所示。

21.jpg

(3)R3(OCR寄存器)响应:

OCR寄存器的内容将作为CMD1的响应发出。电平代码的定义是:限制的电压窗口=低,卡繁忙=低,R3响应格式如表12-12所示。

22.jpg

(1)R6(发布的RCA寄存器响应)响应:

用于CMD3的响应。[39:24]用于产生RCA号,[23:8]表示卡的状态位,即RCA寄存器的23,22,19,12:0位,R6响应格式如表12-13所示。

23.jpg

(2)R7(卡接口条件)响应:

卡支持的电压信息通过 CMD8 的响应发送,Bit[19:16]表明卡支持的电压范围,卡接受提供的电压范围就返回R7响应。卡会在响应的参数中返回电压范围和检查模式,R7响应格式如表12-14所示。

24.jpg

2、数据(Data)

数据可以从主机到卡,也可以从卡到主机,通过数据线传输,SDIO总线定义了3种数据模式——1bit、4bit、8bit,其中SD卡只用到1bit和4bit模式,SD卡传输数据时使用的是4bit模式。

(1)常规数据模式(1bit模式):数据通过DAT0数据线传输,常规数据按照低字节在前,高字节在后的顺序传输,但是每个字节的数据则是按照高位在前,低位在后的顺序,格式如12-9所示。

25.jpg

图12-9 常规数据包格式

(2)宽位数据模式(4 bit模式):数据通过DAT0~3数据线传输,宽位数据传输顺序与常规数据模式类似,也是低字节在前,高字节在后的顺序。由于数据线由1根变为4根,数据由串行改为并行传输,DAT3~DAT0依次先发送高4位,再发送低四位,宽位数据格式如12-10所示。

26.jpg

图12-10 宽位数据包格式

12.4 STM32 SDIO接口

STM32F103ZE内部集成了一个SDIO接口用于连接SD卡或者SD I/O卡设备,该接口主要包含2个部分:SDIO适配器模块和AHB总线接口,如图12-11 所示。SDIO适配器模块主要是实现所有MMC/SD/SD I/O卡的相关功能,如时钟的产生、命令和数据的传送。AHB总线接口用于操作SDIO适配器模块中的寄存器,并产生中断和DMA请求信号。

27.jpg

图12-11 SDIO接口结构图

12.4.1 时钟

SDIO接口使用两个时钟信号:SDIO适配器时钟(SDIOCLK)和AHB总线接口时钟(HCLK/2),两者的时钟源如图12-12所示。

SDIO适配器时钟(SDIOCLK):主要用于驱动SDIO适配器和产生SDIO_CK时钟,其频率等于AHB总线频率(当系统主频为72Mhz时,SDIOCLK=HCLK=72Mhz)。

AHB总线接口时钟(HCLK/2):该时钟由AHB总线接口时钟二分频后输入到SDIO接口,用于驱动SDIO适配器的AHB总线接口通信,其频率为HCLK/2=36Mhz。

28.jpg

图12-12 SDIO时钟源

12.4.2 SDIO接口引脚

STM32F103ZE的SDIO接口引脚如表12-15所示,当驱动SD/SD I/O卡时,初始化时所有的引脚应配置为复用推挽输出模式。

29.jpg

SDIO_CK:时钟输出引脚,每个时钟周期在命令和数据线上传输1位命令或数据;对SD或SD I/O卡,时钟频率范围为0Mhz至25Mhz。SDIO_CK时钟频率 = SDIOCLK/(2+CLKDIV),CLKDIV为时钟分频系数,位于SDIO时钟控制寄存器。

注意:SD卡上电后SDIO_CK不能超过400Khz的,否则可能无法完成初始化。初始化以后,可以设置时钟频率(不能超过SD卡的最大操作时钟频率),一般SD 2.0卡设置为25Mhz。

SDIO_CMD:命令/响应线,用于传输命令和卡的响应。

SDIO_D0~D7:数据线,用于数据传输。可以设置SDIO总线宽度为1 bit(SDIO_D0),4bit(SDIO_D[3:0]),8 bit(SDIO_D[7:0])。注意:复位后默认使用SDIO_D0传输,初始化后主机可以通过ACMD6命令设置数据总线的宽度为4bit模式。

SD卡引脚初始化:

30.jpg

12.4.3 SDIO适配器

SDIO适配器是SIDO接口的内部框架,用于连接一组多媒体卡或加密数字存储卡,它包含以下5个部分:适配器寄存器模块、控制单元、命令通道、数据通道、数据FIFO。

31.jpg

图12-13 SDIO适配器结构图

1、适配器寄存器模块

主要包含SDIO接口所有的寄存器,详情参考数据手册相关寄存器介绍。

2、控制单元

包含电源管理功能和为存储器卡提供的时钟分频,控制SDIO_CK引脚的时钟输出和数据总线宽度。

3、命令通道单元——命令/响应传输流程

命令通道单元主要是向卡发送命令并从卡接收响应,命令通道如图12-14 所示。

32.jpg

图12-14 命令通道结构图

命令通道单元的状态标志和控制逻辑共同组成一个控制中心——“命令通道状态机(GPSM)”,它能够根据控制信号按照预先设定的状态进行状态转移,协调相关信号动作,完成特定操作,命令状态机示意图如图12-15 。

33.jpg

图12-15正常的命令/响应流程

如图12-15红色箭头所示,当命令写入到SDIO_CMD(命令寄存器)的CMDINDEX(命令索引位),如果有参数,参数应写入到SDIO_ARG(参数寄存器),一旦设置SDIO_CMD的CPSMEN(CPSM使能位)使能后,命令通道开始发送命令。在SDIO_CK时钟下,命令通过移位寄存器从SDIO_CMD引脚移出,并添加CRC校验码和结束位。命令发送完成时,命令通道状态机(CPSM)设置CMDSENT(命令已发送)状态标志并在不需要响应时进入空闲

状态。

当命令发送完毕后,立即进入等待(Wait)状态,同时命令定时器开始运行,当SDIO_CMD有响应传入后,接收到的CRC码将会与内部产生的CRC码比较,如果错误则舍弃,否则设置CMDREND(接收到响应)状态标志,并将接收到的响应存入相应的响应寄存器。如果命令定时器计时超过64个SDIO_CK周期,则视为响应超时,设置超时标志并进入空闲(Idle)状态。

注意:CPSM应保持至少8个SDIO_CK周期空闲状态,以满足NCC和NRC时序限制。 NCC是两个主机命令间的最小间隔;NRC是主机命令与卡响应之间的最小间隔。

34.jpg

图12-16 SDIO命令传输时间间隔

为了方便传输命令,SDIO库函数中专门声明了一个SDIO_CmdInitTypeDef用于命令传输,其结构体如下所示:

35.jpg

(1)SDIO_Argument——SDIO命令参数

如果是命令包含一个参数,在将命令写入命令寄存器(SDIO_CMD)之前,需要先写入命令参数到命令参数寄存器(SDIO_ARG)。

(2)SDIO_CmdIndex——SDIO命令索引

命令索引也叫命令号,它必须小于0x40,该参数主要设置命令寄存器的命令索引位(CMDINDEX)

(3)SDIO_Response——SDIO响应类型

该参数用于设置SDIO响应 1..4 寄存器,SDIO 定义两个响应类型:48位短响应和136位长响应,通常命令索引都有固定的响应类型,具体响应类型如表12-16所示。

36.jpg

(4)SDIO_Wait——是否启用或禁用SDIO等待中断请求

该参数主要设置命令寄存器(SDIO_CMD)的WAITPEND位和WAITINT位的值,具体参数如表12-17所示。

WAITPEND设置CPSM在开始发送一个命令之前等待数据传输结束

WAITINT设置CPSM在命令定时器超时后关闭命令超时控制并等待中断请求。

37.jpg

(5)SDIO_CPSM——命令通道状态机(CPSM)使能位

该参数主要设置命令寄存器的CPSMEN位,如果设置该位,则使能CPSM,具体参数如表12-18所示。

命令参数设置完毕后,通过SDIO_SendCommand函数根据SDIO CmdInitStruct中指定的参数初始化SDIO命令,并发送命令,具体函数如下:

39.jpg

4、数据通道与数据FIFO

数据FIFO(first in first out)是一个先进先出数据缓冲区,内部按照32位对齐,共128 Byte,同时具有发送和接收单元。已知SDIO总线属于半双工,通过检测SDIO状态寄存器(SDIO_STA)的TXACT(正在发送数据)和RXACT(正在接收数据)标志,判断当前FIFO处于发送状态or接收状态,当TXACT有效时,发送FIFO代表发送电路和数据缓冲区;当RXACT有效时,接收FIFO代表接收电路和数据缓冲区。

40.jpg

图12-17 数据通道结构示意图

数据通道主要用于主机和卡之间进行数据传输,传输分为两部分:发送数据和接收数据。数据传输之前,需要配置时钟控制寄存器(SDIO_CLKCR)中WIDBUS位配置卡的数据总线宽度,初始化时为1bit模式,之后为了提高传输速率,通常将SD卡配置为4bit模式,传输模式设置为“数据块”传输。

发送和接收流程是由数据通道状态机(DPSM)控制。当数据通道不工作时,SDIO_D[7:0]输出处于高阻状态。当使能数据控制寄存器(SDIO_DCTRL)的数据传输使能位(DTEN)时,DPSM依据设定的数据方向位(DTDIR)进入Wait_S或Wait_R状态。

发送流程:设置数据控制寄存器的数据使能位以及数据方向为“控制器至卡”,此时DPSM进入Wait_S状态,一旦FIFO中有数据写入时,DPSM开始进入发送状态,此时移位寄存器开始通过数据线发送数据,当数据计数器为0,DPSM发送CRC校验码,然后发送结束位,并进入繁忙状态(BUSY)。

接收流程:设置数据控制寄存器的数据使能位以及数据方向为“卡至控制器”,此时DPSM进入Wait_R状态并等待开始位,当收到开始位时, DPSM进入接收状态,同时数据通道子单元开始从卡接收数据。接收到的串行数据被组合为字节并写入数据FIFO,当数据块计数器达到0时,DPSM等待接收CRC码,如果接收到的代码与内部产生的CRC码匹配,则DPSM进入Wait_R状态,否则设置CRC失败状态标志同时DPSM进入到空闲状态。

41.jpg

图12-18 数据通道状态机

SDIO数据结构体

42.jpg

(1)SDIO_DataTimeOut——数据超时时间

该参数设置数据定时器寄存器(SDIO_DTIMER)的DATATIME位。计数器从SDIO_DTIMER寄存器加载数值,并在数据通道状态机(DPSM)进入Wait_R或繁忙状态时进行递减计数,当计数器减为0,则设置超时标志。超时范围0~232-1

(2)SDIO_DataLength——数据长度

该参数设置数据长度寄存器(SDIO_DLEN)的DATALENGTH位。表示要传输的数据字节数,对于块数据传输,数据长度必须是数据块长度(见SDIO_DCTRL)的整数倍。在写入数据控制寄存器进行数据传输之前,必须先设置数据定时器寄存器和数据长度寄存器。范围0~225-1

(3)SDIO_DataBlockSize——数据块大小

该参数设置了数据控制寄存器(SDIO_DCTRL)的DBLOCKSIZE位,该位定义了数据块的长度,SD卡通常设置为512Byte,具体参数如表12-19所示

43.jpg

(4)SDIO_TransferDir——传输方向

该参数设置了数据控制寄存器(SDIO_DCTRL)的DTDIR位,用于设定数据传输方向,具体参数如表12-20所示。

44.jpg

(5)SDIO_TransferMode——数据传输模式

该参数设置了数据控制寄存器(SDIO_DCTRL)的DTMODE位,用于设置数据传输模式,其中SD卡采用块数据传输,MMC卡采用流数据传输,具体参数如表12-21所示。

45.jpg

(6)SDIO_DPSM——SDIO传输使能位

该参数设置了数据控制寄存器(SDIO_DCTRL)的DTEN位,参数如表12-22所示。如果设置该位使能,则开始数据传输,根据设置的DTSIR方向位,DPSM进入Wait_S或Wait_R状态。

46.jpg

设置完毕后,调用SDIO_DataConfig函数根据SDIO DataInitStruct中指定的参数初始化SDIO数据路径,具体函数如下:

47.jpg

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多