前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >stm32的sdio接口_STM32F411

stm32的sdio接口_STM32F411

作者头像
全栈程序员站长
发布2022-11-09 17:27:50
5730
发布2022-11-09 17:27:50
举报

一、SDIO接口简介

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

  • ①与多媒体卡系统规格书版本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块数据传输

1、读数据块操作 SDIO与SD卡通信一般以数据块的形式进行传输,SDIO(多)数据块读操作,如下图所示:

在这里插入图片描述
在这里插入图片描述
  • 从机在收到主机相关命令后,开始发送数据块给主机,所有数据块都带CRC校验(由硬件自动处理),单个数据块读的时候,在收到1个数据块以后即可以停止了,不需要发送停止命令(CMD12)。但是多块数据读的时候,SD卡将一直发送数据给主机,直到接到主机发送的STOP命令(CMD12)。

2、写数据块操作 SDIO(多)数据块写操作,如下图所示:

在这里插入图片描述
在这里插入图片描述
  • 数据块写操作同数据块读操作基本类似,只是数据块写的时候,多了一个繁忙判断,新的数据块必须在SD卡非繁忙的时候发送。这里的繁忙信号由SD卡拉低SDIO_D0,以表示繁忙,SDIO硬件自动控制,不需要我们软件处理。

五、SDIO寄存器介绍 1、SDIO电源控制寄存器(SDIO_POWER)

在这里插入图片描述
在这里插入图片描述
  • 该寄存器只有最低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是否需要等待,以及等待类型等。

5、SDIO命令响应寄存器(SDIO_RESPCMD)

在这里插入图片描述
在这里插入图片描述
  • 该寄存器只有低6位有效,比较简单,用于存储最后收到的命令响应中的命令索引。如果传输的命令响应不包含命令索引,则该寄存器的内容不可预知。

6、SDIO命令响应1~ 4寄存器(SDIO_RESPx,x=1~4)

在这里插入图片描述
在这里插入图片描述
  • 命令响应寄存器组,总共包含4个32位寄存器组成,用于存放接收到的卡响应部分的信息。如果收到短响应,则数据存放在SDIO_RESP1寄存器里面,其他三个寄存器没有用到。而如果收到长响应,则依次存放SDIO_RESP1~SDIO_RESP4里面。

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

在这里插入图片描述
在这里插入图片描述
  • 该寄存器用于存储以卡总线时钟(SDIO_CK)为周期的数据超时时间,一个计数器将从SDIO_DTIMER寄存器加载数值,并在数据通道状态机(DPSM)进入Wait_R或繁忙状态时进行递减计数,当DPSM处在这些状态时,如果计数器减为0,则设置超时标志。
  • 注意:在写入数据控制寄存器(SDIO_DCTRL),进行数据传输之前,须先写入该寄存器(SDIO_DTIMER)和数据长度寄存器(SDIO_DLEN)!

8、SDIO数据长度寄存器(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.cn/186254.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月3日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、SDIO接口简介
  • 二、SDIO框图以及SDIO时钟
  • 三、SDIO命令和响应
  • 四、SDIO块数据传输
  • SDIO接口就介绍到这里啦@@@@@
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档