SDIO的设备分类:

  • SD / IO卡:这不是一种卡,现在已经不常用了,用到时再查。
  • SD存储卡:分局容量不同有三种名字① <= 2GB 的叫SDSC;② >2GB <= 32GB的叫SDHC卡;>32GB < 2TB 的叫SDXC卡。
    单片机是32位的 ,支持的最大容量就是32GB,所以超大容量不支持。

认识内存卡


小卡和大卡没什么区别,大卡在左侧有一个锁,剥下来之后是禁止写入(好像没什么用),看图可知32GB的存储卡写了SDHC,而64GB的写了HDXC。上边的小圆圈 “10” 是存储卡的读写速度。

1、SD卡的物理结构


SD卡是 nand flash 存储器具有容量较大,必须以块为单位进行读写 ,改写速度快等优点,适用于大量数据的存储。
一张SD卡包括存储单元、存储单元接口、电源检测、卡及接口控制单元、接口驱动器组成。

  • 存储单元是存储数据部件,存储单元通过存储单元接口和卡控制单元进行数据传输
  • 电源检测单元保证SD卡工作在合适的电压下,如果出现掉电等异常状态,它会使他连接的卡接口控制单元和存储单元接口复位
  • 卡及接口控制单元控制SD卡的运行状态,它包括有8个寄存器
  • 接口驱动器控制SD卡引脚的输入输出

SD卡有8个寄存器,这些寄存器只能通过命令来访问,有点像SPI操作flash的样子.SDIO 一共定义了64个命令,每个命令都有特殊意义,可以实现某一特定功能,SD卡接收到命令后,根据命令要求对SD卡内部寄存器进行修改。在程序控制中只需要发送组合命令就可以实现SD卡的控制以及读写操作。

SD的寄存器列表:

  • CID卡的识别号,每一张卡都有自己的号码,不能重复。
  • RCA:相对地址,把地址提交给stm32,系统核准之后就可以只用了。也是为了方便,CID是128位的,给一张卡分配一个相对地址,识别速度可以快一些
  • CSR:卡状态,stm32把数据传给SD卡之后,SD卡需要操作,写入或者擦出等等,看看SD卡时候忙碌。
  • SSR:SD卡专有的特征信息,里边有每一个块有多大,有几分块,等等。
  • 中间那几个寄存器没有用到,详细资料去看SD卡的官方手册

2、SDIO总线


SDIO与SD卡使用9根线通讯,3根电源线,1根时钟线,1根命令线、4根数据线。

  • SCL:时钟线,由SDIO主机产生。由此可见SDIO是同步通讯协议
  • CMD:命令线。SDIO就是通过命令线给SD卡发送命令,操作SD卡的寄存器。如果命令要求SD卡提供应答,SD卡也是通过这根线传输应答信息。
  • D0-3:数据线(0~3一共4根数据线)。用于传输读写数据,SD卡可将D0线拉低,表示忙
  • VDD、VSS1、VSS2:电源和地信号。

3、SDIO的通讯逻辑

SDIO在通讯时,SDIO不管是从主机传网SD卡还是从SD卡传网主机,都是以SCL线的上升沿为有效。
SD卡在操作过程中会有两种不同频率的时钟同步数据,一个是识别卡阶段,,时钟频率为FOD,最高400KHZ,另一个是数据传输模式下的时钟频率FPP,默认最高25MHZ, 但是如果配置相关寄存器使SDIO工作在高速模式,传输速度最高可达50MHZ。

命令的响应交互:

SDIO总线通讯是基于命令和数据传输的,通讯由一个起始位0,由一个停止位1结束,一般是主机发送一个命令,从设备接收到命令之后做出响应,如果需要会有数据的传输参与

CMD命令线,如果发送的命令不需要主机返回,那么发完命令之后无响应。又比如我读取ID号,发完命令,大多数 SD卡的应答信号会通过SDIO返回给主机,当然也有特殊情况,后边详细说明。

