STM32F4X SDIO(四) SDIO控制器

STM32F4X SDIO(四) SDIO控制器

STM32F4X内部有一个SDIO控制器,开发者可以使用这个控制器跟SD卡进行通信,下面就来简单了解一下STM32F4X的SDIO控制器的使用。

STM32F4X SDIO控制器

SDIO控制器框图

下图为STM32F4X的SDIO控制器框图,框图可以分为以下5部分,适配器寄存器、FIFO、控制单元、命令路径、数据路径。

SDIO控制器时钟

STM32F4X的所有外设都需要时钟才能够工作,SDIO控制器也不例外。SDIO控制工作时需要两个时钟,一个是SDIOCLK时钟和APB2时钟。
SDIOCLK:SDIO控制器输出到SD卡的时钟,该时钟可以通过配置分频系数决定其频率,最大为48MHZ。
APB2时钟:APB2时钟是SDIO控制器的工作时钟。

SDIO控制器的寄存器和FIFO模块使用的APB2时钟、控制单元、命令路径和数据路径使用的是SDIOCLK时钟。

适配器寄存器

适配器寄存器模块包含了STM32F4X SDIO控制器的所有寄存器,所有基于SDIO控制器的操作都需要读写寄存器来完成,STM32F4X的SDIO寄存器一共有16个。

FIFO

STM32F4X的SDIO控制器内部带了FIFO单元,当用户使能了FIFO之后,控制器往SD卡发送数据或者从SD卡接收的数据都可以暂时存到FIFO里面。

控制单元

STM32F4X SDIO控制器的控制单元包含了SD卡电源管理和SD卡的时钟管理功能。

命令路径

STM32F4X SDIO控制器的命令路径主要是给SD卡发送命令并且接收来自SD卡的响应。

数据路径

STM32F4X SDIO控制器的命令路径主要是给SD卡发送数据并且接收来自SD卡的数据。如果使用了8位数据宽度的模式,则SDIO_D7:08根信号线都会使用。如果使用了4位数据宽度的模式,则SDIO_D3:04根信号线都会使用。如果使用了1位数据宽度的模式,则只有SDIO_D01根信号线都会使用。

SDIO寄存器

想要使用STM32F4X的SDIO控制器就要学会配置SDIO的寄存器,下面就来简单了解一下STM32F4X的SDIO寄存器。

SDIO控制相关寄存器

SDIO电源控制寄存器 (SDIO_POWER)

该寄存器的作用是控制SDIO_CK的时钟,通过修改该寄存器使能或者关闭SDIO_CK时钟。

比特位 数值 描述
bit1:0 PWRCTRL 00:掉电:停止为卡提供时钟。 01:保留 10:保留,上电 11:通电:为卡提供时钟。 电源控制位
SDIO时钟控制寄存器 (SDIO_CLKCR)

该寄存器主要是控制SDIO_CK时钟的使能,时钟分频系数的确定,数据线位宽的选择等。

比特位 数值 描述
bit14 HWFC_EN 0:禁止硬件流控制 1:使能硬件流控制 硬件流控制使能
bit13 NEGEDGE 0:在主时钟 SDIOCLK 的上升沿产生 SDIO_CK 1:在主时钟 SDIOCLK 的下降沿产生 SDIO_CK SDIO_CK 移相选择位
bit12:11 WIDBUS 00:默认总线模式:使用 SDIO_D0 01:4 位宽总线模式:使用 SDIO_D3:0 10:8 位宽总线模式:使用 SDIO_D7:0 宽总线模式使能位
bit10 BYPASS 0:禁止旁路:在驱动 SDIO_CK 输出信号前,根据 CLKDIV 值对 SDIOCLK 进行分频。 1:使能旁路:SDIOCLK 直接驱动 SDIO_CK 输出信号。 时钟分频器旁路使能位
bit9 PWRSAV 0:始终使能 SDIO_CK 时钟 1:仅在总线激活时使能 SDIO_CK 节能模式配置位
bit8 CLKEN 0:始终使能 SDIO_CK 时钟 1:仅在总线激活时使能 SDIO_CK 时钟使能位
bit7:0 CLKDIV 该字段定义输入时钟 (SDIOCLK) 与输出时钟 (SDIO_CK) 之间的分频系数: SDIO_CK 频率 = SDIOCLK / CLKDIV + 2 时钟分频系数
SDIO_CK相位

