STM32的SDIO功能框图及SDIO结构体

目录

STM32的SDIO功能框图及SDIO结构体

STM32的SDIO功能框图

SDIO适配器

命令路径

CPSM状态机

数据路径

DPSM状态机

数据FIFO

适配器寄存器

SDIO相关结构体

SDIO初始化结构体

SDIO命令初始化结构体

SDIO数据初始化结构体


STM32的SDIO功能框图及SDIO结构体

STM32的SDIO功能框图

        STM32控制器有一个SDIO,由两部分组成:SDIO适配器和APB2接口,SDIO适配器提供SDIO主机功能,可以提供SD时钟、发送命令和进行数据传输。APB2接口用于控制器访问SDIO适配器寄存器并且可以产生中断和DMA请求信号。

STM32的SDIO功能框图及SDIO结构体_第1张图片

        SDIO使用两个时钟信号,一个是SDIO适配器时钟(SDIOCLK=HCLK(注意此情况适用于F1,对于F4来说SDIOCLK=48M)),另外一个是AHB总线时钟的二分频(HCLK/2,一般为36MHz)。SDIO_CK会对SDIOCLK分频,比如72M就三分频为24M。

        STM32控制器的SDIO是针对MMC卡和SD卡的主设备,所以预留有8根数据线,对于SD卡最多用四根数据线。

        大容量STM32F103xx共有8根SDIO的数据线,其中D4、D5、D6和D7作为预留,SD卡只用到了D0-D3,其它脚在MMC卡或者SDXC卡会用到。

STM32的SDIO功能框图及SDIO结构体_第2张图片

STM32的SDIO功能框图及SDIO结构体_第3张图片

SDIO适配器

        SDIO适配器是SD卡系统主机部分,是STM32控制器与SD卡数据通信中间设备。SDIO适配器由五个单元组成,分别是控制单元、命令路径单元、数据路径单元、寄存器单元以及FIFO。

STM32的SDIO功能框图及SDIO结构体_第4张图片

        FIFO作为数据缓冲区,一共有32个字,可以用于当我们接收完32个字之后,再使用DMA进行传输。

命令路径

命令路径控制命令发送,并接收卡的响应,当SD卡处于某一状态时,SDIO适配器必然处于特定状态与之对应。STM32控制器以命令路径状态机(CPSM)来描述SDIO适配器状态变化,并加入了等待超时检测功能,以便退出永久等待的情况。

STM32的SDIO功能框图及SDIO结构体_第5张图片

CPSM状态机

STM32的SDIO功能框图及SDIO结构体_第6张图片

数据路径

        数据路径部件负责与SD卡相互数据传输,SDIO适配器以数据路径状态机(DPSM)来描述SDIO适配器状态变化情况。并加入了等待超时检测功能,以便退出永久等待情况。发送数据时,DPSM处于等待发送(Wait_S)状态,如果数据FIFO不为空,DPSM变成发送状态并且数据路径部件启动向卡发送数据。接收数据时,DPSM处于等待接收状态,当DPSM收到起始位时变成接收状态,并且数据路径部件开始从卡接收数据。

STM32的SDIO功能框图及SDIO结构体_第7张图片

DPSM状态机

STM32的SDIO功能框图及SDIO结构体_第8张图片

数据FIFO

        数据FIFO(先进先出)部件是一个数据缓冲器,带发送和接收单元。控制器的FIFO包含宽度为32bit、深度为32字的数据缓冲器和发送/接收逻辑。

        SDIO状态寄存器(SDIO_STA)的TXACT位用于指示当前正在发送数据,RXACT位指示当前正在接收数据,这两个位不可能同时为1。

  • 当TXACT为1时,可以通过AHB接口将数据写入到传输FIFO。
  • 当RXACT为1时,接收FIFO存放从数据路径部件接收到的数据。

根据FIFO空或满状态会把SDIO_STA寄存器位值1,并可以产生中断和DMA请求。

适配器寄存器

        适配器寄存器包含了控制SDIO外设的各种控制寄存器及状态寄存器,内容较多,可以通过SDIO提供的各种结构体来了解,这些寄存器的功能都被整合到了结构体或ST标准库之中。

SDIO相关结构体

        标准库函数对SDIO外设建立了三个初始化结构体,分别为SDIO初始化结构体SDIO_InitTypeDef、SDIO命令初始化结构体SDIO_CmdInitTypeDef和SDIO数据初始化结构体SDIO_DataInitTypeDef。

  • 初始化结构体成员用于设置SDIO工作环境参数,并由SDIO相应初始化配置函数或功能函数调用,这些参数将会被写入到SDIO相应的寄存器,达到配置SDIO工作环境的目的。
  • SDIO命令初始化结构体用于设置命令相关内容,比如命令号、命令参数、响应类型等等。
  • SDIO数据初始化结构体用于配置数据发送和接收参数,比如传输超时、数据长度、传输模式等等。

SDIO初始化结构体

