STM32——SDIO进行SD卡读写测试_sdio 读写sd卡

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

SDOI初始化结构体

SDIO命令初始化结构体

SDIO数据初始化结构体


SDIO简介

SD卡(Secure Digtial Memory Card)在我们生活中已经非常普遍了,控制器对SD卡进行读写通信操作一般有两种通信接口可选,一种是SPI接口,另一种就是是SDIO接口。SDIO全称是安全数字输入/输出接口,多媒体卡(MMC)、SD卡、SD I/O卡都有SDIO接口。STM32F10X系列控制器有一个SDIO主机接口,它可以与MMC卡、SD卡、SD I/O卡以及CE-ATA设备进行数据传输。

MMC卡可以说是SD卡的前身,现阶段已经用的很少了。SD I/O卡本身不是用于存储的卡,它是指利用SDIO传输协议的一种外设。比如说WIFI Card,他主要是提供WIFI功能,有些WIFI模块是利用串口或者SPI接口进行通信的,但WIFI SDIO Card是利用SDIO接口i进行通信的。使用SDIO接口的设备可以见下图:

SD卡物理结构

一张SD卡包括有存储单元,存储单元接口,电源检测、卡及接口控制器和接口驱动器5部分,见图SD卡物理结构,存储单元是存储数据部件,存储单元通过存储单元接口与卡控制单元进行数据传输;电源检测单元保证SD卡工作在合适的电压下,如出现掉电或者上电状态时,它会使控制单元和存储单元接口复位;卡及接口控制单元控制SD卡的运行状态,它包括有8个寄存器;接口驱动器控制SD卡引脚的输入输出。

SD卡共有8个寄存器,用于设定或表示SD卡信息,参考下表,这些寄存器只能通过对应的命令访问,对SD卡进行读写控制操作并不是像操作控制寄存器GPIO相关寄存器那样一次读写一个寄存器的,它是通过命令来控制的,SDIO定义了64个命令,每个命令都有意义,可以实实现某一特定功能,SD卡接收到命令之后,根据命令的要求对SD卡内部寄存器进行修改,程序控制中只需要发送组合命令就可以实现SD卡的控制以及读写操作。

名称bit宽度描述
CID128卡识别号:用来识别的卡的个体号码(唯一的)
RCA16相对地址:卡的本地系统地址、初始化时,动态的由卡建议,主机核准
DSR16驱动级寄存器:配置卡的输出驱动
CSD128卡的特定数据:卡的操作条件信息
SCR64SD配置寄存器:SD卡特殊特性信息
OCR32操作条件寄存器
SSR512SD状态:SD卡专有特征的信息
CSR32卡状态:卡状态信息

SDIO总线

总线拓扑

SD卡一般都支持SDIO和SPI这两种接口,SDIO总线拓扑参考图SD卡总线拓扑,虽然可以共用总线,但不推荐多卡槽共用总线信号,要求一个单独SD总线应该连接一个单独的SD卡。

SD卡使用9 pin通信,其中3根电源线、1根时钟线、1根命令线和4根数据线,具体说明如下:

  • CLK:时钟线,由SDIO主机产生,即由STM32控制器输出;
  • CMD:命令控制线,SDIO主机通过该线发送命令控制SD卡,如果要求SD卡提供应答(响应),SD卡也是通过该线传输应答消息;
  • D0-3:数据线,传输读写数据,SD卡可将D0拉低表示忙状态;
  • VDD、VSS1、VSS2:电源和地信号

实际上,SDIO的通信时序简单许多,SDIO不管是从主机控制器向SD卡传输,还是SD卡向主机控制器传输都只以CLK时钟线的上升沿有效,SD卡操作过程会使用两种不同频率的时钟同步数据,一个是识别卡阶段时钟频率FOD,最高为400khz,另一个是数据传输模式下时钟频率FPP,默认最高为25MHZ,如果通过相关寄存器配置使SDIO工作在高速模式、此时数据传输模式最高频率为50MHZ。

对于STM32控制器,只有一个SDIO主机,所以只能连接一个SDIO设备,开发板上集成了一个Micro SD卡槽和SDIO接口的WIFI模块,要求只能使用其中一个设备。SDIO接口的WIFI模块一般集成有使能线,如果有需要用到SD卡需要先控制该使能线禁用WIFI模块。

总线协议

SD总线通信是基于命令和数据传输的。通讯有一个起始位(“0”),由一个停止位(“1”)终止。SD通信一般是主机发送一个命令(Command),从设备在接收到命令后做出响应,如有需要会有数据(Data)传输参与。

SD总线的基本交互是命令与响应交互,见图命令与响应交互。

SD数据是以块的形式传输的,SDHC卡数据块宽度 一般为512字节,数据可以从主机到卡,也可以是从卡到主机。数据块需要CRC位来保证数据传输成功。CRC位由SD卡系统硬件生成,S

TM23控制器可以使用单线或4线传输,本开发板设计使用4线传输。图多块写入操作为主机向SD卡写入数据块操作示意。