SD卡的写入:
SD卡是以块的形式传输,SDHC卡一个数据块的长度一般是512KB,数据可以从主机到卡,也可以从卡到主机。
数据传输的时候呢还有CRC校验位来确定数据传输的准确性。以起始位0开始,然后是各种各样的数据,然后校验位,最后以结束为1结束,传输过程中全都是通过D0~D3这四根线传输的。
这个图是这么理解的:主机发送一个命令,收到SD的响应之后,主机就把这个数据块写入到SD卡里,通过把D0线拉低,表示SD卡处于忙碌状态,正在写入,写完之后这个忙碌标志就去掉了,然后就可以接着写入另一块数据了。传输完之后主机会发送一个停止命令。命令这块后面会详细说明。

SD卡的读取:
SD的数据传输支持单块和多块的读写操作,多块写入的时候需要使用停止命令来停止整个写入操作,数据写入之前需要检测SD卡的忙碌状态,每写入一块都需要等待SD卡的忙碌状态。读操作与写类似,只是没有检测忙的标志,因为数据直接传输出去了,不需要擦除,不需要等待很长时间,基本上接收到读命令SD卡就直接出数据了,没有忙碌的标志,就不用去检测。

使用四根线传输,每次可以传输4个位,没跟数据线都有起始位、数据位、校验位、终止位。
SD卡数据包有两种格式,一种是常规格式(8bit宽),它先发低字节,再发高字节。而每个字节是先发先发高位再发低位,如图所示

另一种叫做 宽位数据包格式,宽位数据包是针对SD卡的SSR(SD状态)寄存器内容发送的,SSR寄存器总共有512位。主机在发送出ACMD13命令后,SD卡会将SSR寄存器的内容通过DAT线发送给主机,这就比较特殊,上边说主机通过CMD线发送的命令,如果需要SD卡做出响应,SD卡一般也会通过CMD线返回去,这就不是了,在读取SSR内容的时候,这512个字节是通过数据线返回给主机的。 发送的命令至于ACMD13是啥?后面再说

4、SDIO命令

SD命令由主机发出,有广播命令和寻址命令两种,广播命令是针对于SD主机总线相连的所有设备发出的,我们知道SDIO总线支持多张卡,只是stm32限制了只能插一张卡,寻址命令就只指定某个设备进行命令传输

1、命令格式

SD命令格式固定为48位,都是通过CMD线传输的,数据线不参与命令的传输

  • 起始位和终止位:命令的开始标志和结束标志,起始位为0,结束位为1
  • 传输标志:用于区分传输方向,该位为1表示命令是从主机发往SD卡。 0表示响应命令,从SD卡到主机
  • 命令的主体内容:包括命令、地址信息/参数和CRC校验三个部分
  • 命令号:它固定占6位,所以总用就有64中命令(CMD0~CMD63),每个命令都有特定的用途,部分命令不适用SD卡操作,专门用于MMC或者SDI/O卡
  • 地址/参数:表示地址信息或者参数信息,一共占32位,比如广播命令,他是没有地址而言的,所以对于广播命令来说这32位都来表示参数信息。寻址命令这32位一般就用来表示地址了。

2、命令类型

SD命令有四种类型:

  • 无响应的广播命令(bc):命令发送到所有卡,不返回任何响应
  • 有响应的广播命令(bcr):命令发送到所有卡,接收来自所有卡的响应
  • 寻址命令(ac):命令发送到指定的卡,DAT线无数据传输
  • 寻址数据传输命令(adtc):命令发送到选定卡,DAT有数据传输
    在标准命令CMD0~CMD63之外,还定义了特定应用命令(ACMD)和常规命令(GEN_CMD)。当需要执行这些命令的时候,需要先发送一个CMD55 接着在发送一个ACMD命令,目的就是为了做一个区分。因为ACMD的编号和CMD的编号是重复的,以CMD55为标志,后面才会执行特定命令

5、SD卡的操作模式以及切换

SD卡有两种操作模式:卡识别模式,数据传输模式。顾名思义卡识别模式就是识别卡的种类,卡的标准容量等等。
在每种操作模式下,SD卡都有几种状态,通过命令控制实现卡状态的切换

1、卡识别模式的框图