SDIO初始化结构体用于配置SDIO基本工作环境,比如时钟分频、时钟沿、数据宽度等等。

STM32的SDIO功能框图及SDIO结构体_第9张图片

  • SDIO_ClockEdge:主时钟SDIOCLK产生CLK引脚时钟有效沿选择,可选上升沿或下降沿,它设定SDIO时钟控制寄存器(SDIO_CLKCR)的NEGEDGE位的值,一般选择设置为高电平(上升沿)。
  • SDIO_ClockBypass:时钟分频旁路使用,可选使能或禁用,它设定SDIO_CLKCR寄存器的BYPASS位。如果使能旁路,SDIOCLK直接驱动CLK线输出时钟;如果禁用,使用SDIO_CLKCR寄存器的CLKDIV位值分频SDIOCLK,然后输出到CLK线。一般选择禁用时钟分频旁路。
  • SDIO_ClockPowerSave:节能模式选择,可选使能或禁用,它设定SDIO_CLKCR寄存器的PWRSAV位的值。如果使能节能模式,CLK线只有在总线激活时才有时钟输出;如果禁用节能模式,始终使能CLK线输出时钟。
  • SDIO_BusWide:数据线宽度选择,可选1位数据总线、4位数据总线或8为数据总线,系统默认使用1位数据总线,操作SD卡时在数据传输模式下一般选择4位数据总线。它设定SDIO_CLKCR寄存器的WIDBUS位的值。
  • SDIO_HardwareFlowControl:硬件流控制选择,可选使能或禁用,它设定SDIO_CLKCR寄存器的HWFC_EN位的值。硬件流控制功能可以避免FIFO发送上溢和下溢错误。
  • SDIO_ClockDiv:时钟分频系数,它设定SDIO_CLKCR寄存器的CLKDIV位的值,设置SDIOCLK与CLK线输出时钟分频系数:

        CLK线时钟频率=SDIOCLK/([CLKDIV+2])。

还要注意当SD/SDIO卡处于识别模式,SDIO_CK的频率必须设置低于400kHz

STM32的SDIO功能框图及SDIO结构体_第10张图片

SDIO命令初始化结构体

        SDIO命令初始化结构体用于设置命令相关内容,比如命令号、命令参数、响应类型等等。

STM32的SDIO功能框图及SDIO结构体_第11张图片

  • SDIO_Argument:作为命令的一部分发送到卡的命令参数,它设定SDIO参数寄存器(SDIO_ARG)的值。
  • SDIO_CmdIndex:命令号选择,它设定SDIO命令寄存器(SDIO_CMD)的CMDINDEX位的值。
  • SDIO_Response:响应类型,SDIO定义两个响应类型:长响应和短响应。根据命令号选择对应的响应类型。SDIO定义了四个32位的SDIO响应寄存器(SDIO_RESPx,x=1..4),短响应只用到SDIO_RESP1。
  • SDIO_Wait:等待类型选择,有三种状态可选,一种是无等待状态,超时检测功能启动;一种是等待中断,另外一种是等待传输完成。它设定SDIO_CMD寄存器的WAITPEND位和WAITINT位的值。
  • SDIO_CPSM:命令路径状态机控制,可选使能或禁用CPSM。它设定SDIO_CMD寄存器的CPSMEN位的值。

SDIO数据初始化结构体

        SDIO数据初始化结构体用于配置数据发送和接收参数,比如传输超时、数据长度、传输模式等等。它被SDIO_DataConfig函数使用。

STM32的SDIO功能框图及SDIO结构体_第12张图片

  • SDIO_DataTimeOut:设置数据传输以卡总线时钟周期表示的超时周期,它设定SDIO数据定时器寄存器(SDIO_DTIMER)的值。在DPSM进入Wait_R或繁忙状态后开始递减,直到0还处于以上两种状态则将超时状态标志置1.
  • SDIO_DataLength:设置传输数据长度,它设定SDIO数据长度寄存器(SDIO_DLEN)的值。
  • SDIO_DataBlockSize:设置数据块大小,有多种尺寸可选,不同命令要求的数据块可能不同。它设定SDIO数据控制寄存器(SDIO_DCTRL)寄存器的DBLOCKSIZE位的值。
  • SDIO_TransferDir:数据传输方向,可选从主机到卡的写操作,或从卡到主机的读操作。它设定SDIO_DCTRL寄存器的DTDIR位的值。
  • SDIO_TransferMode:数据传输模式,可选数据块或数据流模式(仅适用于多媒体卡)。对于SD卡操作使用数据块类型。它设定SDIO_DCTRL寄存器的DTMODE位的值。
  • SDIO_DPSM:数据路径状态机控制,可选使能或禁用DPSM。它设定SDIO_DCTRL寄存器的DTEN位的值。要实现数据传输都必须使能SDIO_DPSM。

你可能感兴趣的:(SDIO,stm32,单片机,SDIO,嵌入式)