STM32——SDIO进行SD卡读写测试
目录
SDIO简介
SD卡物理结构
SDIO总线
总线拓扑
总线协议
命令
命令格式
命令类型
命令描述
响应
SD卡的操作模式及切换
SD卡的操作模式
卡识别模式
数据传输模式
STM32的SDIO功能框图
控制单元
命令路径
数据路径
数据FIFO
适配器寄存器
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宽度 | 描述 |
CID | 128 | 卡识别号:用来识别的卡的个体号码(唯一的) |
RCA | 16 | 相对地址:卡的本地系统地址、初始化时,动态的由卡建议,主机核准 |
DSR | 16 | 驱动级寄存器:配置卡的输出驱动 |
CSD | 128 | 卡的特定数据:卡的操作条件信息 |
SCR | 64 | SD配置寄存器:SD卡特殊特性信息 |
OCR | 32 | 操作条件寄存器 |
SSR | 512 | SD状态:SD卡专有特征的信息 |
CSR | 32 | 卡状态:卡状态信息 |
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卡系统处于数据传输模式下才可以进行数据读写操作。数据传输模式下可以将主机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请求信号。
![](/assets/blank.gif)
SDIO使用两个时钟信号,一个是SDIO适配器时钟(SDIOCLK=HCLK=72MHZ),另一个是AHB总线时钟的二分频(HCLK/2,一般为36MHZ).适配器寄存器和FIFO使用AHB总线一侧的时钟(HCLK/2),控制单元,命令通道和数据通道使用SDIO适配器一侧的时钟(SDIOCLK).
SDIO_CK是SDIO接口与SD卡用于同步的时钟信号。它使用SDIOCLK作为SDIO_CK的时钟来源,可以通过设置BYPASS模式直接得到,这是SDIO_CK=SDIOCLK=HCLK。若禁止BYPASS模式,可以通过配置时钟寄存器的CLKDIV位控制分频因子,即SDIO_CK=SDIOCLK/(2+CLKDIV)=HCLK/(2+CLKDIV)。配置时钟要注意,SD卡普遍要求SDIO_CK时钟频率不超过25MHZ。STM32控制器的SDIO是针对MMC卡和SD卡的主设备,所以预留有8根线,对于SD卡最多用4根线。
SDIO适配器是SD卡系统主机部分,是STM32控制器与SD卡数据通信中间设备。SDIO适配器由5个单元组成,分别是控制单元,命令路径单元,数据路径单元、寄存器单元以及FIFO、见图
控制单元
控制单元包含电源管理和时钟管理功能,结构如图所示,电源管理部件会在系统断电和上电阶段禁止SD卡总线输出信号。时钟管理部件控制clk线时钟信号生成。一般使用SDIOCLK分频得到。
命令路径
命令路径控制命令发送,并接受卡的响应,结构图如下:
当SD卡处于某一状态时,SDIO适配器必然处于特定状态与之对应。STM32控制器以命令路径状态机(CPSM)来描述SDIO适配器的状态变化,并加入了等待超时检测功能,以便推出永远等待的情况。CPSM的描述见图CPSM状态机描述图。
数据路径
数据路径部件负责与SD卡相互数据传输,内部结构图如下:
SD卡系统数据传输状态转换,SDIO适配器以数据路径状态机(DPSM)来描述SDIO适配器状态变化情况。并加入了等待超时检测功能,以便退出永久等待情 况。发送数据时,DPSM 处于等待发送 (Wait_S) 状态,如果数据 FIFO 不为空,DPSM 变成发送 状态并且数据路径部件启动向卡发送数据。接收数据时,DPSM 处于等待接收状态,当 DPSM 收到起始位时变成接收状态,并且数据路径部件开始从卡接收数据。DPSM 状态机描述见图 DPSM 状态机描述图
数据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提供的各种结构体来了解。
SDOI初始化结构体
typedef struct
{ uint32_t SDIO_ClockEdge; // 时钟沿uint32_t SDIO_ClockBypass; // 旁路时钟uint32_t SDIO_ClockPowerSave; // 节能模式uint32_t SDIO_BusWide; // 数据宽度uint32_t SDIO_HardwareFlowControl; // 硬件流控制uint8_t SDIO_ClockDiv; // 时钟分频
} SDIO_InitTypeDef;
SDIO命令初始化结构体
typedef struct
{ uint32_t SDIO_Argument; // 命令参数uint32_t SDIO_CmdIndex; // 命令号uint32_t SDIO_Response; // 响应类型uint32_t SDIO_Wait; // 等待使能uint32_t SDIO_CPSM; // 命令路径状态机} SDIO_CmdInitTypeDef;
SDIO数据初始化结构体
typedef struct
{ uint32_t SDIO_DataTimeOut; // 数据传输超时uint32_t SDIO_DataLength; // 数据长度uint32_t SDIO_DataBlockSize; // 数据块大小uint32_t SDIO_TransferDir; // 数据传输方向uint32_t SDIO_TransferMode; // 数据传输模式uint32_t SDIO_DPSM; // 数据路径状态机} SDIO_DataInitTypeDef;
SD卡读写测试实验以及SD卡文件系统移植可参考野火STM32教程。
STM32——SDIO进行SD卡读写测试相关推荐
- 【STM32】STM32 SDIO SD卡读写测试(四)-- SD_Test之Transfer Mode阶段
相关文章 <[SDIO]SDIO.SD卡.FatFs文件系统相关文章索引> 1.前言 本篇文章主要是介绍SD卡的读写测试,包括:SD卡擦除测试.SD卡单一块读写测试.SD卡多个块读写测试. ...
- SDIO—SD 卡读写测试
1.SDIO 简介 SD 卡 (Secure Digital Memory Card) 在我们生活中已经非常普遍了,控制器对 SD 卡进行读写通信操作一般有两种通信接口可选,一种是 SPI 接口,另外 ...
- 【正点原子FPGA连载】第四十六章SD卡读写测试实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1
1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...
- 【STM32】STM32 SDIO SD卡读写测试(三)-- SD_Init之Init Card阶段
相关文章 <[SDIO]SDIO.SD卡.FatFs文件系统相关文章索引> 1. 前言 本篇文章主要是介绍stm324x9i_eval_sdio_sd.c里面SD_Init()函数完整的过 ...
- 【STM32】STM32 SDIO SD卡读写测试(二)-- SD_Init之Power On阶段
相关文章 <[SDIO]SDIO.SD卡.FatFs文件系统相关文章索引> 1. 前言 本篇文章主要是介绍stm324x9i_eval_sdio_sd.c里面SD_Init()函数完整的过 ...
- STM32CubeMX系列09——SDIO(SD卡读写、SD卡移植FATFS文件系统)
文章目录 1. 准备工作 1.1. 简单扫盲 1.1.1. SD卡 1.1.2. TF卡 1.1.3. SDIO接口 1.2. 所用硬件及原理图 2. 创建工程 2.1. 选择主控 2.2. 系统配置 ...
- [转]stm32 sdio写入速度 SD卡【好文章】[F1开发板通用] 战舰STM32F103开发板 SDIO写入速度测试(使用FATFS)
http://www.openedv.com/forum.php?mod=viewthread&tid=94284 http://www.openedv.com/forum.php?mod=v ...
- STM32使用SDIO进行SD卡读写关于库函数获取SD卡信息
以下是相关流程 1.STM32通电 2.对几个SDIO相关的引脚初始化(查芯片手册,哪几个引脚对应SDIO,还有时钟也要设置) SD卡只支持4位数据传输,所以只占SDIO_D0 ~ SDIO_D3,再 ...
- 9、STM32 SDIO FATFS(SD卡)
本篇文章使用STM32对SD卡通过SDIO配置,读写文件 在使用FATFS时值得注意得是若通信SDIO不启动DMA方式读写,容易导致其他任务中断打断读写时序,导致FATFS的执行出现异常,常见返回为F ...
- nRF52832学习记录(十二、SPI接口的应用 Micro SD卡读写测试)
目录 1.nRF52xx SPI介绍 SPI接口基础介绍 SPI 寄存器 SPI 库函数介绍 SPI初始化函数 SPI数据传输函数 2.nRF52xx SPI 使用示例 w25qxx SPI Flas ...
最新文章
- C#利用SerialPort类对串口发送接收数据
- 致研究者:2018 AI 研究趋势
- Ipad亚麻布纹背景-最终效果_学习教程
- html 调用main方法,ipcmain和ipcrenderer从index.html调用main.js函数
- 我的世界光影mod怎么用_用“戏剧化”光影艺术 唤醒千年沉睡世界!
- jetty for linux 启用日志
- SAP UI5 应用开发教程之六十九 - 如何从 SAP UI5 Not Found 页面跳转回到正常的应用页面
- LeetCode 1073. 负二进制数相加(负数进制)
- 是否有必要使用外键?为什么不用外键?
- 算法移植优化(一)android 学习笔记
- mysql的建库建表语句_SQL语句(建库、建表、修改语句)
- Rancher Labs联手NeuVector,提供容器管理与安全解决方案
- bio、nio、aio及select、poll、epoll
- php生成黑链,网站被黑链接(进入黑网最有效办法)
- 关于axure 8在发布的时候显示:Unable to connect to Axure Share.的问题
- ev3编程 越野机器人_【EV3基础编程 第四课】机器人编程的基础,先要学这些(下)...
- CapstoneCS5211|CS5211电路|CS5211中文规格书|CS5211设计eDP到LVDS转接板/转换器方案
- 密码爆破 hashcat+rar2john破解rar5压缩包密码
- Xposed环境安装
- Mysql添加报错 MySqlException: Incorrect string value: ‘\xE5\xAF\xBC\xE5\x85\xA5...‘ for