SD卡的控制方法与时序

2023-10-27

1

  1.SD卡的命令格式:

  SD卡的指令由6字节(Byte)组成,如下:

Byte1:0 1 x x x x x x(命令号,由指令标志定义,如CMD39为100111即16进制0x27,那么完整的CMD39第一字节为01100111,即0x27+0x40)

Byte2-5:Command Arguments,命令参数,有些命令没有参数

Byte6:前7位为CRC(Cyclic Redundacy Check,循环冗余校验)校验位,最后一位为停止位0


   2.SD卡的命令

  SD卡命令共分为12类,分别为class0到class11,

不同的SDd卡,主控根据其功能,支持不同的命令集 如下:

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: 擦除所选择的块.

Class6(写保护命令集):

CMD28:设置写保护块的地址.

CMD29:擦除写保护块的地址.

CMD30: Ask the card for the status of the write protection bits

class7:卡的锁定,解锁功能命令集

class8:申请特定命令集 。

class10 -11 :保留

其中 class1,    class3,class9:SPI模式不支持

了解了指令的形式和具体的控制内容,下面主要解决的就是MCU与SD卡的通信问题,通信主要需要注意下面的问题:

   (1)供电电压:必须是3.3V

   (2) 通信模式的切换:SD卡有两种通信模式:SPI模式和SD模式,默认情况下的通信模式是SD模式,但是我们常用的模式是SPI模式,这就需要一个切换模式的方法,具体的实现方法在其他地方也都有介绍,其关键的地方就是先上电延时大于74个时钟周期后发送复位命令,复位成功(接收到0x01的响应)后,连续发送CMD55和ACMD41,直到响应0X00为止,此时SD卡已经进入SPI模式。

  (3)上面所说的发送复位命令(CMD0)以及CMD55和ACMD41要有具体的实现方法,需要解决的就是时序问题,


2

    

    下图就为复位的时序图,只要能够按照下图的时序进行操作,肯定能够复位成功.

    SD卡的复位和初始化


   

  当 SD 卡完成上电后,主机FPGA先对从机SD卡发送74 个以上的同步时钟(且保持拉高CS和(CMD)IN),然拉低CS,然后向SD 卡发送第1字节的命令字CMD0 命令(因命令号的最高位始终为0,次高位为1,因此发送给SD 卡的命令是0 与0x40 进行或运算的结果)。命令字的第2、3、4、5 字节皆为0x00。命令字的第6 字节为CRC 校验字节,固定为0x95。


  主机FPGA命令字发送完成后,发送若干个8 位的同步时钟(即FPGA等待),直至FPGA接收到SD 卡发出响应字节0x01。接收完SD 卡的响应字节后,主机FPGA把CS 线拉高,再发送8 个空时钟,复位过程完成。


 当 SD卡执行完复位过程后,主机FPGA接着向从机SD卡发送初始化指令CMD1,以激活SD 卡SPI 方式。


    首先发送指令号CMD1(0x01|0x40=0x41),然后发送4 个0x00 字节,最后发送CRC 校验码,此处为0xFF,原因是此时SD卡已经工作在SPI 模式,在SPI 模式下,SD卡默认为不进行CRC 校验,因此我们可以随意写入一个0xFF字节以填充满整个命令字的结构。


     当主机FPGA向SD卡发送完CMD1 指令后,发送若干个8 位的同步时钟(即FPGA等待),直至FPGA接收SD卡发出响应字节0x00。接收完SD卡的响应字节后,FPGA拉高CS线,再发送8个空时钟,初始化过程完成。


     至此,完成了SD卡的复位、初始化而进入到SPI方式的所有步骤。


3


  五、SD卡的SPI方式读写

   SD卡读写一次的数据量必须为512 字节的整数倍,亦即,对SD卡读写操作的最少数据量为512 字节。我们也可以通过向SD 卡写修改扇区大小的指令CMD16(CMD16—为接下来的块操作指令设置块长度)以使每次读写的数据量变为(n×512)字节(n≥1),本文中我们使用SD卡默认的一次操作512 字节的模式对SD 卡进行读写操作。


 对SD卡读操作的时序为:

(1) 写入读单数据块命令CMD17(0x11|0x40=0x51)。

(2) 写4 个地址参数,4 个字节凑成一个32 位的地址值,第一个字节是32 位地址值的最高8 位数据,第4 个字节          是32 位地址值的最低8 位数据。(与写操作不同)

(3) 写CRC 校验位0xFF。

(4) 写若干个0xFF 的空操作。

(5) SD 卡发送0x00 响应。

