STM32F407之SD卡读数据介绍

news2024/12/29 8:47:01

1,SD卡基础知识

SD卡(Secure Digital Memory Card)即:安全数字存储卡,它是在MMC的基础上发展而来,作为存储器件广泛应用于电子产品中。

1.1  SD卡有SDIO和SPI两种传输方式,具体信号定义如下:

其中红色选中的信号是必需的。

1.2   SD卡的内部结构

1.3  SD中的两个重要概念: Sector与Block

 

Sector:  A number of blocks, basic erase unit (SD擦除单位)

可以设置为N*block。

Block :   A number of bytes, basic data transfer unit (SD中最小的读写单位)。

block length 可以被 SET_BLOCKLEN (CMD16)设置 。

1.4 SD 常用命令

Class0 :(卡的识别、初始化等基本命令集)

CMD0:复位SD 卡.

CMD1:读OCR寄存器.

CMD9:读CSD寄存器.

CMD10:读CID寄存器.

CMD12:停止读多块时的数据传输

CMD13:读 Card_Status 寄存器

Class2 (读卡命令集):

CMD16:设置块的长度

CMD17:读单块.

CMD18:读多块,直至主机发送CMD12为止 . 

Class4(写卡命令集) :

CMD24:写单块.

CMD25:写多块.

CMD27:写CSD寄存器 .

Class5 (擦除卡命令集):

CMD32:设置擦除块的起始地址.

CMD33:设置擦除块的终止地址.

CMD38: 擦除所选择的块.

2,STM32读取SD流程

STM32的SDIO接口提供 APB2 外设总线与多媒体卡 (MMC)、SD 卡、SDIO 卡以及 CE-ATA 设备之间的接口。

2.1 时钟

三个时钟信号:卡时钟SDIO_CK(传输速率0-25MHZ)、SDIO适配器时钟SDIOCLK(用于驱动适配器来产生卡时钟,与所挂载的总线时钟相同)、总线时钟PCLK2(F1为HCLK2)

   SDIO_CK计算公式:SDIO_CK=SDIOCLK/(2+CLKp)   CLKp为可配置的分频系数,在初始化时不可以超过400khz ,初始化完成后可全速运行。

2.2 操作流程

A, 初始化相关 GPIO 及 SDIO 外设;

B, 配置 SDIO 基本通信环境进入卡识别模式,通过几个命令处理后得到卡类型;

C,  如果是可用卡就进入数据传输模式,接下来就可以进行读、写、擦除的操作。

2.3  SD 卡初始化

SD 卡初始化过程主要是卡识别和相关 SD 卡状态获取。整个初始化函数流程如下:

具体执行流程如下:

 

(1) 配置 NVIC,SD 卡通信用到 SDIO 中断,如果用到 DMA 传输还需要配置 DMA 中 断。注意中断服务函数不是定义在 stm32f4xx_it.c 文件的,是直接定义在 bsp_sdio_sd.c 文件中,中断服务函数定义在个文件问题都不大,只要定义正确就 可以的,编译器会自动寻找。 (2) 执行 SD_LowLevel_Init 函数,其功能是对底层 SDIO 引脚进行初始化以及开启相 关时钟,该函数在之前已经讲解。

(3) SDIO_DeInit 函数用于解除初始化 SDIO 接口,它只是简单调用 SD_LowLevel_DeInit 函数。而 SD_LowLevel_DeInit 函数是与 SD_LowLevel_Init 函数相反功能,关闭相关时钟,关闭 SDIO 电源,让 SDIO 接近上电复位状态。 恢复复位状态后再进行相关配置,可以防止部分没有配置的参数采用非默认值而 导致错误,这是 ST 官方驱动常用的一种初始化方式。 

(4) 调用 SD_PowerON 函数,它用于查询卡的工作电压和时钟控制配置,并返回 SD_Error 类型错误。

2.4 SD卡读操作

从 SD 卡读取数据可分为单块读取和多块读取。这里介绍单块读操作流程。

SD_ReadBlock 函数执行流程如下: 