卡在上电之后就进入空闲状态,或者通过命令CMD0进入空闲状态(复位),如果是V2.0版本的卡,在空闲状态要先发送一个CMD8,返回这个卡的电压状态。接着发送ACMD41带参数的给他一些电压值,要求返回这张卡的一些信息和OCR寄存器的值,如果返回信息不支持这个电压,那就在传给他另一个电压,继续询问是否支持,如果一直不行,那这张卡只能处于空闲状态了(也有可能使卡处于无效状态,如图所示)。通过上边的几个命令就可得到这张卡支持的电压,卡的版本信息,SDHC还是别的卡,等信息。如果一切正常,接着输入命令CMD2,进入识别状态,卡会返回它的CID号,接着CMD3,要求返回卡的相对地址,完事之后就进入待机模式了,到这这张卡就识别完了,之后就可以进行数据的传输

2、数据传输模式

从卡的识别模式到数据传输模式,通过CMD3,使卡处于待机状态,如果处于了待机状态,卡就可以开始传输数据了,通过发送CMD7(就是先选中这张卡,CMD带有参数,相对地址,选择是那张卡进入传输状态),进入传输状态,传输状态是数据发送状态和数据接收状态的前置状态。意思就是说在真正的数据传输开始,必须先进入这个传输状态。进入传输状态之后如果在发送一个相同的CMD7,带的参数也相同,那么就从传输状态返回到了待机状态,取消选中这张卡。进入发送状态之后,通过CMD6,17……读取一个或几个数据块,进入发送数据状态,注意这个发送数据是针对SD的,所以是主机从SD卡读出数据,读完数据时候有两条分支,一个是CMD7进入待机状态,另一个是使用CMD12命令,强制卡停止传输,传输完成,返回传输状态。如果数据要从主机发往SD卡就走下边的分路,通过CMD16、32……设置CD卡块的长度,因为SD的读写操作都是按照块进行的,不同容量的卡块大小不同,所以在发送数据之前,必须先设置块大小,仍然处于传输状态,然后通过命令CMD24、25……进入写状态,写入一个块或者多个块,数据暂时存放在卡及控制单元(这有缓存),以CMD12结束,传输完成之后进入编程模式(真正的数据写入状态,数据写完之后直接退出到传输状态 ),在从缓存把数据传输到SD卡的存储单元。在传输状态还有另一条分路CMD28、29……数据擦除,擦除指定的块,完成之后同样进入传输状态。另外在编程状态,也可以通过CMD7取消选中这张卡,就会处于断开连接状态,回到待机状态。
只有SD卡处于数据传输模式时,才能进行数据的读写操作(上边已经说得很清楚了),在数据传输模式下可以将SD卡的时钟频率(SCL)设置为FPP,默认最高为25MHZ,可以通过CMD4命令实现

  • CMD12可以终止数据通信,让卡回到传输状态
  • CMD0、15会终止任何数据编程操作,直接返回到卡的识别模式,如果SD卡正在写入数据,会导致卡的数据被损坏

6、stm32中的SDIO功能框图

stm32有一个SDIO,由两部分组成SDIO适配器和AHB总线接口,SDIO适配器提供了SDIO主机功能,可以提供SD的时钟、发送命令、数据传输。
SDIO使用两个时钟信号一个是SDIO适配器时钟:SDIOCLK = HCLK = 72M,另一个是AHB总线时钟的二分频366MHZ,SDIO适配器是针对MMC卡和SD卡,SD卡只用4根数据线足够。

SDIO适配器:

SDIO适配器是SD卡系统的主机部分,它是STM32控制器和SD卡数据通信的中间设备。SDIO设备由5个单元组成,分别是 控制单元、命令通道、数据通道、适配器寄存器、FIFO。

  • 控制单元:HCLK的时钟分频
  • 命令通道:专门控制命令的,或者接收响应
  • 数据通道:专门控制数据的
  • 适配器寄存器:通过配置寄存器来控制命令通道、控制单元、数据通道、数据接收到哪里?就是这个FIFO
  • FIFO:大小是32个字,存放接收的数据

发送以及接收命令的过程:
适配器寄存器存放CMD的命令号,参数就是要发送的命令的参数。会把这些命令通过移位寄存器一位一位的发送出去,在发送过程中可以对命令进行控制:状态标志、控制逻辑、命令定时器,可以检测是否传输完成,传输是够正确
CDM在接收命令时,同样通过移位寄存器将返回的响应存储到响应寄存器中,而且是带有CMD号的,通过AHB接口可以读响应寄存器

