STM32F4之SDIO接口

STM32F4之SDIO接口一 SDIO 接口简介 SDIO 全称 SecureDigita 即安全数字输入输出接口 它是在 SD 卡接口的基础上发展而来 它可以兼容之前的 SD 卡 并可以连接 SDIO 接口设备 比如 蓝牙 WIFI 照相机等 SDIO 和 SD 卡规范间的一个重要区别是增加了低速标准 低速卡的目标应用是以最小的硬件开支支持低速 I O 能力 低速卡支持类似调制解调器 条码扫描仪和 GPS 接收器等应用 STM32 的 SDIO 控制器支持多媒体卡 MMC 卡 SD 存储卡 SDI O 卡和 CE ATA

一、SDIO接口简介

  • ①与多媒体卡系统规格书版本4.2全兼容。支持三种不同的数据总线模式:1位(默认)、4位和8位。
  • ②与较早的多媒体卡系统规格版本全兼容(向前兼容)。
  • ③与SD存储卡规格版本2.0全兼容。
  • ④与SD I/O卡规格版本2.0全兼容:支持两种不同的数据总线模式:1位(默认)和4位。
  • ⑤完全支持CE-ATA功能(与CE-ATA数字协议版本1.1全兼容)。 8位总线模式下数据传输速率可达48MHz。
  • ⑥数据和命令输出使能信号,用于控制外部双向驱动器。

二、SDIO框图以及SDIO时钟

在这里插入图片描述复位后SDIO_D0用于数据传输。初始化后主机可以改变数据总线的宽度(通过ACMD6命令设置)。如果一个多媒体卡接到了总线上,则SDIO_D0、SDIO_D[3:0]或SDIO_D[7:0]可以用于数据传输。
MMC版本V3.31和之前版本的协议只支持1位数据线,所以只能用SDIO_D0(为了通用性考虑,在程序里面我们只要检测到是MMC卡就设置为1位总线数据)。
SDIO时钟
1、卡时钟(SDIO_CK):每个时钟周期在命令和数据线上传输1位命令或数据。对于SD或SD I/O卡,时钟频率可以在0MHz至25MHz间变化。
2、SDIO适配器时钟(SDIOCLK):该时钟用于驱动SDIO适配器,可用于产生SDIO_CK时钟。对F1来说,SDIOCLK来自HCLK(72Mhz);对F4来说,SDIOCLK来自PLL48CK(48Mhz)。
3、F1:AHB总线接口时钟(HCLK/2):该时钟用于驱动SDIO的AHB总线接口,其频率为HCLK/2=36Mhz。
F4:APB2总线接口时钟(PCLK2):该时钟用于驱动SDIO的APB2总线 接口,其频率为PCLK2=84Mhz。
在这里插入图片描述
注意:在SD卡初始化时,SDIO_CK不可以超过400Khz,初始化完成后,可以设置为最大频率(但不可以超过SD卡最大操作频率)。







三、SDIO命令和响应

命令
SDIO的命令分为:应用相关命令(ACMD)和通用命令(CMD)两部分。发送ACMD时,需先发送CMD55。
SDIO所有的命令和响应都是在SDIO_CMD引脚上面传输的,命令长度固定为48位,SDIO命令格式如下表所示:在这里插入图片描述
其中:除了命令索引和参数需要我们设置,其他都是由SDIO硬件自动控制。命令索引(如CMD0,CMD1之类)由SDIO_CMD寄存器设置,命令参数则由SDIO_ARG寄存器设置。
响应
一般SD卡在接收到命令行,都会有一个应答(CMD0例外),这个应答我们也称之为响应。STM32的SDIO接口,支持2种响应类型:短响应(48位)和长响应(136位)。SD卡总共有6类响应(R1、R1b、R2、R3、R6、R7),我们这里以R1为例简单介绍一下。R1(普通响应命令)响应属于短响应
1、STM32 SDIO短响应(48位)格式如下表所示:在这里插入图片描述
2、STM32 SDIO长响应(136位)格式如下表所示:在这里插入图片描述
不论是短响应还是长响应,硬件都会自动滤除了起始位、传输位、CRC7以及结束位等信息,对于短响应,命令索引存放在SDIO_RESPCMD寄存器,参数则存放在SDIO_RESP1寄存器里面。对于长响应,则仅留CID/CSD位域,存放在SDIO_RESP1~SDIO_RESP4等4个寄存器。







四、SDIO块数据传输

  • 从机在收到主机相关命令后,开始发送数据块给主机,所有数据块都带CRC校验(由硬件自动处理),单个数据块读的时候,在收到1个数据块以后即可以停止了,不需要发送停止命令(CMD12)。但是多块数据读的时候,SD卡将一直发送数据给主机,直到接到主机发送的STOP命令(CMD12)。
  • 数据块写操作同数据块读操作基本类似,只是数据块写的时候,多了一个繁忙判断,新的数据块必须在SD卡非繁忙的时候发送。这里的繁忙信号由SD卡拉低SDIO_D0,以表示繁忙,SDIO硬件自动控制,不需要我们软件处理。
  • 该寄存器只有最低2位(PWRCTRL[1:0])有效,其他都是保留位,STM32复位以后,PWRCTRL=00,处于掉电状态。所以,我们首先要给SDIO上电,设置这两个位为:11。