(1) 将 SDIO 外设的数据控制寄存器 (SDIO_DCTRL)清理,复位之前的传输设置。 

(2) 调用 SDIO_ITConfig 函数使能相关中断,包括数据 CRC 失败中断、数据超时中断、数 据结束中断等等。然后调用 SD_LowLevel_DMA_RxConfig 函数,配置使能 SDIO 从 SD 卡的读取数据的 DMA 请求。为使 SDIO 发送 DMA 请求,需要调用 SDIO_DMACmd 函数使能。对于高容量的 SD 卡要求块大小必 须为 512 字节,程序员有责任保证目标读取地址与块大小的字节对齐问题。 

(3) 对 SD 卡进行数据读写之前,都必须发送 CMD16 指定块的大小,对于标准卡,读取 BlockSize 长度字节的块;对于 SDHC 卡,读取 512 字节的块。 

(4) 利用 SDIO_DataInitTypeDef 结构体类型变量配置数据传输的超时、块数量、数据块大 小、数据传输方向等参数并使用 SDIO_DataConfig 函数完成数据传输环境配置。 

(5) 最后控制器向 SD 卡发送单块读数据命令 CMD17,SD 卡在接收到命令后就会通过数据线把数据传输到控制器数据 FIFO 内,并自动生成 DMA 传输请求。

(6)SD_WaitReadOperation 函数用于等待数据读取操作完成,只有在确保数据读取完成了,我们就可以放心使用数据。

对嵌入式物联网感兴趣的小伙伴,可以多了解一下相关信息。(看过来)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/652313.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DSSAT模型: 遥感数据与作物生长模型同化及在作物长势监测与估产中的应用

查看原文>>>遥感数据与作物生长模型同化及在作物长势监测与估产中的应用 基于过程的作物生长模拟模型DSSAT是现代农业系统研究的有力工具,可以定量描述作物生长发育和产量形成过程及其与气候因子、土壤环境、品种类型和技术措施之间的关系,为不…

华为开源自研AI框架昇思MindSpore应用案例:SSD目标检测

目录 一、环境准备1.进入ModelArts官网2.使用CodeLab体验Notebook实例 SSD,全称Single Shot MultiBox Detector,是Wei Liu在ECCV 2016上提出的一种目标检测算法。使用Nvidia Titan X在VOC 2007测试集上,SSD对于输入尺寸300x300的网络&#xf…

基于html+css的图展示130

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

正交标注有利于无监督医学图像分割

文章目录 Orthogonal Annotation Benefits Barely-supervised Medical Image Segmentation摘要本文方法Registration ModuleLabel MixingDense-Sparse Co-Training 实验结果 Orthogonal Annotation Benefits Barely-supervised Medical Image Segmentation 摘要 半监督学习的…

【DRAM存储器二】Sense Amplifier

👉个人主页:highman110 👉作者简介:一名硬件工程师,持续学习,不断记录,保持思考,输出干货内容 参考书籍:《Memory Systems - Cache, DRAM, Disk》 目录 前言 感应…

【数据管理架构】什么是 OLAP?

作为数据仓库实施的核心组件,OLAP 为商业智能 (BI) 和决策支持应用程序提供快速、灵活的多维数据分析。 什么是 OLAP? OLAP(用于在线分析处理)是一种软件,用于对来自数据仓库、数据集市或其他一些统一的集中式数据存储…

Sentieon | 每周文献-Population Sequencing-第一期

群体基因组系列文章-1 标题(英文):The Impact of ACEs on BMI: An Investigation of the Genotype-Environment Effects of BMI 标题(中文):ACEs对BMI的影响:探究BMI的基因型-环境效应 发表期刊…

【栈与队列part01】| 232.用栈实现队列、225.用队列实现栈

目录 ✿LeetCode232.用栈实现队列❀ ✿LeetCode225. 用队列实现栈❀ ✿LeetCode232.用栈实现队列❀ 链接:232.用栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):…

为什么要使用卷积

