STM32F4X SDIO(二) SDIO协议
上一节简单介绍了SD卡的分类,本节将会介绍SD卡的通信协议,也就是SDIO协议。
STM32F4X SDIO(二)SDIO协议
- SD 卡管脚和寄存器
- SD卡管脚分布
- SD卡通信协议
- SD卡寄存器
- SD卡内部结构
- SDIO总线
- SDIO总线拓扑
- SDIO总线协议
- SDIO协议的基本结构
- SDIO协议数据传输
- SDIO协议命令与响应的结构
- 命令结构
- 响应结构
- 短响应
- 长响应
- SDIO数据包格式
- 常规数据包格式(8bit 宽)
- 1线模式
- 4线模式
- 宽位数据包格式
- 1线模式
- 4线模式
SD 卡管脚和寄存器
SD卡管脚分布
我们以标准SD卡为例,先介绍一下SD卡的管脚。我们翻开SD卡的背面就能看到SD卡的管脚分布。

SD卡通信协议
SD卡的通信协议有两种,分别是SDIO协议和SPI协议,本节主要讲的是SDIO协议。
| 管脚 | SDIO协议 | SPI协议 | ||||
|---|---|---|---|---|---|---|
| 名称 | 类型 | 描述 | 名称 | 类型 | 描述 | |
| 1 | CD/DAT3 | 输入输出(推挽模式) | 检测/数据线3 | CS | 输入 | 片选(低电平有效) |
| 2 | CMD | 输入输出(推挽模式) | 命令/响应 | DI | 输入 | 数据输入 |
| 3 | VSS1 | 输入 | 接电源地 | VSS | 输入 | 接电源地 |
| 4 | VDD | 输入 | 电源 | VDD | 输入 | 电源 |
| 5 | CLK | 输入 | 时钟 | SCLK | 输入 | 时钟 |
| 6 | VSS2 | 输入 | 接电源地 | VSS2 | 输入 | 接电源地 |
| 7 | DAT0 | 输入输出(推挽模式) | 数据线0 | DO | 输出(推挽模式) | 数据输出 |
| 8 | DAT1 | 输入输出(推挽模式) | 数据线1 | 保留 | x | x |
| 9 | DAT2 | 输入输出(推挽模式) | 数据线2 | 保留 | x | x |
SD卡寄存器
每个SD卡内部都有8个寄存器,寄存器的介绍如下
| 名字 | 位数 | 描述 |
|---|---|---|
| CID | 128位 | 卡识别号;用来识别的卡的个体号码 |
| RCA | 16位 | 相对地址;卡的本地系统地址,初始化时,动态地由卡建议,主机核准,SPI 模式不使用 |
| DSR | 16位 | 驱动级寄存器;配置卡的输出驱动 |
| SCR | 64位 | SD 配置寄存器;SD 卡的特殊能力信息 |
| CSD | 128 | 卡的具体数据;卡的操作条件信息 |
| OCR | 32位 | 操作条件寄存器 |
| SSR | 512 | SD 状态;卡专有特征的信息 |
| CSR | 32 | 卡状态;卡状态信息 |
SD卡内部结构
下图为SD卡的内部结构,其结构主要可以分成以下5部分

- 外部接口(1):外部接口是用户实际能看到的结构,在SD卡的背面,其作用是将内部的管脚引出来,与设备进行连接。
- 寄存器(2):SD卡内部的寄存器组,SD卡的信息,地址、初始化操作都需要通过读写SD卡的寄存器完成。
- SD卡接口控制器(3):SD卡内部的控制器,主要是处理用户的发下来命令、数据以及给用户返回SD卡的一些状态,可以理解成一个封装在SD卡内部的MCU。
- 存储器接口(4):SD卡内部的存储器接口芯片,作用是管理SD卡的存储阵列。
- 存储阵列:SD卡的数据存储都放在存储阵列中,SDHC的SD卡每个存储阵列大小为512字节。
SDIO总线
SDIO总线拓扑

