当前位置: 首页 > news >正文

【STM32】SDIO—SD 卡读写01

基于stm32f103
基于零死角玩转STM32—F103指南者

简介

1.SD 卡总共有 8 个寄存器,用于设定或表示 SD 卡信息。
在这里插入图片描述

2.SD卡的寄存器不能像STM32那样访问,而是利用命令访问,SDIO 定义了 64 个命令。SD 卡接收到命令后,根据命令要求对 SD 卡内部寄存器进行修改,程序控制中只需要发送组合命令就可以实现 SD 卡的控制以及读写操作。

总线

在这里插入图片描述
1.SD 卡一般都支持 SDIO 和 SPI 这两种接口。另外,STM32F42x系列控制器的 SDIO是不支持 SPI 通信模式的,如果需要用到 SPI 通信只能使用 SPI 外设。

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

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

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

总线协议

SDIO 不管是从主机控制器向 SD 卡传输,还是 SD 卡向主机控制器传输都只以 CLK 时钟线的上升沿为有效.

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

SD 数据是以(Black)形式传输,数据块长度一般为 512 字节,数据可以从主机到卡,也可以是从卡到主机。

STM32 控制器可以控制使用单线4 线传输。

在这里插入图片描述

命令和响应

一个完整的 SD 卡操作过程是:主机(单片机等)发起“命令”,SD 卡根据命令的内容决定是否发送响应信息及数据等,如果是数据读/写操作,主机还需要发送停止读/写数据的命令来结束本次操作,这意味着主机发起命令指令后,SD 卡可以没有响应、数据等过程,这取决于命令的含义。
在这里插入图片描述

命令格式

SD 命令格式固定为 48bit,都是通过 CMD 线连续传输的(数据线不参与)
在这里插入图片描述
SD 命令的组成如下:
起始位和终止位:命令的主体包含在起始位与终止位之间,它们都只包含一个数据位,起始位为 0,终止位为 1。
传输标志:用于区分传输方向,该位为 1 时表示命令,方向为主机传输到 SD卡,该位为 0 时表示响应,方向为 SD 卡传输到主机。命令主体内容包括命令、地址信息/参数和 CRC 校验三个部分。
命令号:它固定占用 6bit,所以总共有 64 个命令(代号:CMD0~CMD63),每个命令都有特定的用途,部分命令不适用于 SD 卡操作,只是专门用于 MMC 卡或者SD I/O 卡。
地址/参数:每个命令有 32bit 地址信息/参数用于命令附加内容,例如,广播命令没有地址信息,这 32bit 用于指定参数,而寻址命令这 32bit 用于指定目标 SD 卡的地址。
CRC7 校验:长度为 7bit 的校验位用于验证命令传输内容正确性,如果发生外部干扰导致传输数据个别位状态改变将导致校准失败,也意味着命令传输失败,SD卡不执行命令。

也就是说,在clk的上升沿,按照一定的规律发送CMD命令就可以发送可识别的SD卡命令

外设SDIO

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

SDIO由两部分组成 使用两个时钟信号


SDIO 使用两个时钟信号,一个是 SDIO 适配器时钟(SDIOCLK=HCLK=72MHz),另外一个是AHB总线时钟的二分频(HCLK/2,一般为 36MHz)。适配器寄存器和 FIFO使用 AHB总线一侧的时钟(HCLK/2),控制单元、命令通道和数据通道使用 SDIO 适配器一侧的时钟(SDIOCLK)。

SDIO 的数据 FIFO 寄存器(SDIO_FIFO)

数据 FIFO 寄存器包括接收和发送 FIFO,他们由一组连续的32个地址上的 32 个寄存器组成。

CPU 可以使用 FIFO 读写多个操作数。例如我们要从 SD 卡读数据,就必须读 SDIO_FIFO 寄存器,要写数据到 SD 卡,则要写 SDIO_FIFO 寄存器。

SDIO 将这 32 个地址分为 16 个一组,发送接收各占一半。而我们每次读写的时候,最多就是读取发送 FIFO 或写入接收 FIFO 的一半大小的数据,也就是 8 个字(32 个字节),这里特别提醒,我们操作 SDIO_FIFO(不论读出还是写入)必须是以 4 字节对齐的内存进行操作,否则将导致出错!

相关文章:

【STM32】SDIO—SD 卡读写01

基于stm32f103 基于零死角玩转STM32—F103指南者 简介 1.SD 卡总共有 8 个寄存器,用于设定或表示 SD 卡信息。 2.SD卡的寄存器不能像STM32那样访问,而是利用命令访问,SDIO 定义了 64 个命令。SD 卡接收到命令后,根据命令要求对…...

SpringCloud Alibaba 整合Sentinel的基本使用

文章目录 一、什么是Sentinel二、Sentinel 的主要特性1. 流量控制:2. 熔断降级:3. 实时监控:4. 规则配置:5. 集成方便: 三、Sentinel 分为哪几部分:1. 核心库(Java 客户端)2. 控制台&#xff08…...

Linux中如何执行命令

目录 命令格式: 命令分类: 命令帮助: 1、man 2、help 3、--help 4、info命令 终止命令: 补全命令: 1)补全命令: 2)补全文件名和目录名: 命令格式:…...