1. 卷积这个名词是怎么解释?“卷”是什么意思?“积”又是什么意思? 卷积的“卷”,指的的函数的翻转,从 g(t) 变成 g(-t) 的这个过程;同时,“卷”还有滑动的意味在里面(吸取了网友李…

【Vue全家桶高仿小米商城】——(一)Node环境配置

文章目录 第一章:课程简介一、Win/Mac Node环境安装二、Linux Node环境安装三、安装淘宝镜像四、安装vue/vue-cli/webpack/webpack-cli五、Node版本如何做卸载和升级(Mac/Linux) 第一章:课程简介 对课程的整体内容做介绍&#xf…

系统编程(4):进程间通信

文章目录 管道通信无名管道有名管道 管道通信 无名管道 无名管道只能在有亲缘关系之间的进程间通信(比如父子进程)。 第一步是创建一个管道,这个管道有两个文件描述符一个读,一个写 - 两个文件描述符fd[2],一个文件…

智慧城市同城V4小程序V2.27独立开源版 + 小程序+全插件+VUE小程序开源前端 安装测试教程

智慧城市同城V4小程序V2.27开源独立版本月最新版,与上一版相比修复了一些小细节,功能本身并无大的变化。体验下来感觉唯一区别用户授权一键就登陆了,上两版都需要选择头像呢称。新版系统包含全插件、包括很多稀缺收费的插件都在里面如括招聘、…

操作系统|知识梳理|复习(下)

目录 📚文件与外存空间 🐇文件的概念 🐇文件系统的概念 🐇文件的组织——路径与目录 🐇文件的存储⭐️ 🥕连续分配法 🥕链接分配法 🥕扩展分配法 🥕链表备份法 …

chatgpt赋能python:Python生成指定位数SEO文章的方法

Python生成指定位数SEO文章的方法 在网站优化中,SEO是一项非常重要的工作,它能够帮助我们提高网站的排名,并吸引更多的流量。在进行SEO优化时,我们需要开发一些有关关键词的文章。本文将介绍如何使用Python生成指定位数的SEO文章…

【前端基础篇】盒子模型、边距、边框、外边距合并问题详解

文章目录 一、盒模型概念与组成1.1 生活举例1.2 概念 二、盒模型组成分析2.1 **内容区(content)**2.2 内填充(padding)2.3 **边框(border)**2.5 外边距(margin)2.6 外边距合并问题2.…

【Django 网页Web开发】06. 模板继承的主题导航栏案例 高效开发 便捷维护(保姆级图文)

目录 实现效果模板继承moban.html 模板页面子页面test1.htmltest2.html url.pyview.py常见格式总结 欢迎关注 『Django 网页Web开发』 系列,持续更新中 欢迎关注 『Django 网页Web开发』 系列,持续更新中 实现效果 很多页面都有导航栏,以CSD…

CAD绘制等分点(定距、定数)

练习用CAD绘制等分点 分成两种,分别为定距分点和定数分点 前者指按照一定的距离在给出的线上绘制等分点 后者将已知的线分为确定的份数,绘制等分点 这里用绘制燃气灶的燃气孔为例: 首先绘制两个长方形作为基础 生成中心线作为参考 使用时…

视频网页前端禁止截屏代码实现js

有言在先 原理是采用商业级DRM实现,DRM 许可证费用目前没有免费服务商,腾讯云价格是0.0056元/次。 另外此功能不兼容安卓,安卓系统无法正常播放视频! 先展示效果 可以看到截屏时刻出现黑屏,录屏也能保证全黑状态。…

独立站的Facebook运营策略探索

Facebook广告是独立站吸引流量和推广业务的重要工具。然而,如何有效地运用Facebook广告,提高曝光率、点击率和转化率,是每个独立站主的关注焦点。本文将探索独立站如何巧妙地运用Facebook广告,实现精准引流和业务增长。 第一&…

性能优化-内存优化

8-《内存优化》 一.基础知识1.Java的内存分配区域2.Java的引用类型3.Java的垃圾回收机制:三个问题4.Android的内存管理机制 二. Android的内存泄漏、内存溢出、内存抖动概念1.**内存泄露**2.**内存抖动**3.常见的内存泄漏现象 三. 工具1.Profiler2.MAT3. Leak Canar…