2、SDIO时钟控制寄存器(SDIO_CLKCR)在这里插入图片描述
3、SDIO参数寄存器(SDIO_ARG)
在这里插入图片描述
4、SDIO命令寄存器(SDIO_CMD)在这里插入图片描述


  • 低6位为命令索引,即要发送的命令索引号(如发送CMD1,其值为1,索引就设置为1)。位[7:6],用于设置等待响应位,用于指示CPSM是否需要等待,以及等待类型等。
  • 该寄存器只有低6位有效,比较简单,用于存储最后收到的命令响应中的命令索引。如果传输的命令响应不包含命令索引,则该寄存器的内容不可预知。

6、SDIO命令响应1~ 4寄存器(SDIO_RESPx,x=1~4)在这里插入图片描述

  • 命令响应寄存器组,总共包含4个32位寄存器组成,用于存放接收到的卡响应部分的信息。如果收到短响应,则数据存放在SDIO_RESP1寄存器里面,其他三个寄存器没有用到。而如果收到长响应,则依次存放SDIO_RESP1~SDIO_RESP4里面。
  • 该寄存器用于存储以卡总线时钟(SDIO_CK)为周期的数据超时时间,一个计数器将从SDIO_DTIMER寄存器加载数值,并在数据通道状态机(DPSM)进入Wait_R或繁忙状态时进行递减计数,当DPSM处在这些状态时,如果计数器减为0,则设置超时标志。
  • 注意:在写入数据控制寄存器(SDIO_DCTRL),进行数据传输之前,须先写入该寄存器(SDIO_DTIMER)和数据长度寄存器(SDIO_DLEN)!
  • 该寄存器低25位有效,用于设置需要传输的数据字节长度。对于块数据传输,该寄存器的数值,必须是数据块长度(通过SDIO_DCTRL设置)的倍数。
  • 即:假定数据块大小为512字节,那么SDIO_DLEN的设置,必须是512的整数倍,最大可以设置读取65535个数据块。

9、SDIO数据控制寄存器(SDIO_DCTRL)在这里插入图片描述

  • 该寄存器,用于控制数据通道状态机(DPSM),包括数据传输使能、传输方向、传输模式、DMA使能、数据块长度等信息的设置。

10、SDIO状态寄存器(SDIO_STA)在这里插入图片描述

  • 状态寄存器可以用来查询SDIO控制器的当前状态,以便处理各种事务。比如SDIO_STA的位2表示命令响应超时,说明SDIO的命令响应出了问题。

11、SDIO数据FIFO寄存器(SDIO_FIFO)在这里插入图片描述

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

SDIO接口就介绍到这里啦@@@@@

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/223556.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午1:56
下一篇 2026年3月17日 下午1:56


相关推荐

  • 简单使用SAXReader解析xml数据

    简单使用SAXReader解析xml数据之前的工作中,一直是使用json格式的数据进行数据传输。很少会接触到xml格式的数据。不过因为工作需求,在对接其他产品的接口时,偶尔会遇到需要使用xml格式数据的情况,所以,也得学学如何解析xml。不过个人感觉,还是Json比较容易些啊,第一次解析xml时,我是一脸懵逼的,不过难者不会,会者不难,知道其中的原理和使用方法,其实发现xml也是很简单而且很强大的。简单的学习一下xml,在w3sch

    2022年7月12日
    46
  • idea激活码到2022_通用破解码

    idea激活码到2022_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    664
  • Python处理xml文件_文件格式怎么转换

    Python处理xml文件_文件格式怎么转换由于项目组中原来的文件使用的XML格式作为配置,扩展性很好,但是编辑与阅读不是很直观,特别一些规则的二维表,所以为了方便阅读与编辑,花了一些时间写了一个Python脚本,以实现将XML文件转为Excel文件。这里支持XML文件转为一个Sheet或者多个Sheet:如果第二层所有标签都相同则会转为一个Sheet,所有第二层的标签都会作为行数据如果第二层的标签有多种,则会把第二层的不同标签作为…

    2022年8月22日
    7
  • DS18B20温度传感器的工作原理_基于ds18b20的温度报警仿真

    DS18B20温度传感器的工作原理_基于ds18b20的温度报警仿真数字温度传感器(DS18B20)传感器参数

    2025年12月14日
    3
  • 计算机共享打印机怎么弄,电脑共享打印机怎么设置,手把手教你设置共享打印机…

    计算机共享打印机怎么弄,电脑共享打印机怎么设置,手把手教你设置共享打印机…同一局域网内 打印机是我们工作中所有电脑打印文档 图片等资料的必备保障 但为了节省资源 都是多台电脑使用一个打印机 通过在与打印机直接的电脑上设置共享将打印机变成网络打印机 通过设置之后 局域网中其它计算机就可以利用该网络打印机实现更加方便的打印操作 小编就以一般普通的打印机 没有网络端口 用一台 WIN10 系统电脑主机来设置局域网共享打印机的详细教程 希望大家喜欢和收藏 1 右键桌面上的 网络

    2026年3月16日
    2
  • 华为手机怎么安装grok

    华为手机怎么安装grok

    2026年3月15日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号