基于51单片机的智能病房呼叫系统的设计与实现

一、前言 显示床位号使用到4位数码管,为了节约单片IO口,使用TM1637来驱动数码管。 二、TM1637驱动芯片简介 三、电路设计,使用矩阵按键来模拟每个床位的呼叫按钮 四、编写51单片机代码 void delay_ms(u16 n) {u8 i;while(n--){i 111;while…...

js在一个时间范围内产生一个随机时间

js使用使用到Math.random()方法实现在一个时间范围内产生一个随机时间。 /*在时间范围内产生一个随机时间*/ function randomDate(start, end) {if (start ! null && end ! null) {const _start new Date(start).getTime();const _end new Date(end).getTime();cons…...

Javascript Date 对象相关知识

Javascript Date 对象相关知识 参考文章虹猫1992 创建 Date 对象. 方法一: 自动使用当前的日期和时间作为其初始值. var date new Date();方法二:将给定的毫秒数转换为使用的时间,new Date(dateVal) 如果是数字值,dateVal表示指定日期与1970年1月1日午…...

Vim快捷用法

以下为文本操作 1.快速切换 行首^(shift4) 行尾$(shift6) 文章开始gg 位置末尾G 向下翻页CTRLB 向上翻页CTRLF 2.删除内容 删除一行 dd 3.复制粘贴 复制一行yy 粘贴 p 4.撤销操作 撤销操作 u 恢复操作ctrlr 以下都为底行操作 1.显示行号 set nu 2.多文件分屏阅读 加入阅…...

Stream流的常用方法(自用)

自用的笔记, 有🚩 需要多看 基本数据 自定义实体 Data class Student{private String name;private Integer age;private Double height;public Student() {} }假数据 Student s1 new Student(); s1.setAge(20); s1.setName("cookie"); s1.setHeight(…...

【python函数】torch.nn.Embedding函数用法图解

学习SAM模型的时候,第一次看见了nn.Embedding函数,以前接触CV比较多,很少学习词嵌入方面的,找了一些资料一开始也不是很理解,多看了两遍后,突然顿悟,特此记录。 SAM中PromptEncoder中运用nn.Emb…...

with ldid... /opt/MonkeyDev/bin/md: line 326: ldid: command not found

吐槽傻逼xcode 根据提示 执行了这个脚本/opt/MonkeyDev/bin/md 往这里面添加你brew install 安装文件的目录即可...

[golang gui]fyne框架代码示例

1、下载GO Go语言中文网 golang安装包 - 阿里镜像站(镜像站使用方法:查找最新非rc版本的golang安装包) golang安装包 - 中科大镜像站 go二进制文件下载 - 南京大学开源镜像站 Go语言官网(Google中国) Go语言官网(Go团队) 截至目前(2023年9月17日&#x…...

2000-2018年各省能源消费和碳排放数据

2000-2018年各省能源消费和碳排放数据 1、时间:2000-2018年 2、范围:30个省市 3、指标:id、year、ENERGY、COAL、碳排放倒数*100 4、来源:能源年鉴 5、指标解释: 2018年碳排放和能源数据为插值法推算得到 碳排放…...

C# ref 学习1

ref 关键字用在四种不同的上下文中; 1.在方法签名和方法调用中,按引用将参数传递给方法。 2.在方法签名中,按引用将值返回给调用方。 3.在成员正文中,指示引用返回值是否作为调用方欲修改的引用被存储在本地,或在一般…...

MQ - 08 基础篇_消费者客户端SDK设计(下)

文章目录 导图Pre概述消费分组协调者消费分区分配策略轮询粘性自定义消费确认确认后删除数据确认后保存消费进度数据消费失败处理从服务端拉取数据失败本地业务数据处理失败提交位点信息失败总结导图 Pre...

Flutter层对于Android 13存储权限的适配问题

感觉很久没有写博客了,不对,的确是很久没有写博客了。原因我不怎么想说,玩物丧志了。后面渐渐要恢复之前的写作节奏。今天来聊聊我最近遇到的一个问题: Android 13版本对于storage权限的控制问题。 我们都知道,Andro…...

Android kotlin开源项目-功能标题目录

目录 一、BRVAH二、开源项目1、RV列表动效(标题目录)2、拖拽与侧滑(标题目录)3、数据库(标题目录)4、树形图(多级菜单)(标题目录)5、轮播图与头条(标题目录)6…...

Linux下,基于TCP与UDP协议,不同进程下单线程通信服务器

C语言实现Linux下&#xff0c;基于TCP与UDP协议&#xff0c;不同进程下单线程通信服务器 一、TCP单线程通信服务器 先运行server端&#xff0c;再运行client端输入"exit" 是退出 1.1 server_TCP.c **#include <my_head.h>#define PORT 6666 #define IP &qu…...

qt功能自己创作

按钮按下三秒禁用 void MainWindow::on_pushButton_5_clicked(){// 锁定界面setWidgetsEnabled(ui->centralwidget, false);// 创建一个定时器&#xff0c;等待3秒后解锁界面QTimer::singleShot(3000, this, []() {setWidgetsEnabled(ui->centralwidget, true);;//ui-&g…...

Linux网络编程:使用UDP和TCP协议实现网络通信

目录 一. 端口号的概念 二. 对于UDP和TCP协议的认识 三. 网络字节序 3.1 字节序的概念 3.2 网络通信中的字节序 3.3 本地地址格式和网络地址格式 四. socket编程的常用函数 4.1 sockaddr结构体 4.2 socket编程常见函数的功能和使用方法 五. UDP协议实现网络通信 5.…...

【后端速成 Vue】初识指令(上)

前言&#xff1a; Vue 会根据不同的指令&#xff0c;针对标签实现不同的功能。 在 Vue 中&#xff0c;指定就是带有 v- 前缀 的特殊 标签属性&#xff0c;比如&#xff1a; <div v-htmlstr> </div> 这里问题就来了&#xff0c;既然 Vue 会更具不同的指令&#…...

精读双模态检测论文二十六|DefDeN(兰州大学)创新点拉满!门控融合+可变形去噪+对比学习,LiDAR-Camera 3D检测暴力涨点!!!

&#x1f525; 本文定位&#xff1a;CSDN 原创干货 | 兰州大学/卧龙岗大学 LiDAR-Camera 3D目标检测 SOTA 方案 &#x1f3af; 核心收益&#xff1a;一次性解决注意力融合三大痛点——收敛慢、计算量大、误检率高&#xff01;基于门控多模态融合单元&#xff08;GMFU&#xff0…...

RT-Thread开发实战(8)— 基于SPI驱动TFTLCD实现动态数据可视化

1. 从零开始玩转SPI驱动TFTLCD 第一次用RT-Thread驱动TFTLCD屏幕时&#xff0c;我盯着那堆密密麻麻的引脚直发懵。后来才发现&#xff0c;只要搞明白SPI通信和屏幕驱动芯片的关系&#xff0c;这事儿其实比想象中简单多了。我们这次要对付的是ST7789V2这款驱动芯片&#xff0c;它…...

Void Memory:为AI智能体构建持久记忆的轻量级解决方案

1. 项目概述&#xff1a;为AI智能体构建持久记忆的“记忆锚”如果你和我一样&#xff0c;长期与Claude Code、Cursor这类AI编程助手并肩作战&#xff0c;一定对那个令人沮丧的瞬间不陌生&#xff1a;你花了半小时向它详细解释了一个复杂项目的架构、你的编码偏好、刚刚踩过的坑…...

CANN Ascend C断言函数API文档

assert 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言&#xff0c;原生支持C和C标准规范&#xff0c;主要由类库和语言扩展层构成&#xff0c;提供多层级API&#xff0c;满足多维场景算子开发诉求。 项目地址: https://gitcode.com/can…...

告别马赛克!用html2canvas生成高清长图,我踩过的坑和最终方案

告别马赛克&#xff01;用html2canvas生成高清长图&#xff0c;我踩过的坑和最终方案 去年接手一个电商活动页项目时&#xff0c;产品经理要求在H5页面底部添加"生成分享图"功能。本以为用html2canvas这个老牌库能轻松搞定&#xff0c;结果生成的图片模糊得像打了马赛…...

高精度电压基准技术:LT6657的创新与应用

1. 高精度电压基准的技术演进与系统需求在精密数据采集系统的设计中&#xff0c;电压基准如同整个系统的"心脏"&#xff0c;其稳定性直接决定了测量结果的可靠性。过去二十年里&#xff0c;我参与过数十个工业测量项目&#xff0c;深刻体会到基准源选择对系统性能的致…...

从零构建智能文档工厂:自动化生成API文档与多格式发布

1. 项目概述&#xff1a;从“文档生成”到“智能文档工厂”在软件开发和团队协作的日常里&#xff0c;文档工作常常被戏称为“脏活累活”。它不像写代码那样有即时的反馈和成就感&#xff0c;但又不可或缺。无论是API接口文档、项目说明、还是内部流程手册&#xff0c;一份清晰…...

手机端数据恢复神器,值得收藏

今天给大家推荐一款好用的安卓端数据恢复工具&#xff0c;非常好用的&#xff0c;还有一款Wifi信号检测工具&#xff0c;有需要的小伙伴及时下载收藏&#xff01; 软件介绍 第一款&#xff1a;数据恢复大师dumpster 提到数据恢复大师&#xff0c;之前好像也有推荐过&#xff0…...

使用 Taotoken 为 Ubuntu 上的 Node.js 应用提供稳定的大模型 API 服务

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用 Taotoken 为 Ubuntu 上的 Node.js 应用提供稳定的大模型 API 服务 在 Ubuntu 服务器上部署 Node.js 应用&#xff0c;并为其集…...

从拿订单到看方向

在企业积极应对全球化挑战的实践中&#xff0c;贸易型展会&#xff08;如广交会&#xff09;因其汇聚全球商业生态的独特属性&#xff0c;成为企业探索市场、验证策略、获取关键资源的核心节点。未来&#xff0c;供应链全球化将更加强调在动态平衡中构建网络韧性&#xff0c;企…...