45_SDIO基础知识

2023-11-20

目录

SDIO协议简介

SDIO设备分类

SD卡物理结构

SD卡寄存器列表

SDIO总线拓扑

SDIO总线

SDIO总线协议

SDIO命令

命令格式

命令类型

响应

SD卡的操作模式

卡识别模式

数据传输模式

STM32 SDIO功能框图

命令通道

命令状态机

数据通道

数据状态机

数据FIFO


SDIO协议简介

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

多媒体卡协会网站http://www.mmca.org中提供了有MMCA技术委员会发布的多媒体卡系统规范。

SD卡协会网站http://www.sdcard.org中提供了SD存储卡和SDIO卡系统规范。

CE-ATA工作组网站http://www.ce-ata.org中提供了CE_ATA系统规范。

SDIO设备分类

 MMC卡可以说是SD卡的前身,现阶段已经用得很少。SDI/O卡本身不是用于存储的卡,它是指利用SDIO传输协议的一种外设。比如Wi-Fi Card,它主要是提供Wi-Fi功能,有些Wi-Fi模块是使用串口或者SPI接口进行通信的,但Wi-Fi SDIO Card是使用SDIO接口进行通信的。并且一般设计SD I/O卡是可以插入到SD的插槽。CE-ATA是专为轻薄笔记本硬盘设计的硬盘高速通讯接口。

目前SDIO协议提供的SD卡规范版本最新是4.01版本,但STM32F1xx系列控制器只支持SD卡规范版本2.0,即只支持标准容量SD和高容量SDHC标准卡,不支持超大容量SDXC标准卡,所以可以支持的最高卡容量是32GB。

SD卡物理结构

一张SD卡包括有存储单元、存储单元接口、电源检测、卡及接口控制器和接口驱动器5个部分。

 存储单元是存储数据部件,存储单元通过存储单元接口与卡控制单元进行数据传输;

电源检测单元保证SD卡工作在合适的电·压下,如出现掉电或上状态时,它会使控制单元和存储单元接口复位;

卡及接口控制单元控制SD卡的运行状态,它包括有8个寄存器;

接口驱动器控制SD卡引脚的输入输出。

SD卡总共有8个寄存器,用于设定或表示SD卡信息。

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

SD卡寄存器列表

SDIO总线拓扑

SD卡一般都支持SDIO和SPI这两种接口,本章内容只介绍SDIO接口操作方式,SD卡与SDIO接口示意图如下:

虽然可以共用总线,但不推荐多卡槽共用总线信号,要求一个单独SD总线应该连接一个单独的SD卡。

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

CLK:时钟线,由SDIO主机产生,即由STM32控制器输出;

CMD:命令控制线, SDIO主机通过该线发送命令控制SD卡,如果命令要求SD卡提供应答, SD卡也是通过该线传输应答信息;

D0-3:数据线,传输读写数据; SD卡可将DO拉低表示忙状态;

VDD、Vss1 Vss2:电源和地信号。

SDIO总线

SDIO的通信时序的物理逻辑非常简单, SDIO不管是从主机控制器向SD卡传输,还是SD卡向主机控制器传输都只以CLK时钟线的上升沿为有效。

SD卡操作过程会使用两种不同频率的时钟同步数据,一个是识别卡阶段时钟频率FOD,最高为400kHz;另外一添数据传输模式下时钟频率FPP,默认最高为25MHz,如果通过相关寄存正在联网识别并翻译,。工作在高速模式,此时数据传输模式最高频率为50MHz。

SDIO总线协议

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

命令与响应交互:

 SD数据是以块形式传输的, SDHC卡数据块长度一般为512字节,数据可以从主机到卡,也可以是从卡到主机。数据块需要CRC位来保证数据传输成功。CRC位由SD卡系统硬件生成。STM32控制器可以控制使用单线或4线传输

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

使用4数据线传输时,每次传输4bit数据,每根数据线都必须有起始位、终止位以及CRC位,CRC位每根数据线都要分别检查,并把检查结果汇总然后在数据传输完后通过DO线反馈给主机。SD卡数据包有两种格式,一种是常规数据(8bit宽),它先发低字节再发高字节,而每个字节则是先发高位再发低位,4线传输示意如下图:

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

SDIO命令

SD命令由主机发出,以广播命令和寻址命令为例,广播命令是针对与SD主机总线连接的所有从设备发送的,寻址命令是指定某个地址设备进行命令传输。

命令格式

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

起始位和终止位:命令的主体包含在起始位与终止位之间,它们都只包含一个数据位,起始位为0,终止位为1。

传输标志:用于区分传输方向,该位为1时表示命令,方向为主机传输到SD卡,该位为0时表示响应,方向为SD卡传输到主机。

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