在时钟控制寄存器的bit13中有一个叫时钟相位的概念,所谓的时钟相位意思就是其采样的时间,有两种相位选择,分别是SDIOCLK的上升沿和SDIOCLK的下降沿。

  • SDIOCLK的上升沿产生SDIO_CK
  • SDIOCLK的下降沿产生SDIO_CK

SDIO命令响应相关寄存器

SDIO参数寄存器 (SDIO_ARG)

该寄存器的作用是将命令的参数发送到SD卡

比特位 数值 描述
bit31:0 CMDARG 32位命令参数 作为命令消息的一部分发送给卡的命令参数。如果命令包含参数,则在将命令写入到命令寄存器之前,必须将参数加载到此寄存器中。
SDIO命令寄存器 (SDIO_CMD)

该寄存器主要包含SD卡的命令索引,设置响应类型等。

比特位 数值 描述
bit14 ATACMD 0/1 如果 ATACMD 置 1,则 CPSM 将传输 CMD61。
bit13 nIEN 0:使能 CE-ATA 设备中的中断 1:不使能 CE-ATA 设备中的中断 如果该位为 0,则使能 CE-ATA 设备中的中断
bit12 ENCMDcompl 0:如果此位置 1,则使能命令完成信号 0:不如果此位置 1,则使能命令完成信号 如果此位置 1,则使能命令完成信号
bit11 SDIOSuspend 0:发送的命令不是挂起命令 1:发送的命令为挂起命令。 如果此位置 1,则要发送的命令为挂起命令(仅用于 SDIO 卡)
bit10 CPSMEN 0:不使能 CPSM 1:使能 CPSM 命令路径状态机 (CPSM) 使能位
bit9 WAITPEND 0:CPSM 将不等到数据传输结束后才开始发送命令 1:CPSM 将等到数据传输结束后才开始发送命令 如果此位置 1,则 CPSM 将等到数据传输结束后才开始发送命令
bit8 WAITINT 0:CPSM 允许命令超时并等待中断请求 1:CPSM 禁止命令超时并等待中断请求 如果此位置 1,则 CPSM 禁止命令超时并等待中断请求
bit7:6 WAITRESP 00:无响应,但 CMDSENT 标志除外 01:短响应,但 CMDREND 或 CCRCFAIL 标志除外 10:无响应,但 CMDSENT 标志除外 11:长响应,但 CMDREND 或 CCRCFAIL 标志除外 这些位用于配置 CPSM 是否等待响应,如果等待,将等待哪种类型的响应
bit5:0 CMDINDEX 命令编号 命令索引作为命令消息的一部分发送给卡

该寄存器主要需要关注的有以下几个

  • bit5:0:SD卡命令索引,命令索引在前一章里面有讲过https://blog.csdn.net/hwx1546/article/details/134091068,主要就是往bit5:0写入需要发送的命令编号。
  • bit7:6:响应类型,SD卡有些命令返回的短响应,有些是长响应,也有些是无响应。
SDIO命令响应寄存器 (SDIO_RESPCMD)

有些SD卡响应数据中会包含命令号,而这个命令号可以通过SDIO的命令响应寄存器获取。

比特位 数值 描述
bit5:0 RESPCMD 6位命令响应索引 只读位域。包含接收到的最后一个命令响应的命令索引
SDIO响应1/2/3/4寄存器 (SDIO_RESPx)

该寄存器中包含了SD卡的响应数据,其中短响应用到了SDIO_RESP1寄存器,而长响应用到了SDIO_RESP1/2/3/4寄存器

寄存器 短响应 长响应
SDIO_RESP1 卡状态31:0 卡状态 127:96
SDIO_RESP2 X 卡状态 95:64
SDIO_RESP3 X 卡状态 63:32
SDIO_RESP4 X 卡状态 31:1

SDIO数据相关寄存器

SDIO数据定时器寄存器(SDIO_DTIMER)

该寄存器设置的SDIO数据超时周期,其周期是SD卡总线时钟周期*寄存器值

比特位 数值 描述
bit31:0 DATATIME 超时值 以卡总线时钟周期表示的数据超时周期。
SDIO数据长度寄存器(SDIO_DLEN)

该寄存器设置的是SD卡读写过程中的需要传输的数据长度。

比特位 数值 描述
bit24:0 DATALENGTH 数据字节个数 要传输的数据字节数量。

注意:对于块数据传输,数据长度寄存器中的值必须是块大小的倍数。对于SDIO多字节传输,数据长度寄存器中的值必须在1到512之间。