SD数据传输支持单块和多块读写,他们分别对应不同的操作指令,多块写入还需要使用命令来停止整个写入操作,数据写入之前还需要检测SD卡忙状态,因为SD卡在接收到数据后,编程到存储区过程需要一定的操作时间,SD卡忙状态通过把D0线拉低表示。

数据块读操作与之类似,只是无需忙状态检测。

使用4根数据线传输时,每次传输4bit数据,每根数据线都必须有起始位,停止位以及CRC位,CRC位每根数据线都要分别检查,并把检查结果汇总然后在数据传输完后通过D0线反馈给主机。

SD卡数据包有两种格式,一种是常规数据,它先发低字节再发高字节,而每个字节则是先发高位再发低位,4线传输示意如图所示;

4线同步发送,每根线发送一个字节的其中两个位,数据位在4线顺序排列发送,DAT3数据线发较高位,DAT0数据线发较低位。

另外一种数据包发送格式是宽位数据包格式,对SD卡而言宽位数据包发送方式是针对SD卡SSR(SD状态) 寄存器内容发送的,SSR寄存器总共有512bit,在主机发出ACMD13命令后SD卡将SSR寄存器内容通过DAT线发送给主机。宽位数据包格式见下图:

命令

命令格式

SD命令格式 固定为48bit,都是通过CMD线连续传输的(数据线不参与),见图SD命令格式

SD命令组成如下:

  • 起始位和停止位:命令的主体包含在起始位与终止位之间,它们都包含一个数据位,起始位为0,终止位为1.
  • 传输标志:用于区分传输方向,该位为1时表示命令,方向为主机传输到SD卡,该位为0时表示响应,方向为SD卡传输到主机。

命令主体内容包括命令,地址信息/参数和CRC校验三个部分。

  • 命令号:它固定占用6Bit,所以总共有64个命令(代号CMD0-CMD63) ,每个命令都有特定的用途,部分命令不适用于SD卡操作,只是专门用于MMC卡或者SD I/O卡。
  • 地址/参数:每个命令由32bit地址信息/参数用于命令附加内容,例如,广播命令没有地址信息,这32bit用于指定参数,而寻址命令这32bit用于指定目标SD卡的地址
  • CRC7校验:长度为7bit的校验位用于验证命令传输内容正确性,如果发生外部干扰导致传输数据个别位状态改变将导致校准失败,也意味着命令传输失败,SD卡不执行命令。
命令类型

SD命令有4种类型:

  • 无响应广播命令(bc),发送到所有卡,不返回任务响应
  • 带响应广播命令(bcr),发送到所有卡,同时接受来自所有卡响应
  • 寻址命令(ac),发送到选定卡,DAT线无数据传输
  • 寻址数据传输命令(adtc),发送到选定卡,DAT线有数据传输

另外,SD卡主机模块系统旨在为各种应用程序类型提供一个标准接口。在此环境中,需要有特定的客户/应用程序功能。为实现这些功能,在标准中定义了两种类型的通用命令;特定应用命令(ACMD)和常规命令(GEN_CMD)。要使用SD卡制造商特定的ACMD命令,如ACMD6,需要在发送该命令之前无发送CMD55命令,告知SD卡接下来的命令为特定应用命令。CMD55命令只对紧接的第一个命令有效,SD卡如果检测到CMD55之后的第一条命令为ACMD则执行其特定应用功能,如果检测发现不是ACMD命令,则执行标准命令。

命令描述

SD卡系统的命令被分为多个类,每个类支持一种“卡的功能设置”。具体的命令表可以参考具体的SDIO标准协议的内容。

响应

响应由SD卡向主机发出,部分命令要求SD卡作出响应,这些响应多用于反馈SD卡的装态。SDIO总共有7个响应类型(代号R1-R7),其中SD卡没有R4、R5类型响应。特定的命令对应有特定的响应类型,比如当主机发送CMD3命令时,可以得到响应R6。与命令一样,SD卡的响应也是通过CMD线连续传输的。根据响应内容大小可以分为短响应和长响应。短响应是48bit长度,只有R2类型是长响应,其长度136bit.各个类型响应具体情况见具体内容。除了R3类型之外,其他响应的使用CRC7校验来校验,对于R2类型是使用CID和CSD寄存器内部CRC7。

SD卡的操作模式及切换

SD卡的操作模式

SD卡系统(包括主机和SD卡)定义了两种操作模式:**卡识别模式和数据传输模式。**在系统复位后,主机处于卡识别模式,寻找总线上可用的SDIO设备:同时,SD卡也处于卡识别模式,直到被主机识别到,即当SD卡接收到SEND_RCA(CMD3)命令后,SD卡就会进入数据传输模式,而主机在总线上所有卡被识别后进入数据传输模式。在每个操作模式下,SD卡都有几种状态;

卡识别模式

在卡识别模式下,主机会复位所有处于“卡识别模式”的SD卡,确认其工作电压范围,识别SD卡类型,并且获取SD卡的相对地址(卡相对地址较短,便于寻址)。在卡识别过程中,要求SD卡工作在识别时钟频率FOD的状态下。卡识别模式下SD卡状态转换如图卡识别模式状态转换图

 主机上电后,所有卡处于空闲状态,包括当前处于无效状态的卡。主机也可以发送GO_IDLE_STATE(CMD0)让所有卡软复位从而进入空闲状态,但当前处于无效状态的卡并不会复位。