命令号:它固定占用6bit,所以总共有64个命令(代号: CMDO-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卡向主机发出,部分命令要求SD卡作出响应,这些响应多用于反馈SD卡的状态。基本特性如下:

SDIO总共有7个响应类型(代号: R1-R7),其中SD卡没有R4、R5类型响应。特定的命令对应有特定的响应类型,比如当主机发送CMD3命令时,可以得到响应,R6。

与命令一样, SD卡的响应也是通过CMD线连续传输的。

根据响应内容大小可以分为短响应和长响应。短响应是48bit长度,只有R2类型是长响应,其长度为136bit。

SD卡的操作模式

SD卡有多个版本, STM32控制器目前最高支持《Physical LayerSimplified Specification V2.0》定义的SD卡, STM32控制器对SD卡进行数据读写之前需要识别卡的种类: V1.0标准卡、V2.0标准卡、V2.0高容量卡或者不被识别卡。

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

在每个操作模式下, SD卡都有几种状态,通过命令控制实现卡状态的切换:

卡识别模式

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

上电后,所有卡处于空闲状态,可发送GO_IDLE_STATE(CMDO)让所有卡软复位从而进入空闲状态。

使用SEND_IF_COND(CMD8)命令根据响应确定卡的电压支持范围。

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

使用SD_SEND_OP_COND(ACMD41)命令识别或拒绝不匹配它的电压范围的卡。并通过HCS位及其响应判断是SDSC还是SDHC卡。

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

发送SEND_RELATIVE_ADDR(CMD3)命令,让卡自己推荐一个相对地址(RCA)并响应命令。这个RCA是16bit地址,而CID是128bit地址,使用RCA简化通信。

卡在接收到CMD3并发出响应后就进入数据传输模式,并处于待机状态,主机在获取所有卡RCA之后也进入数据传输模式。

数据传输模式

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

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

数据传输模式下的数据通信都是主机和目标卡之间通过寻址命令点对点进行的。卡处于传输状态下可以使用块的读写以及擦除命令对卡进行数据读写、擦除。

CMD12可以中断正在进行的数据通信,让卡返回到传输状态。CMD0和CMD15会中止任何数据编程操作,返回卡识别模式,这可能导致卡数据被损坏

STM32 SDIO功能框图

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

 SDIO使用两个时钟信号,一个是SDIO适配器时钟(SDIOCLK=72MHz),另外一个是AHB总线时钟的二分频(HCLK/2,一般为36MHz)。STM32控制器的SDIO是针对MMC卡和SD卡的主设备,所以预留有8根数据线,对于SD卡最多用四根数据线。

SDIO适配器是SD卡系统主机部分,是STM32控制器与SD卡数据通信中间设备。SDIO适配器由五个单元组成,分别是控制单元、命令路径单元、数据路径单元、寄存器单元以及FIFO。

命令通道

命令通道控制命令发送,并接收卡的响应,当SD卡处于某一状态时,SDIO适配器必然处于特定状态与之对应。STM32控制器以命令路径状态机(CPSM)来描述SDIO适配器状态变化,并加入了等待超时检测功能,以便退出永久等待的情况。

命令状态机

数据通道

数据路径部件负责与SD卡相互数据传输, SDIO适配器以数据路径状态机(DPSM)来描述SDIO适配器状态变化情况。并加入了等待超时检测功能,以便退出永久等待情况。发送数据时,DPSM处于等待发送(Wait_S)状态,如果数据FIFO不为空, 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请求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

45_SDIO基础知识 的相关文章

  • 电路设计相关

    本人才疏学浅 孤陋寡闻 下文若有不当之处 还请赐教 1 一些概念 施密特触发器 施密特触发器采用电位触发方式 其状态由输入信号电位维持 对于负向递减和正向递增两种不同变化方向的输入信号 施密特触发器有不同的阈值电压 对于标准施密特触发器 当
  • 天眼使用指南--分析平台

    天眼分析平台 提供全面的溯源分析能力 涵盖图中模块 负责存储日志 分为三类 告警日志 告警日志 来自探针和沙箱的告警 探针的告警可以记录双向完整对话 如果网络流量中没有恶意信息 就会储存一些关键信息 如http请求部分状态码 tcp上下前一

随机推荐

  • 用python批量插入clickhouse

    用python批量插入clickhouse 以下是一个示例代码 演示了如何使用clickhouse driver模块实现批量插入和分布式查询 import clickhouse driver import random connect to
  • C语言函数调用过程

    文 读书笔记 C语言函数调用过程 c legendmohe 2015年07月12日发布 推荐 0 推荐 收藏 0 收藏 392 浏览 本文是 老码识途 第一章的读书笔记 函数调用 例子代码如下所示 int Add int x int y i
  • 什么是参数模型(LR)与非参数模型(SVM)

    什么是参数模型 LR 与非参数模型 SVM 在统计学中 参数模型通常假设总体 随机变量 服从某一个分布 该分布由一些参数确定 比如正太分布由均值和方差确定 在此基础上构建的模型称为参数模型 非参数模型对于总体的分布不做任何假设 只是知道总体
  • jQuery Validate验证框架详解

    jQuery校验官网地址 http bassistance de jquery plugins jquery plugin validation 一 导入js库 注 返回web项目的根路径 二 默认校验规则 1 required true
  • 测试大姐趁我下班点又提了个bug!前端你咋多个options请求?

    测试大姐提了个bug 为什么你多了个options请求 1 下班前的寂静 刚准备下班呢 测试大姐又给我提个bug 你看我这就操作了一次 network里咋有两个请求 我心一惊 不可能啊 我代码明明就调用一次后端接口 咋可能两个请求 打开她的
  • floor(),ceil()函数

    地板 天花板函数 均包含在math h中 意思分别为 返回不大于形参的最小整数和不小于形参的最大整数 include
  • Git冲突导致的Please commit your changes or stash them before you merge

    Git冲突导致的Please commit your changes or stash them before you merge 用git pull来更新代码的时候 遇到了下面的问题 error Your local changes to
  • js检查数据类型的方法

    1 typeof 这是最常用的基本数据类型检测的方法 console log typeof string console log typeof 1 number console log typeof true boolean console
  • spring boot最新教程(五):404错误500错误统一处理

    Spring Boot默认使用嵌入式Tomcat 默认没有页面来处理404等常见错误 因此 为了给用户最佳的使用体验 404 500等常见错误需要我们自定义页面来处理 我们需要用org springframework boot contex
  • 威动服务器如何添加文件夹,威动服务器如何设置

    威动服务器如何设置 内容精选 换一换 华为云提供两种连接方式通过SQL Server客户端连接实例 非SSL连接和SSL连接 其中 SSL连接实现了数据加密功能 具有更高的安全性 安装SQL Server客户端请参见如何安装SQL Serv
  • 如何使用 Docker 部署 Caddy Web 服务器

    Caddy是一种流行的现代 Web 服务器 专为高性能和内存安全而设计 它是用 Go 编写的 运行时没有依赖关系 内置支持使用 Markdown 进行静态站点渲染 并提供自动 HTTPS Caddy 专注于提供简单的服务器管理体验 默认情况
  • Vue + Element UI 前端篇(十一):第三方图标库

    Vue Element UI 实现权限管理系统 前端篇 十一 第三方图标库 使用第三方图标库 用过Elment的同鞋都知道 Element UI提供的字体图符少之又少 实在是不够用啊 幸好现在有不少丰富的第三方图标库可用 引入也不会很麻烦
  • HDFS常用命令

    1 hdfs dfs与hadoop fs 命令的形式 hdfs dfs linux命令 这与linux中命令操作是一样的 hadoop fs等同于hdfs dfs 2 Hadoop命令 hadoop classpath 打印当前hadoop
  • 程序员的自我修养(九)虚拟内存空间

    进程的虚拟地址 每个程序被运行起来以后 它将拥有自己独立的虚拟地址空间 这个虚拟地址空间的大小由计算机的硬件平台决定 具体的说是由CPU的位数决定 对于Linux系统来说 它的进程虚拟空间的划分 1GB 操作系统 3GB 进程 对于Wind
  • derby mysql 性能_derby的三大缺陷

    derby数据库的嵌入式特性让人很流口水 但是 我刚打算将其用进我的项目中 却发现它没有好的分页查询方式 每次都返回所有符合条件的记录 oracle有rownum mysql有limit sqlserver好歹也有个top 汗啊汗 看来不爽
  • 【ROS入门学习01

    ROS命令行工具的使用 可以配合古月居的ROS入门教程来学习实践 文章目录 ROS命令行工具的使用 一 roscore 二 rosrun 三 rqt graph 四 rosnode 五 rostopic 六 rosmsg 七 rosserv
  • 客观面试题--35.Mybatis和hibernate的优缺点?

    Hibernate Hibernate 是当前最流行的ORM框架 对数据库结构提供了较为完整的封装 Mybatis Mybatis同样也是非常流行的ORM框架 主要着力点在于POJO 与SQL之间的映射关系 其次具体从几个方面说一下两者的区
  • 自己动手部署以太坊联盟链

    一个区块链学习项目 GitHub https github com xianfeng92 Love Ethereum 假设已经在Ubunbu 14 04 LTS上安装好了以太坊客户端Geth 使用Geth部署以太坊联盟链 以太坊Geth客户
  • java jvm dump文件_干货分享丨jvm系列:dump文件深度分析

    摘要 java内存dump是jvm运行时内存的一份快照 利用它可以分析是否存在内存浪费 可以检查内存管理是否合理 当发生OOM的时候 可以找出问题的原因 那么dump文件的内容是什么样的呢 JVM dump java内存dump是jvm运行
  • 45_SDIO基础知识

    目录 SDIO协议简介 SDIO设备分类 SD卡物理结构 SD卡寄存器列表 SDIO总线拓扑 SDIO总线 SDIO总线协议 SDIO命令 命令格式 命令类型 响应 SD卡的操作模式 卡识别模式 数据传输模式 STM32 SDIO功能框图