SDIO数据控制寄存器(SDIO_DCTRL)
比特位 数值 描述
bit11 SDIOEN 0/1 如果将该位置 1,则 DPSM 执行特定于 SD I/O 卡的操作。
bit10 RWMOD 0:通过停止 SDIO_D2 进行读取等待控制 1:使用 SDIO_CK 进行读取等待控制 读取等待模式
bit9 RWSTOP 0:如果将 RWSTART 位置 1,则读取等待正在进行中 1:如果将 RWSTART 位置 1,则使能读取等待停止 读取等待停止
bit8 RWSTART 0:读取等待未开始 1:读取等待开始。 如果将该位置 1,则读取等待操作开始
bit7:4 DBLOCKSIZE 0000:(十进制数 0)块长度 = 2的0次方= 1 字节 0001:(十进制数 1) 块长度 = 2的1次方 = 2 字节 0010:(十进制数 2) 块长度 = 2的2次方 = 4 字节 0011:(十进制数 3) 块长度 = 2的3次方 = 8 字节 0100:(十进制数 4) 块长度 = 2的4次方 = 16 字节 0101:(十进制数 5) 块长度 = 2的5次方 = 32 字节 0110:(十进制数 6) 块长度 = 2的6次方 = 64 字节 0111:(十进制数 7) 块长度 = 2的7次方 = 128 字节 1000:(十进制数 8) 块长度 = 2的8次方 = 256 字节 1001:(十进制数 9) 块长度 = 2的9次方 = 512 字节 1010:(十进制数 10 块长度 = 2的10次方 = 1024 字节 1011:(十进制数 11) 块长度 = 2的11次方 = 2048 字节 1100:(十进制数 12) 块长度 = 2的12次方 = 4096 字节 1101:(十进制数 13) 块长度 = 2的13次方 = 8192 字节 1110:(十进制数 14) 块长度 = 2的14次方 = 16384 字节 1111:(十进制数 15) 保留 定义在选择了块数据传输模式时数据块的长度
bit3 DMAEN 0:禁止 DMA 1:使能 DMA DMA 使能位
bit2 DTMODE 0:块数据传输 1:流或 SDIO 多字节数据传输 数据传输模式选择
bit1 DTDIR 0:从控制器到卡 1:从卡到控制器 数据传输方向选择
bit0 DTEN 如果 1 写入到 DTEN 位,则数据传输开始。根据方向位 DTDIR,如果在传输开始时立即将 RW 置 1开始,则 DPSM 变为 Wait_S 状态、Wait_R 状态或读取等待状态。在数据传输结束 后不需要将使能位清零,但必须更新 SDIO_DCTRL 以使能新的数据传输 数据传输使能位

该寄存器主要需要关注的有以下几个

  • bit1 数据传输方向:数据传输方向有两个,当我们往SD卡写数据时,方向是SDIO控制器到SD卡。当从SD卡读数据时,方向是从SD卡到SDIO控制器
  • bit2 数据传输模式:对于SDHC容量的SD卡来说数据传输模式是块数据传输。对于标准SD卡来说数据传输模式则是流或多字节传输
  • bit7:4 数据块大小:对于SDHC容量的SD卡,数据块大小通常是512字节。数据块大小要是数据长度寄存器的整数倍
SDIO 数据计数器寄存器 (SDIO_DCOUNT)

该寄存器返回的是传输剩余的数据量,只读。

比特位 数值 描述
bit24:0 DATACOUNT 数据计数值 读取该位时,将返回要传输的剩余数据字节数量。写入没有任何效果。

SDIO状态相关寄存器

SDIO 状态寄存器 (SDIO_STA)

该寄存器是一个只读寄存器,保存了SDIO工作过程中的各种状态。该寄存器中的位被置1则代表该位代表的状态发送,如果为0则代表该位的状态没有发生。

比特位 描述
bit23 CEATAEND 针对 CMD61 收到了 CE-ATA 命令完成信号
bit22 SDIOIT 收到了 SDIO 中断 (SDIO interrupt received)
bit21 RXDAVL 接收 FIFO 中有数据可用 (Data available in receive FIFO)
bit20 TXDAVL 传输 FIFO 中有数据可用 (Data available in transmit FIFO)
bit19 RXFIFOE 接收 FIFO 为空 (Receive FIFO empty)
bit18 TXFIFOE 发送 FIFO 为空 (Transmit FIFO empty)
bit17 RXFIFOE 接收 FIFO 已满 (Receive FIFO full)
bit16 TXFIFOF 传输 FIFO 已满 (Transmit FIFO full)
bit15 RXFIFOHF 接收 FIFO 半满
bit14 TXFIFOHE 传输 FIFO 半空
bit13 RXACT 数据接收正在进行中 (Data receive in progress)
bit12 TXACT 数据传输正在进行中 (Data transmit in progress)
bit11 CMDACT 命令传输正在进行中 (Command transfer in progress)
bit10 DBCKEND 已发送/ 接收数据块(CRC 校验通过)
bit9 STBITERR 在宽总线模式下,并非在所有数据信号上都检测到了起始位
bit8 DATAEND 数据结束(数据计数器 SDIDCOUNT 为零)
bit7 CMDSENT 命令已发送(不需要响应)(Command sent (no response required))
bit6 CMDREND 已接收命令响应(CRC 校验通过)
bit5 RXOVERR 收到了 FIFO 上溢错误 (Received FIFO overrun error)
bit4 TXUNDERR 传输 FIFO 下溢错误 (Transmit FIFO underrun error)
bit3 DTIMEOUT 数据超时 (Data timeout)
bit2 CTIMEOUT 命令响应超时 (Command response timeout)
bit1 DCRCFAIL 已发送/ 接收数据块(CRC 校验失败)
bit0 CCRCFAIL 已接收命令响应(CRC 校验失败)
SDIO 中断清零寄存器 (SDIO_ICR)

当用户往该寄存器的某些位写1时,会将SDIO_STA的对应位清0

比特位 数值 描述
bit23 CEATAENDC 0:未将 CEATAEND 清零 1:已将 CEATAEND 清零 CEATAEND 标志清零位
bit22 SDIOITC 0:未将 SDIOITC清零 1:已将 SDIOITC清零 SDIOIT 标志清零位
bit10 DBCKENDC 0:未将 DBCKENDC清零 1:已将 DBCKENDC清零 DBCKENDC标志清零位
bit9 STBITERRC 0:未将 STBITERRC清零 1:已将 STBITERRC清零 STBITERRC标志清零位
bit8 DATAENDC 0:未将 DATAENDC清零 1:已将 DATAENDC清零 DATAENDC标志清零位
bit7 CMDSENTC 0:未将 CMDSENTC清零 1:已将 CMDSENTC清零 CMDSENTC标志清零位
bit6 CMDRENDC 0:未将 CMDRENDC清零 1:已将 CMDRENDC清零 CMDRENDC标志清零位
bit5 RXOVERRC 0:未将 RXOVERRC清零 1:已将 RXOVERRC清零 RXOVERRC标志清零位
bit4 TXUNDERRC 0:未将 TXUNDERRC清零 1:已将 TXUNDERRC清零 TXUNDERRC标志清零位
bit3 DTIMEOUTC 0:未将 DTIMEOUTC清零 1:已将 DTIMEOUTC清零 DTIMEOUTC标志清零位
bit2 CTIMEOUTC 0:未将 CTIMEOUTC清零 1:已将 CTIMEOUTC清零 CTIMEOUTC标志清零位
bit1 DCRCFAILC 0:未将 DCRCFAILC清零 1:已将 DCRCFAILC清零 DCRCFAILC标志清零位
bit0 CCRCFAILC 0:未将 CCRCFAILC清零 1:已将 CCRCFAILC清零 CCRCFAILC标志清零位
SDIO 屏蔽寄存器 (SDIO_MASK)

当用户往该寄存器的某些位写1时,该标志位就会产生一个中断。

比特位 数值 描述
bit23 CEATAENDIE 0:禁止接收到 CE-ATA 命令完成信号时中断 1:使能接收到 CE-ATA 命令完成信号时中断 接收到 CE-ATA 命令完成信号时中断使能
bit22 SDIOITIE 0:禁止接收到 SDIO 模式中断时中断 1:使能接收到 SDIO 模式中断时中断 接收到 SDIO 模式中断时中断使能
bit21 RXDAVLIE 0:禁止 Rx FIFO 中有数据时中断 1:使能 Rx FIFO 中有数据时中断 Rx FIFO 中数据可用时中断使能
bit20 TXDAVLIE 0:禁止 Tx FIFO 中数据可用时中断 1:使能 Tx FIFO 中数据可用时中断 Tx FIFO 中数据可用时中断使能
bit19 RXFIFOEIE 0:禁止 Rx FIFO 为空时中断 1:使能 Rx FIFO 为空时中断 Rx FIFO 为空时中断使能
bit18 TXFIFOEIE 0:禁止 Tx FIFO 为空时中断 1:使能 Tx FIFO 为空时中断 Tx FIFO 为空时中断使能
bit17 RXFIFOFIE 0:禁止 Rx FIFO 变满时中断 1:使能 Rx FIFO 变满时中断 Rx FIFO 变满时中断使能
bit16 TXFIFOFIE 0:禁止 Tx FIFO 变满时中断 1:使能 Tx FIFO 变满时中断 Tx FIFO 变满时中断使能
bit15 RXFIFOHFIE 0:禁止 Rx FIFO 半满时中断 1:使能 Rx FIFO 半满时中断 Rx FIFO 半满时中断使能
bit14 TXFIFOHEIE 0:禁止 Tx FIFO 半空时中断 1:使能 Tx FIFO 半空时中断 Tx FIFO 半空时中断使能
bit13 RXACTIE 0:禁止数据接收操作中断 1:使能数据接收操作中断 数据接收操作中断使能
bit12 TXACTIE 0:禁止数据传输操作中断 1:使能数据传输操作中断 数据传输操作中断使能
bit11 CMDACTIE 0:禁止命令操作中断 1:使能命令操作中断 命令操作中断使能
bit10 DBCKENDIE 0:禁止数据块结束中断 1:使能数据块结束中断 数据块结束中断使能
bit9 STBITERRIE 0:禁止起始位错误中断 1:使能起始位错误中断 起始位错误中断使能
bit8 DATAENDIE 0:禁止数据结束中断 1:使能数据结束中断 数据结束中断使能
bit7 CMDSENTIE 0:禁止命令发送中断 1:使能命令发送中断 命令发送中断使能
bit6 CMDRENDIE 0:禁止命令响应接收中断 1:使能命令响应接收中断 命令响应接收中断使能
bit5 RXOVERRIE 0:禁止 Rx FIFO 上溢错误中断 1:使能 Rx FIFO 上溢错误中断 Rx FIFO 上溢错误中断使能
bit4 TXUNDERRIE 0:禁止 Tx FIFO 下溢错误中断 1:使能 Tx FIFO 下溢错误中断 Tx FIFO 下溢错误中断使能
bit3 DTIMEOUTIE 0:禁止数据超时中断 1:使能数据超时中断 数据超时中断使能
bit2 CTIMEOUTIE 0:禁止命令超时中断 1:使能命令超时中断 命令超时中断使能
bit1 DCRCFAILIE 0:禁止数据 CRC 失败中断 1:使能数据 CRC 失败中断 数据 CRC 失败中断使能
bit0 CCRCFAILIE 0:禁止命令 CRC 失败中断 1:使能命令 CRC 失败中断 命令 CRC 失败中断使能

SDIO FIFO相关寄存器

SDIO FIFO 计数器寄存器 (SDIO_FIFOCNT)

该寄存器包含了FIFO写入或读取的剩余字节数

比特位 数值 描述
bit24:0 FIFOCOUNT FIFO剩余的字节数 要在 FIFO 中写入或读取的剩余字数
SDIO 数据 FIFO 寄存器 (SDIO_FIFO)

该寄存器用来发生个接收SD卡数据

比特位 数值 描述
bit31:0 FIFOData FIFO数据 接收和传输 FIFO 数据
相关推荐
✎ ﹏梦醒͜ღ҉繁华落℘1 天前
单片机基础知识---stm32单片机的优先级
stm32·单片机·mongodb
u152109648491 天前
S.S.Audio PRO A2音频隔离器
嵌入式硬件·音视频·实时音视频·视频编解码·视频
zd8451015001 天前
RS485 总线详解
单片机·嵌入式硬件
半条-咸鱼1 天前
【STM32】I2C协议原理、HAL读写与OLED显示操作
嵌入式硬件·c·信息与通信
牛根生同志1 天前
SPI数据收发的时候 TXE与RXNE标志位置位的时机
stm32·spi·transfer
wohoo_wangzi1 天前
苏州晟雅泰电子:关于W25Q128JVSIQ这个芯片物料的参数,规格及应用领域
嵌入式硬件
goldenrolan1 天前
学习型红外控制系统稳定性挂测工装专项总结
软件测试·python·stm32·嵌入式·红外
✎ ﹏梦醒͜ღ҉繁华落℘1 天前
编程基础 --高内聚,低耦合
c语言·单片机
科芯创展1 天前
1A,1MHz,30VIN,XZ4115,降压恒流LED驱动芯片
单片机·嵌入式硬件
集芯微电科技有限公司1 天前
四通道2A输出集成功率电感降压模块专为紧凑型方案设计
人工智能·单片机·嵌入式硬件·生成对抗网络·计算机外设