(6) 写若干个0xFF 的空操作(等待)。

(7) SD 卡发送0x FE 数据头。

(8) SD 卡发送指令指定地址的512 字节数据块。

(9) SD 卡发送两字节的CRC 校验码,由于SPI 模式默认不需要CRC 校验,因此这两个字节的数据可丢弃不用。

(10)拉高CS,发送8 个空时钟。

 至此,完成了对SD卡指定地址数据块的读操作。



 对SD卡写操作的时序为:

(1) 写入读单数据块命令CMD24(0x18|0x40=0x58)。

(2) 写4 个地址参数,4 个字节凑成一个32 位的地址值,第一个字节是32 位地址值的最低8 位数据,第4 个字节          是32 位地址值的最高8位数据。(与读操作不同)

(3) 写CRC 校验位0xFF。

(4) 写若干个0xFF 的空操作。

(5) SD 卡发送0x00 响应。

(6) 写若干个0xFF 的空操作。

(7) 写0x FE 数据头,表示接下来要发送512 字节的数据块。

(8) 写512 字节数据块。

(9) 写两字节的0xFF 作为CRC 校验码的填充字节。

(10)SD 卡发送xxx00101B 响应码。

(11)在SD 卡将512 字节数据向指定地址写完之前,其数据输出断时钟被拉低。

(12)SD 卡释放数据输出线DataOut。

(13)拉高CS,发送8 个空时钟。

 至此,完成了对SD 卡指定地址数据块的写操作。

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

SD卡的控制方法与时序 的相关文章

  • Bootstrap日期控件,实现日期控件只选择不准输入效果

    一 引入日期控件CSS JS 二 input就用控件 td 发行时间 td td div class input group date style width 14em div td
  • CDN,P2P,PCDN的区别?

    如何来有效解决网络卡顿的问题 这就是我们SwarmCloud要解决的问题啦 那么为了大家能更好地了解SwarmCloud的网络加速技术 本篇文章为大家介绍一下与网络加速有关的几个重要概念 一起了解一下CDN P2P和PCDN究竟是什么吧 1
  • 黄色叹号_资深从业者教你如何关闭SolidWorks任务栏的感叹号图标提示

    很多小伙伴在安装启动SolidWorks的时候 是不是会弹出内存不足的提示 或者在SolidWorks任务栏显示黄色感叹号图标 看着很不顺眼 我们回头一看自己的电脑内存 显存 发现又很充足 这种情况一般是新安装SolidWorks才会出现
  • QT day2

    1 完成登录框的按钮操作 并在登录成功后进行界面跳转 跳转界面代码 include form h include ui form h Form Form QWidget parent QWidget parent ui new Ui For
  • 银河麒麟安装mysql

    1 在线安装和卸载 安装arm版 先看下本地源 sudo gedit etc apt sources list 或者 sudo pluma etc apt sources list 查询mysql源 sudo apt search mysq
  • 实用小软件实现Mac读写ntfs U盘 移动硬盘

    对于Mac默认情况下 不支持NTFS U盘移动硬盘的读写问题 一直困扰着Mac用户 其实解决的方法还不少 方案一 有人建议敲代码解决 可是 对于小白用户来说 sudo nano blah blah 这是个什么鬼 完全不懂啊 方案二 搞个Wi
  • 天梯题集——冰岛人(隐藏条件:考虑嫡系)

    前文 愿天下有情人都是失散多年的兄妹 与 冰岛人 解题思路几乎是同理的 不过这里需要考虑多一个是否嫡系的关系 卡了我好久 又来一个隐藏条件 长知识 长知识 用递归实现很容易出现超时 循环果然比递归效率高 循环与递归效率的比较 冰岛人 解题难
  • 配置apache允许所有ip访问

    1 打开 apache安装目录 conf httpd conf 配置文件 a 搜索Listen监听端口 修改如下 Listen Allows you to bind Apache to specific IP addresses and o
  • 交换律和结合律

    交换律和结合律 加法交换律 A B B A 交换两个加数的位置 结果不变 乘法交换律 AB BA 交换两个因数的位置 结果不变 加法结合律 A B C A B C 三个数相加 先计算前两个数再计算第三个数的结果与先计算后两个数再计算第一个数
  • linux文件操作常见考题_linux试题

    1 当登录Linux时 一个具有唯一进程ID号的shell将被调用 这个ID是什么 B A NID B PID C UID D CID 2 用vi打开一个文件 如何用字母 new 来代替字母 old A A s old new g B s
  • js中null、NaN和undefined的区别

    1 js中null NaN和undefined的区别 在js 中未定义的值 是null 定义未赋值为undefined null 为特殊的一种object NAN 为特使一种number 数据类型
  • 【python】基础课程 在这里哦

    推荐一些Python学习资料 如果你是准备学习Python或者正在学习 下面这些你应该能用得上 Python所有方向的学习路线图 清楚各个方向要学什么东西 100多节Python课程视频 涵盖必备基础 爬虫和数据分析 100多个Python
  • pysot训练自己数据集

    pysot如何训练网络呢 有没有人知道呢 咱们可以互相交流
  • 【通信基础】通信基础、编码&&调制

    https www jianshu com p 128c1157eb97 原文地址 1 通信基础 编码 调制 1 物理层的基本概念 物理层解决如何在连接各种计算机的传输媒体上传输数据比特流 而不是指具体的传输媒体 物理层的主要任务 确定与传
  • python水印倾斜_python中图像特定位置的水印算法

    目前我正在处理一个图像处理项目 在这个项目中 我需要将图像分割成几个片段 然后在每个片段上应用水印 在 我写了一个代码 通过掩蔽将图像分成几段 您可以找到代码here 现在我想在每个片段上实现水印 水印教程可以在here找到 在 我该怎么做
  • LeetCode--初级算法--数组篇--第二题--买卖股票的最佳时机 II

    GitHub地址 题目 给定一个数组 它的第 i 个元素是一支给定股票第 i 天的价格 设计一个算法来计算你所能获取的最大利润 你可以尽可能地完成更多的交易 多次买卖一支股票 注意 你不能同时参与多笔交易 你必须在再次购买前出售掉之前的股票
  • 淘宝SEO珍贵笔记

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 分享淘宝SEO技术 讲诉如何使用 关键词 带来百万IP流量 大家都有目共睹淘宝七月八号改变规则后引发了不少争议 后面所引起的众多卖家 围攻 淘宝之事也不仅发生过一次了 还有
  • 如何解决vcruntime140.dll找不到的问题?两种方法教你解决

    当你在运行某些应用程序或游戏时 可能会遇到一个错误提示 即 找不到vcruntime140 dll 文件 这是因为你的电脑中缺少了这个动态链接库文件 这个问题可能会导致你无法正常使用某些应用程序 在本文中 我们将介绍两种方法来解决 目录 一

