STM32入门学习笔记之SD卡基础读写实验2

电子说

1.2w人已加入

描述

20.2.6 SDIO命令寄存器:SDIO_CMD

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
-
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
- CE_ATACMD nIEN ENCMDcomp1 SDIOSuspend CPSMEN WAITPEND WAITINT WAITRESP CMDINDEX

Bit 14:CE-ATA命令

如果设置该位,CPSM转至CMD61

Bit 13:不使能中断

如果未设置该位,则使能CE-ATA设备的中断

Bit 12:使能CMD完成

如果设置该位,则使能命令完成信号

Bit 11:SDIO暂停命令

如果设置该位,则将要发送的命令是一个暂停命令(只能用于SDIO卡)

Bit 10:命令通道状态机使能位

如果设置该位,则使能CPSM

Bit 9:CPSM等待数据传输结束(CmdPend内部信号)

如果设置该位,则CPSM在开始发送一个命令之前等待数据传输结束

Bit 8:CPSM等待中断请求

如果设置该位,则CPSM关闭命令超时控制并等待中断请求

Bit 7~Bit 6:等待响应位

00:无响应,期待CMDSENT标志

01:短响应,期待CMDREND或CCRCFAIL标志

10:无响应,期待CMDSENT标志

11:长响应,期待CMDREND或CCRCFAIL标志

Bit 5~Bit 0:命令索引,作为命令的一部分发送到卡中

20.2.7 SDIO数据定时器:SDIO_DTIMER

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
DATATIME[31:16]
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
DATATIME[15:0]

Bit 31~Bit 0:数据超时时间,以卡总线时钟周期为单位的数据超时时间

20.2.8 SDIO数据长度寄存器:SDIO_DLEN

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
- DATALENGTH[24:16]
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
DATALENGTH[15:0]

Bit 24~Bit 0:数据长度,要传输的数据字节数目

20.2.9 SDIO数据控制寄存器:SDIO_DCTRL

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
-
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
- SDIOEN RWMOD RWSTOP RWSTART DBLOCKSIZE DMAEN DTMODE DTDIR DTEN

Bit 11:SDIO使能功能

如果设置了该位,则DPSM执行SDIO卡特定的操作

Bit 10:读等待模式

0:停止SDIO_CK控制读等待

1:使用SDIO_D2控制读等待

Bit 9:读等待停止

0:如果设置了RWSTART,执行读等待

1:如果设置了RWSTART,停止读等待

Bit 8:读等待开始

设置该位开始读等待操作

Bit 7~Bit 4:数据块长度,当选择了块数据传输模式,该域定义数据块长度

0000:块长度=1字节

0001:块长度=2字节

0010:块长度=4字节

0011:块长度=8字节

0100:块长度=16字节

0101:块长度=32字节

0110:块长度=64字节

0111:块长度=128字节

1000:块长度=256字节

1001:块长度=512字节

1010:块长度=1024字节

1011:块长度=2048字节

1100:块长度=4096字节

1101:块长度=8192字节

1110:块长度=16384字节

1111:保留

Bit 3:DMA使能位

0:关闭DMA

   1:使能DMA

Bit 2:数据传输模式

0:块数据传输

   1:流数据传输

Bit 1:数据传输方向

0:控制器至卡

   1:卡至控制器

Bit 0:数据传输使能位

如果设置该位为1,则开始数据传输。根据DTSIR方向位,DPSM进入Wait_S或Wait_R状态,如果在传输的一开始就设置了RWSTART位,则DPSM进入读等待状态。不需要在数据传输结束后清除使能位,但必须更改SDIO_DCTRL以允许新的数据传输。

20.2.10 SDIO状态寄存器:SDIO_STA

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
- CEATAEND SDIOIT RXDAVL TXDAVL RXFIFOE TXFIFOE RXFIFOF TXFIFOF
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
RXFIFOHF TXFIFOHF RXACT TXACT CMDACT DBCKEND STBITERR DATAEND CMDSENT CMDREND RXOVERR TXUNDERR DTMEOUT CTIMEOUT DCRCFAIL CCRCFAIL

Bit 23:在CMD61接收到CE-ATA命令完成信号

Bit 22:收到SDIO中断

Bit 21:在接收FIFO中的数据可用

Bit 20:在发送FIFO中的数据可用

Bit 19:接收FIFO空

Bit 18:发送FIFO空

若使用了硬件流控制,当FIFO包含2个字时,TXFIFOE信号变为有效。

Bit 17:接收FIFO满

若使用了硬件流控制,当FIFO还差2个字满时,RXFIFOF信号变为有效。

Bit 16:发送FIFO满

Bit 15:接收FIFO半满,FIFO中至少还有8个字

Bit 14:发送FIFO半空,FIFO中至少还可以写入8个字。

Bit 13:正在接收数据

Bit 12:正在发送数据

Bit 11:正在传输命令

Bit 10:已发送/接收数据块(CRC检测成功)

Bit 9:在宽总线模式,没有在所有数据信号上检测到起始位

Bit 8:数据结束(数据计数器,SDIO_DCOUNT=0)

Bit 7:命令已发送(不需要响应)

Bit 6:已接收到响应(CRC检测成功)

Bit 5:接收FIFO上溢错误

Bit 4:发送FIFO下溢错误

Bit 3:数据超时

Bit 2:命令响应超时

命令超时时间是一个固定的值,为64个SDIO_CK时钟周期。

Bit 1:已发送/接收数据块(CRC检测失败)

Bit 0:已收到命令响应(CRC检测失败)

注:状态寄存器可以用来查询SDIO控制器的当前状态。比如SDIO_STA的位2表示命令响应超时,说明SDIO的命令响应出了问题。我们通过设置SDIO_ICR的位2则可以清除这个超时标志,而设置SDIO_MASK的位2,则可以开启命令响应超时中断,设置为0关闭。

20.2.11 SDIO数据FIFO寄存器:SDIO_FIFO

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
FIFODATA[31:16]
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
FIFODATA[15:0]

Bit 31~Bit 0:接收或发送FIFO数据

FIFO数据占据32个32位的字,地址为:SDIO基址+0x80至SDIO基址+0xFC

数据FIFO寄存器包括接收和发送FIFO,他们由一组连续的32个地址上的32个寄存器组成,CPU可以使用FIFO读写多个操作数。例如我们要从SD卡读数据,就必须读SDIO_FIFO寄存器,要写数据到SD卡,则要写SDIO_FIFO寄存器。SDIO将这32个地址分为16个一组,发送接收各占一半。而我们每次读写的时候,最多就是读取发送FIFO或写入接收FIFO的一半大小的数据,也就是8个字(32个字节),在操作SDIO_FIFO(不论读出还是写入)必须是以4字节对齐的内存进行操作,否则将导致出错。

20.3 SD卡初始化

20.3.1 卡上电流程

单片机

20.3.2 卡初始化流程

单片机

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分