主机在开始与卡通信前,需要先确定双方在互相支持的电压范围内。
SD
卡有一个电压支持范围,

主机当前电压必须在该范围可能才能与卡正常通信。
SEND_IF_COND(CMD8)
命令就是用于验证

卡接口操作条件的
(
主要是电压支持
)
。卡会根据命令的参数来检测操作条件匹配性,如果卡支持

主机电压就产生响应,否则不响应。而主机则根据响应内容确定卡的电压匹配性。
CMD8

SD

卡标准
V2.0
版本才有的新命令,所以如果主机有接收到响应,可以判断卡为
V2.0
或更高版本

SD
卡。

SD_SEND_OP_COND(ACMD41)
命令可以识别或拒绝不匹配它的电压范围的卡。
ACMD41
命令


VDD
电压参数用于设置主机支持电压范围,卡响应会返回卡支持的电压范围。对于对
CMD8

有响应的卡,把
ACMD41
命令的
HCS
位设置为
1
,可以测试卡的容量类型,如果卡响应的
CCS
位 为 1
说明为高容量
SD
卡,否则为标准卡。卡在响应
ACMD41
之后进入准备状态,不响应
ACMD41 的卡为不可用卡,进入无效状态。ACMD41
是应用特定命令,发送该命令之前必须先发
CMD55

ALL_SEND_CID(CMD2)
用来控制所有卡返回它们的卡识别号
(CID)
,处于准备状态的卡在发送

CID
之后就进入识别状态。之后主机就发送
SEND_RELATIVE_ADDR(CMD3)
命令,让卡自己推

荐一个相对地址
(RCA)
并响应命令。这个
RCA

16bit
地址,而
CID

128bit
地址,使用
RCA

简化通信。卡在接收到
CMD3
并发出响应后就进入数据传输模式,并处于待机状态,主机在获

取所有卡
RCA
之后也进入数据传输模式。

数据传输模式

只有SD卡系统处于数据传输模式下才可以进行数据读写操作。数据传输模式下可以将主机SD时钟频率设置为FPP,默认最高为25MHZ,频率切换可以通过CMD4命令来实现。数据传输模式下,SD卡状态转换过程中见下图:

CMD7用来选定和取消指定的卡,卡在待机状态下还不能进行数据通信,因为总线上可能有多个卡是处于待机状态,必须选择一个RCA地址目标卡使其进入传输状态下可以进行数据通信。同时通过CMD7命令也可以让已经被选择的目标卡返回到待机状态。

数据传输模式下的数据通信都是主机和目标卡之间通过寻址命令点对点进行的。卡处于传输状态下可以使用SD部分命令描述中面向块的读写以及擦除命令对卡进行数据读写、擦除。CMD12可以中断正在进行的数据通信,让卡返回到传输状态。CMD0和CMD15 会终止任何数据编程操作,返回卡识别模式,这可能导致卡数据被破坏。

STM32的SDIO功能框图

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

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

[外链图片转存中…(img-GV09tU7O-1715909865801)]
[外链图片转存中…(img-qRpXGBg4-1715909865801)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F4基于SDIO总线的读写SD卡需要使用FATFS文件系统。要实现这个功能,首先需要配置STM32F4的SDIO接口以及相应的GPIO引脚。接下来,我们可以按照以下步骤进行读写SD卡: 1. 初始化SDIO接口:初始化SDIO控制器,并设置时钟和数据传输属性。 2. 初始化GPIO引脚:配置SDIO通信需要使用的GPIO引脚,包括CMD线、CLK线、以及数据线(D0-D3)。 3. 初始化SD卡:使用SDIO发送SD卡初始化命令,以便与SD卡进行通信。这个过程包括等待SD卡响应、发送上电命令、以及SD卡的OCR(操作条件寄存器)。 4. 检查SD卡状态:通过发送CMD13命令,SD卡状态信息。这个过程可以确保SD卡正常工作并准备好取或写入数据。 5. 挂载文件系统:使用FATFS库中的函数,将SD卡上的文件系统挂载到指定的逻辑驱动器。 6. 打开文件:使用FATFS库中的函数,打开指定的文件。 7. 取或写入数据:使用FATFS库中的函数,取或写入数据到SD卡上的文件。 8. 关闭文件:使用FATFS库中的函数,关闭文件。 9. 卸载文件系统:使用FATFS库中的函数,卸载SD卡上的文件系统。 需要注意的是,在进行读写操作时,需要确保SD卡已经插入并且正确连接到SDIO接口上。此外,还需要根据SD卡的规格以及相应的存储格式,进行适当的读写操作。 以上就是基于SDIO总线的读写SD卡的基本步骤。通过使用FATFS库,我们可以很方便地实现对SD卡读写操作,以便进行数据存储和取。希望这个回答能够对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值