CPSM命令状态机,在发送CMD命令之后,不会马上发送,我们可以使能这个状态机,他有一个超时处理

发送以及接收数据的过程:

数据路径部件负责与SD卡相互数据传输,SDIO适配器和数据路径状态机(DPSM)来描述SDIO适配器状态变化,也加入了等待超时检测的功能。

  • 数据FIFO:是一个队列,先进先出,数据缓冲器,大小为32个字
  • SDIO状态寄存器SDIO_STA,有指示正在发送或者正在接收的标志

DPSM数据状态机:会帮我们配置好

SDIO命令寄存器:o~5位是命令索引(CMD号),作为命令的一部分发送出去

SDIO参数寄存器:发送命令是携带的参数就是写到这个寄存器

7、stm32SDIO结构体讲解

标准库建立了三个初始化结构体,

  • SDIO初始化结构体 SDIO_InitTypeDef,主要来配置用几根数据线,时钟的分频是多少……
  • SDIO命令初始化结构体 SDIO_CmdInitTypeDef,主要是设置命令、命令号、命令参数、响应类型
  • SDIO数据初始化结构体 SDIO_DataInitTypeDef,用来配置发送和接收数据,比如数据长度、传输模式、传输超时

SDIO_InitTypeDef :

  • ClockEdge:选择时钟沿,根据SDIO的标准协议,一般就选择上升沿有效
  • ClockBypass:如果使能了旁路时钟,那么SDIOCLK的72M时钟就直接驱动了CLK的时钟,太高不能用,SDIO在卡识别模式和数据传输模式要求的时钟频率不同,在卡识别模式不能高于400KHZ,在数据传输模式不能超过25MHZ,需要我们用ClockDIV分频因子自己去配置。
  • ClockPowerSave:在节能模式下,CLK时钟线只有在总线激活的情况下才输出时钟,如果禁用节能模式,CLK时钟会一直输出,配置SDIO_CLKCR寄存器
  • BusWide:数据宽度,可以选择数据线的条数。
  • HardwareFlowControl:硬件控制流,使能或禁用,他可以避免FIFO发生溢出错误,上溢或者下溢。

SDIO_CmdInitTypeDef:

  • Argument:作为命令的一部分发送到卡的命令参数,就是发送命令的时候带的一些参数
  • CmdIndex:命令号,就是命令号了,CMD号、ACMD号。先发送CMD55在发送CMD就是ACMD命令了
  • Response:命令响应类型,短响应和长响应,SDIO定义了4个32位的响应寄存器,SDIO_RESP1~4。短响应只用到第一个。
  • Wait:有三种选择:①无等待状态,如果使能了命令状态机会有超时检测功能②等待中断③等待传输完成。由SDIO_CMD寄存器配置
  • CPSM:命令状态机,命令路径状态控制

SDIO_DataInitTypeDef:

  • DataTimeOut:数据传输超时
  • DataLength:设置数据长度
  • DataBlockSize:设置块大小,是根据实际存储卡的块大小进行配置
  • TransferDir:数据传输方向,是写还是读。
  • TransferMode:数据传输模式,数据块模式开始流模式。如果是SD卡只能用块模式。流模式时mmc卡,只适用于多媒体卡。
  • DPSM:数据路径状态机,一般会配成使能,方便处理超时检测

补充

SD卡的命令格式,SD卡支持有R1、R2、R3、R6、R7这五种响应命令,R4和R5是SDIO卡的命令格式,SD卡不支持。

  • R1、R3、R6、R7
    这三个应答固定为48位,其中命令号占6位,真正响应的内容只占32位

真正响应的内容占32位

  • R1:为CSR(卡状态寄存器)的内容,主要记录了SD卡对命令的执行情况
  • R3:为OCR(操作条件寄存器)的内容,记录了SD卡支持的工作电压、卡是否忙、容量类型
  • R6:RCA(相对地址寄存器) + CSR(仅15位)的内容
  • R7:返回SD卡是否支持主机接口的电压范围
  • R2:为长响应,R2的实际内容为127位。问题:CID和CSD大小为128位,为什么R2的响应只留127位,因为这俩寄存器的有效内容只有127位