一个SDIO控制器上运行连接多个SD卡设备,此时SDIO控制器相当于是主机,SD卡相当于是从机。在SD卡初始化的过程中,SD卡会给主机返回一个地址(RCA),这个地址就是代表该SD卡的在系统中的唯一编号,可以理解成I2C协议中的从设备地址。
SDIO总线协议
SDIO协议的基本结构
SDIO总线协议是基于命令和数据流,在开始传输数据之前会有一个起始位,通常为0,结束时有一个停止位,通常为1.
- 命令(Command):命令是主机发送给SD卡,通过CMD信号线进行传输,其作用向SD卡发起一个操作。
- 响应((Response):响应是SD卡给主机,也是通过CMD线进行传输,作为收到命令后的操作,有些命令可以没有响应。
- 数据((Data):数据的传输是双向的,通过数据线进行传输。

- 没有响应的命令(1):对于没有响应的命令来说,主机只需要往CMD信号线上传输命令即可,不需要等待接收SD卡的响应。
- 有响应的命令(2):对于有响应的命令,主机在CMD线上传输完命令之后,需要等待接收SD卡返回的响应,也是在CMD线上接收响应。
SDIO协议数据传输
SD卡的数据传输都是以块为单位进行传输,SDHC容量的SD卡,每个块大小为512字节。

数据块的后面需要一个CRC来保证数据的准确性,CRC由SD卡或者SDIO硬件自动产生,在数据写入时需要检查busy信号,因为数据写入到SD卡的存储阵列需要时间。多块数据的写入还需要主机给从机发送停止命令让SD卡停止接收数据,SD卡的读操作类似。
SDIO协议命令与响应的结构
命令结构

- 每一个命令的开始都要发送一个起始位,起始位的电平为低电平。
- 每一个命令会都会接一个传输位,通常为1,代表主机发送命令。
- CMD命令带参数传输,其参数位数为32位
- 每个CMD都会一个7位的CRC校验码,保证命令的传输没有错误。
- 结束时发送一个结束位,结束位电平为高电平。
- 命令的总长度为48位。
命令格式:起始位(1bit)+传输位(1bit)+参数(32bit)+CRC(7bit)+停止位(1bit)
响应结构
SD卡的响应分为两种,分别是短响应(48bit)和长响应(136bit)

短响应
- 每一个短响应发送一个起始位,起始位的电平为低电平。
- 每一个短响应都会接一个传输位,通常为0,代表响应。
- 接着是45位的响应数据,CRC(7bit)包含在响应数据里面
- 结束时发送一个结束位,结束位电平为高电平。
- 短响应的总长度为48位。
短响应格式:起始位(1bit)+传输位(1bit)+响应数据(45bit)+停止位(1bit)
长响应
- 每一个长响应发送一个起始位,起始位的电平为低电平。
- 每一个长响应都会接一个传输位,通常为0,代表响应。
- 接着是133位的响应数据,CRC(7bit)包含在响应数据里面
- 结束时发送一个结束位,结束位电平为高电平。
- 长响应的总长度为136位。
短响应格式:起始位(1bit)+传输位(1bit)+响应数据(133bit)+停止位(1bit)
SDIO数据包格式
SDIO协议的数据包有两种格式,分别是常规数据包格式(8bit 宽)和宽位数据包格式
常规数据包格式(8bit 宽)
常规数据包格式又可以分为两种,分别是1线和4线模式
1线模式

- 在数据发送前,需要发送一个起始位,低电平有效
- 将数据按照8bit的格式一个一个在DATA0数据线上发送出去
- 当所有数据传输完成后,需要发送一个CRC校验码,保证数据准确
- 最后发送一个停止位,高电平有效
4线模式

- 在数据发送前,需要发送一个起始位,低电平有效
- 当发送一个字节时,需要将字节的高4位先发送,最后再发送字节的低4位。字节的发送按照DATA3:bit7 bit3,DATA2:bit6 bit2,DATA1:bit5 bit1,DATA0:bit4 bit0的格式进行发送
- 当所有数据传输完成后,每根数据线上需要发送一个CRC校验码,保证数据准确
- 最后发送一个停止位,高电平有效。
宽位数据包格式
宽位数据包格式也可以分为两种,分别是1线和4线模式。其特点跟常规数据包模式类似。
1线模式

- 在数据发送前,需要发送一个起始位,低电平有效
- 将数据按照高位在前,低位在后的格式在DATA0数据线上发送出去
- 当所有数据传输完成后,需要发送一个CRC校验码,保证数据准确
- 最后发送一个停止位,高电平有效
4线模式

- 在数据发送前,需要发送一个起始位,低电平有效
- 按照高4位在前,低4位在后的格式依次在数据线上发送
- 当所有数据传输完成后,每根数据线上需要发送一个CRC校验码,保证数据准确
- 最后发送一个停止位,高电平有效。
相关文章:
STM32F4X SDIO(二) SDIO协议
上一节简单介绍了SD卡的分类,本节将会介绍SD卡的通信协议,也就是SDIO协议。 STM32F4X SDIO(二)SDIO协议 SD 卡管脚和寄存器SD卡管脚分布SD卡通信协议SD卡寄存器SD卡内部结构 SDIO总线SDIO总线拓扑SDIO总线协议SDIO协议的基本结构…...
设计模式--7个原则
单一职责原则:一个类负责一项职责。 里氏替换原则:继承与派生的规则。 依赖倒置原则:高层模块不应该依赖基层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。即针对接口编程࿰…...
AltiumDesigner原理图编译错误报告信息解释
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、ViolationsAssociated with Buses 有关总线电⽓错误的各类型(共 12 项)二、ViolationsAssociated Components 有关元件符号电⽓错误…...
使用 Visual Studio Code 编写 TypeScript程序
安装 TypeScript 首先,确保你已经安装了 TypeScript,如果没有安装,请参考https://blog.csdn.net/David_house/article/details/134077973?spm1001.2014.3001.5502进行安装 创建 新建一个文件夹,用vs code打开,在文…...
科大讯飞发布讯飞星火 3.0;开源AI的现状
🚀 科大讯飞发布讯飞星火 3.0,综合能力超越ChatGPT(非GPT-4版) 摘要:科大讯飞在2023全球1024开发者节上宣布讯飞星火 3.0正式发布,号称综合能力已超越ChatGPT。据介绍,星火认知大模型 V3.0在文…...
公网远程访问macOS本地web服务器
# 公网访问macOS本地web服务器【内网穿透】 文章目录 1. 启动Apache服务器2. 公网访问本地web服务2.1 本地安装配置cpolar2.2 创建隧道2.3 测试访问公网地址3. 配置固定二级子域名3.1 保留一个二级子域名3.2 配置二级子域名4. 测试访问公网固定二级子域名 以macOS自带的Apache…...
windows 安装小乌龟
这是什么 这里简单描述一下在windows上如何安装GIT代码管理工具和使用小乌龟版本来调用GIT,并且配置一下git相关信息,可以使用小乌龟来操作代码。也有一些常规git使用方法。 需要的资源 Git-2.42.0-64-bit.exe(这个是git代码管理工具&…...
toon boom harmony基础
以下都是tbh快捷键使用,或者一些常用功能介绍 1、在节点视图中,按回车可直接弹出节点库搜索框 2、中心线编辑器 只能编辑用笔刷画出来的线条,铅笔画出来的线条无法编辑。 3、镜头标记 1 右键箭头方向,可弹出下拉,&am…...
JPA联合主键
在实际工作中,我们会经常遇到联合主键的情况,所以我用简单例子列举JPA两种实现联合主键的方式。 1、如何通过IdClass 实现联合主键 第一步:新建一个UserInfoID类,里面是联合主键 Data Builder NoArgsConstructor AllArgsConstructor pu…...
水性杨花:揭秘CSS响应式界面设计,让内容灵活自如,犹如水之变幻
🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 ⭐ 专栏简介 📘 文章引言 一、是…...
fio performance test
fio参数解释 可以使用fio -help查看每个参数,具体的参数左右可以在官网查看how to文档,如下为几个常见的参数描述 filename/dev/emcpowerb 支持文件系统或者裸设备,-filename/dev/sda2或-filename/dev/sdb 或 -filename/dev/nvme0n1direct…...
DevOps持续集成-Jenkins(1)
文章目录 DevOpsDevOps概述Code阶段工具(centos7-gitlab主机)Windows下安装Git(作用是:使我们可以上传代码到GitLab)Linux下安装GitLab⭐(作用是:运行一个GitLab接收代码)环境准备先…...
Pytorch代码入门学习之分类任务(二):定义数据集
一、导包 import torch import torchvision import torchvision.transforms as transforms 二、下载数据集 2.1 代码展示 # 定义数据加载进来后的初始化操作: transform transforms.Compose([# 张量转换:transforms.ToTensor(),# 归一化操作&#x…...
oracle 里常用的一些 create insert update table
1、获得数据库里某个指定的库 SELECT COUNT(*) FROM ALL_TABLES ut WHERE ut.OWNERTJFX AND ut.TABLE_NAME CUR_TIME_BILL; 2、创建一个表,里面的数据可以从一个已存在的表里转移过来 CREATE TABLE temptable AS SELECT * FROM old_tbName //使用现有的表创建一…...
从Mysql架构看一条查询sql的执行过程
1. 通信协议 我们的程序或者工具要操作数据库,第一步要做什么事情? 跟数据库建立连接。 首先,MySQL必须要运行一个服务,监听默认的3306端口。在我们开发系统跟第三方对接的时候,必须要弄清楚的有两件事。 第一个就是通…...
Linux系统下DHCP服务安装部署和使用实例详解(蜜罐)
目录 一、概述 二、具体配置如下: 一、概述 DHCP :动态主机设置协议(英语:Dynamic Host Configuration Protocol,DHCP)是一个局域网的网络协议,使用UDP协议工作,主要有两个用途&…...
模数转换器-ADC基础
文章目录 一、ADC是什么二、ADC处理采样保持量化编码三、ADC采样的重要参数:测量范围:分辨率(Resolution):精度:采样时间:采样率(Sampling Rate):信噪比(Signal-to-Noise Ratio, SNR):转换时间:一、ADC是什么 ADC(Analog-to-Digital Converter):模拟数字转换器…...
Linux:【1】Linux中的文件权限概念和相关命令
Linux:【1】Linux中的文件权限概念和相关命令 1、什么是文件权限?1.1、文件权限的表示方式 2、理解文件权限2.1、用户权限2.2、组权限2.3、其他权限 3、设置文件权限3.1、chmod 命令3.2、权限符号表示法3.3、权限数字表示法 4、查看文件权限4.1、ls 命令…...
JS实用小计
1.如何创建一个数组大小为100,每个值都为0的数组 // 方法一: Array(100).fill(0);// 方法二: // 注: 如果直接使用 map,会出现稀疏数组 Array.from(Array(100), (x) > 0);// 方法二变体: Array.from({ length: 100 }, (x) > 0); 2.如何逆序一个字…...
Android---Bitmap详解
每一个 Android App 中都会使用到 Bitmap,它也是程序中内存消耗的大户,当 Bitmap 使用内存超过可用空间,则会报 OOM。 Bitmap 占用内存分析 Bitmap 用来描述一张图片的长、宽、颜色等信息,可用使用 BitmapFactory 来将某一路径下…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
macOS 终端智能代理检测
🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub 在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如: fatal: unable to access https://github.com/ohmyzsh/oh…...