随机推荐

  • 树莓派安装Ubuntu22.04后使用X86_Linux交叉编译Qt5+opencv4

    文章目录 准备工作 环境搭建 准备编译 未完待续 准备工作 树莓派安装Ubuntu 直接从官网下载对应的镜像烧写工具下载地址 工具里面准备好了对应的镜像地址 直接烧写入SD卡就行了 进入系统 ubuntu server22 04默认密码应该
  • k8s 使用GlusterFS做持久化存储

    一 创建GlusterFS 首先找几台主机做GlusterFS存储 这里用了3台主机 10 244 0 10 10 244 0 11 10 244 0 12 安装GlusterFS 安装过程如下 安装 gluster 源 yum insta
  • 【数据结构】图解八大排序(上)

    文章目录 一 排序简介 二 直接插入排序 三 希尔排序 四 直接选择排序 五 堆排序 六 冒泡排序 七 冒泡排序与直接插入排序效率对比 一 排序简介 生活中 我们经常能看到排序的应用 例如 我们在网购商品的时候 经常按销量从高到低排序 常见
  • C语言经典100例题(38)--求一个3 * 3矩阵对角线元素之和

    目录 题目 问题分析 代码 测试结果 题目 求一个3 3矩阵对角线元素之和 问题分析 利用双重for循环控制输入二维数组 再将 a i i 累加后输出 代码 include
  • SpringBoot2.x使用缓存注解操作Redis

    为了进一步简化 Redis 的使用 Spring还提供了缓存注解 使用这些注解可以有效简化编程过程 缓存管理器和缓存的启用 Spring 在使用缓存注解前 需要配置缓存管理器 缓存管理器将提供一些重要的信息 如缓存类型 超时时间等 Spri
  • 低代码开发工具到底是给“谁”用的?

    不同的工具 受众也不一样 你不要认为 低代码开发工具 只有一种 实际上它分 3 种 第一种 企业级低代码开发平台 这种通常是给专业开发人员使用的 但也没有限制得很死 只要你懂编程逻辑 能写sql语句 就基本会用 就连专业的产品经理也可以用来
  • Vue实现多文件上传功能(前端 + 后端代码)

    开发项目的时候 用到文件上传的功能很常见 包括单文件上传和多文件上传 上传各种类型的文件 在vue里面要实现多文件上传功能 还是很方便的 本文就一起来学习一下 如何把多文件上传功能封装成一个组件 后面需要使用的时候 直接两三行代码就能搞定
  • 已解决(Python爬虫requests报错)requests.exceptions.ProxyError: HTTPSConnectionPool

    成功解决 Python爬虫requests报错 requests exceptions ProxyError HTTPSConnectionPool 文章目录 报错信息 报错翻译 报错原因 解决方法 千人全栈VIP答疑群联系博主帮忙解决报错
  • Unix域编程流程简单梳理

    文章目录 Unix域编程作用 Unix域编程流程 Unix域编程的地址格式 Unix编程注意事项 Unix编程简单示例 客户端实例 服务端实例 Unix域编程作用 Unix域编程用于同一台主机内部的进程之间的客户端 服务端通信 使用和网络s
  • 什么是LTS、Alpha、Beta、Dev、Release、Patch版本,软件的开发周期有多少种命名

    根据Wikipedia 2023 Software release life cycle显示 软件的开发周期版本命名有以下几种 Pre alpha Dev Alpha Beta Perpetual beta Open and closed
  • Boyer-Moore 投票算法(摩尔投票法)

    摩尔投票法简单来说就是在不影响或者增大众数在整个数组中的地位的情况下去消除无关数字带来的影响 只需遍历一遍数组即可找到众数 算法流程 先随机假设一个数x为候选数 可以假设数组的第一个数 并尝试维护一个count计数器 开始设置为0 设置了众
  • GPT系列训练与部署——Colossal-AI环境配置与测试验证

    Colossal AI框架主要特色在于对模型进行并行训练与推理 多GPU 从而提升模型训练效率 可快速实现分布式训练与推理 目前 该框架已集成很多计算机视觉 CV 和自然语言处理 NLP 方向的算法模型 特别是包括GPT和Stable Di
  • Hbuilder We're sorry

    当Webview窗口加载错误地址 如本地页面不存在 或者访问网络资源失败 如无法访问网络 时会自动显示默认错误页面 可以通过以下方法自定义Webview的404等错误页面 设置应用全局默认错误页面 5 App和wap2app 在应用的man
  • OSPF从初学到放弃 2.1

    本来要开开心心写博客的 结果刚刚看见之间知乎上的两个评论被要求修改 两篇评论都是关于同一个问题的 我都有理由怀疑是资本的力量太强大了 说好的舆论自由呢 一群骗子 好气好气好气 OSPF协议及作业 前言 一 OSPF是什么 仔细说一下 二 聊
  • 一小时入门Python爬虫,连我都会了!Python爬取租房数据实例

    一 什么叫爬虫 爬虫 又名 网络爬虫 就是能够自动访问互联网并将网站内容下载下来的程序 它也是搜索引擎的基础 像百度和GOOGLE都是凭借强大的网络爬虫 来检索海量的互联网信息的然后存储到云端 为网友提供优质的搜索服务的 二 爬虫有什么用
  • 【算法系列篇】二分查找——这还是你所知道的二分查找算法吗?

    文章目录 前言 什么是二分查找算法 1 二分查找 1 1 题目要求 1 2 做题思路 1 3 Java代码实现 2 在排序数组中查找元素的第一个和最后一个位置 2 1 题目要求 2 2 做题思路 2 3 Java代码实现 3 搜索插入位置
  • USB MSC类存储设备及FatfsR0.14移植

    USB MSC类存储设备及FatfsR0 14移植 效果演示 配置说明 USB MSC类配置 FatFs移植 FatFs的配置 驱动接口 FatFs测试 USB MSC驱动接口完善 效果演示 这里演示了 FatFs挂载SPI Flash设备
  • java中的锁(基础篇)

    乐观锁和悲观锁 悲观锁 适合写操作多的场景 先加锁可以保证写操作时的数据正确 乐观锁 实际开发 Synchronized关键字 悲观锁 加了后同一时间有且只有一个线程可以进入锁内 1 修饰实例方法 作用于当前实例对象加锁 进入同步代码前要获
  • ReinHard颜色迁移

    看到颜色迁移 觉得还蛮有意思的 遂简单看了一下 代码实现好像有错误 但是不知道错误出在哪里 算法参考 https blog csdn net sin geek article details 22443537 https blog csdn
  • SD卡的控制方法与时序

    1 1 SD卡的命令格式 SD卡的指令由6字节 Byte 组成 如下 Byte1 0 1 x x x x x x 命令号 由指令标志定义 如CMD39为100111即16进制0x27 那么完整的CMD39第一字节为01100111 即0x2