命令

基础命令
CMD0:命令号

CMD0 bc [31:0] stuff bits 进入空闲状态
  • 类型:bc 无响应‘无数据的广播命令’
  • 作用:广播告诉所有的卡,让其进入空闲状态,空闲状态就是啥也不干的状态,上电之后会默认进入空闲状态,当SD卡处于空间状态时才能进行后续的操作,不论SD卡处于什么状态,发送CMD0总能让其进入空闲状态
  • 命令真正的32位内容,没有用上,所以全部填充0
  • 响应:没有响应

CMD2

CMD2 bcr [31:0] stuff bits R2 让所有的SD卡返回CID
  • 类型:bcr ,有响应、无数据的广播命令
  • 作用:广播所有的CD卡将CID发送给主机
  • 命令真正的32位的内容,没有用上,全部填充0
  • 响应:R2响应的内容为CID寄存器中的CID号,在卡识别阶段,就是通过这个命令来获取SD卡的CID号,完成CD卡的识别

CMD3

CMD3 bcr [31:0] stuff bits R6 发送相对地址
  • 类型:bcr,有响应、无数据的广播命令
  • 作用:广播让所有的SD卡将自己的RCA寄存器的相对地址发送给主机
  • 命令:真正的32位内容内有用,全部填充为0
  • 响应:R6响应的内容为RCA寄存器中的相对地址,这个命令也是卡识别阶段非常重要的命令,主机需要通过这个命令来得到SD卡的相对地址

CMD4

CMD4 bc [31:16] DSR的内容 [15:0]stuff bits 设置DSR的内容
  • 类型:bc,无响应、无数据广播命令
  • 作用:向所有SD卡广播,设置DSR寄存器的值
  • 命令:32位,高16位有效,因为DSR只有16位,低16位填充0
  • 响应:无

CMD7

CMD7 ac [31:16] RCA的内容 [15:0]stuff bits R1 选择/取消某张卡
  • 类型:ac,无数据的寻址命令
  • 作用:通过发送相对地址来,取消,选择某个SD卡
  • 命令真正的32位内容,高16位位相对地址,第16位填充0
  • 响应:无

CMD8

CMD8 ac [31:12]保留[11:8]supply voitage[7:0]check pattem R7 发送接口环境
  • 类型:bcr,
  • 作用:向所有的SD卡广播主机的接口环境,这个接口环境主要是主机SDIO接口所支持的电压范围,并询问SD卡是否在这个电压范围之内
  • 真正的命令32位。[ 31:12 ]:保留,填充0,[ 11:8 ]:设置主机支持的电压范围,设置的值不同,代表不同的电压,可设置如下格式:
    [ 7:0 ]:设置测试模式值,可以是任意的8位,用于CRC校验,手册推荐值:0XAA
    CMD8的命令格式如下:
  • 响应:如果SD卡支持主机的接口电压范围,SD卡返回R7响应,响应内容就是将SSR的内容返回给主机,同时SD卡也会将主机发给SD卡的电压范围值和测试模式值返回给主机。如果SD卡不支持接口电压范围,SD卡将不响应


SDIO——读写SD卡相关推荐

  1. SDIO读写SD卡的速度

    SDIO(Secure Digital Input Output)是一种通用的接口,用于在计算机和其他设备之间传输数据.SD卡(Secure Digital Memory Card)是一种可移植的存储 ...

  2. SDIO读写SD卡速度有多快?

    前两天测试了SPI方式读写SD卡的速度<SPI方式读写SD卡速度测试>,今天来测试一下SDIO方式的读写速度. 测试条件: 单片机:STM32F407VET6 编译环境:MDK 5.30+ ...

  3. STM32CUBEMX_SDIO和FATFS_读写SD卡

    STM32CUBEMX_SDIO和FATFS_读写SD卡 简述 FATFS是一个完全免费开源,专为小型嵌入式系统设计的FAT(File Allocation Table)文件系统模块.FATFS的编写 ...

  4. STM32F1 HAL库读写SD卡的操作要点

    本文采用的HAL库版本为STM32Cube_FW_F1_V1.8.0(带Patch-CubeF1 1.8.4). 知识点一:SD卡数据线位宽的配置 SD卡可以采用1位数据线模式,也可以采用4位数据线模 ...

  5. SPI读写SD卡速度有多快?

    SD卡是一个嵌入式中非常常用的外设,可以用于存储一些大容量的数据.但用单片机读写SD卡速度一般都有限(对于高速SD卡,主要是受限于单片机本身的接口速度),在高速.实时数据存储时可能会有影响.但具体速度 ...

  6. SPI方式读写SD卡速度有多快?

    很久没有写公众号了,一方面忙,另一方面也不知道写些什么内容,大家如果有想了解的(前提是我也懂),可以后台发送给我. 今天主要来测试一下SPI读写SD卡的速度.SD卡是一个嵌入式中非常常用的外设,可以用 ...

  7. SPI协议读写SD卡介绍

    前言 在前面的文章中,我们主要介绍了如何利用SDIO协议对SD卡进行读写操作的流程及注意事项.虽然SDIO协议读写SD卡的效率很高,但是,操作却比较麻烦,另外,还需要使用的芯片具有SDIO外设.这对于 ...

  8. VS code+STM32CubeMX 使用 FreeRTOS+FatFS+USB_DEVICE 搭建 SD卡 读卡器 和 读写 SD卡 示例项目

    文章目录 1. 新建项目 2. 配置 CubeMX 项目 3. 配置 EIDE 项目 4. 编写代码 5. 编译下载 6. 效果展示 本例介绍如何使用 vscode 插件 EIDE 和 STM32Cu ...

  9. 9、STM32 SDIO FATFS(SD卡)

    本篇文章使用STM32对SD卡通过SDIO配置,读写文件 在使用FATFS时值得注意得是若通信SDIO不启动DMA方式读写,容易导致其他任务中断打断读写时序,导致FATFS的执行出现异常,常见返回为F ...

最新文章

  1. 信号系统的一些基本概念
  2. 给大家推荐一个SQL好的站点
  3. 【Android开发】自定义ListView,使用通用适配器,并实现ListView上的每一项和每一项上的按钮等控件同时监听
  4. Python调用茉莉机器人API接口
  5. Android开发之添加QQ群的方法(官方代码)
  6. word2vec原理_word2vec论文阅读笔记
  7. poj 3436 (最大流)
  8. mysqldump备份数据不锁表的加参数方法及原理分析
  9. 【GPORF源码编译】GDB源码编译之gprof交叉编译
  10. iOS 并发编程之 Operation Queues
  11. mdt服务器实现自动加域,Windows自动化部署(三)MDT环境准备
  12. c语言程序员表白代码6,520到了——程序员表白代码大全公开!
  13. 线阵相机和面阵相机的区别
  14. IT行业常见职位英语缩写及中文释义
  15. Scrapy项目(东莞阳光网)---利用CrawlSpider爬取贴子内容,不含图片
  16. win10系统安装CH340驱动
  17. linux 内存强度测试软件,Linux系统性能测试工具(一)——内存带宽测试工具mbw...
  18. 阿里云IoT平台APP配网入口
  19. 一怒之下做了个基于微信公众平台结合百度地图的查公交应用!轻量!方便!快捷!
  20. python中的max(x,key=str)

热门文章

  1. 2021-10-09 将多张电子发票pdf合并成一个pdf文件
  2. [抖音插旗备注接口]拼多多新店如何选词写标题,那些渠道可以选词
  3. 【异常】SSL 接收到一个超出最大准许长度的记录。
  4. Mybatis强制查询问题
  5. 拉卡拉智能POS市场发展背景及市场现状分析
  6. 【引用】如何读技术类书籍
  7. sw安装未成功_solidworks2016安装失败怎么清理
  8. Linux系统基础——BIOS和Bootloader
  9. FS210开发平台板载LED灯控制实验
  10. Linux折腾触摸屏,最近有一个触摸屏想接入到Linux 上面,从网上购买了LVDS驱动板,转成HDMI信号然后做Linux系统输出,屏幕旋转后,使用xinput-calibrator解决触摸屏错乱