首页 > 其他分享 >SD card高速读写记录

SD card高速读写记录

时间:2024-03-18 23:12:30浏览次数:20  
标签:ACMD41 读写 发送 命令 UHS 电压 card SD

苯人原创,排版很差,爱看不看。
SD卡有好几种总线协议,包括SD总线协议,SPI协议,UHS-II协议和PCIe协议。
还有两种接口,一种是八个触点的,这种卡包括低速卡和高速UHS-I卡。另一种是多了几个触点的UHS-II接口,这种是支持更高速的UHS-II协议的高速卡。
注意区分协议和接口以及传输模式。本文主要说一说UHS-I卡。
UHS-I使用开头所述的SD总线协议,此总线有4 bit模式or1 bit模式,接口和老旧的低速卡接口一致。
UHS-I支持两种卡类型:UHS50和UHS104.也就是你所买的UHS-I SD卡会是这两种中的一种。这两种卡的速度不同,具体的我就直接贴图了。
image
上图是时钟频率,如果是SDR(单边沿传输)则传输速率为频率/2(4bit传输,两个时钟传输一个字节),DDR(双边沿)时钟频率就是速率。注意上图电压是信号线的电压,供电电压大部分是3.3v。具体说明如下:
image

传输时序:
image

image
两幅图结合着看。上图是UHS-1初始化流程。
加电后处于等待CMD0(rst)状态。然后发送CMD8命令,查询卡供电电压是否合适。如果合适,则卡会给出一个响应。
接下来发送ACMD41命令。ACMD41命令如下图所示。注意ACMD41命令由CMD55和CMD41拼凑,R1和R3代表响应。下边会详细介绍这个命令。
image

如果上边CMD8查询没反应(电压不匹配),接下来,第一次发送ACMD41时,通过把ACMD41命令参数中的OCR(电压窗口字段)设置为0,主机可以查询卡支持的供电范围,然后把主机修改自己的供电电压后,可以再次发送同样的ACMD41命令,此时卡会进入未激活状态。
如果上边CMD8查询有反应,在供电正常后的初始化过程中,不能修改电压。
第一次发送ACMD41的OCR参数不为0,进入初始化阶段,并且ACMD41的其余参数也都有效。接下来重复发送ACMD41命令,参数保持一致。下图是CMD41命令。

这里的参数设置了支持的卡类型,支持的功率,还有要不要切换到1.8v。我们为了高速,需要切换,因此把这几个bit都置为1.
第36位标识的卡的类型包含如下图:
image
我们一般买的都是SDHC或者SDXC

CMD41的响应如下图:
image
主要有最高位的初始化是否完成,卡的容量状态,以及是否准备好切换信号电压。
一直重复发送ACMD41,直到响应的busy变成1(代表初始化完成),然后检查CCS,UHS-II,S18A。如果S18A变成1了,可以发送电压切换命令CMD11。这里可以参考图X。
image
CMD11命令
CMD11会在命令线返回一个R1响应,表示开始切换电压。切换完成的标志是数据线全部被拉高。如果SD卡电压切换完成,卡会进入SDR12模式。
然后按部就班发送CMD2,CMD3,CMD7,CMD42命令。发送完毕后,然后发送ACMD6命令,用来选择4bit总线宽度。在加电后,默认是1bit。UHS-I只支持4位模式。主机应通过ACMD6选择4位模式。
然后通过ACMD6命令,可以选择传输速度模式,驱动强度。具体的可以看下图。
image
简单来说,每一次发送命令,可以选择一个方框。比如我想设置传输模式为SDR104,那么我应该把命令参数的[3:0]位设置为0x3,其余位设置位0xF(No infulence)。还有需要把mode设置位1,表示是set命令,如果mode=0,表示是get命令。

文中有很多没讲清楚,比如总线宽度怎么切换到4bit,mode位在哪里。主要是它

标签:ACMD41,读写,发送,命令,UHS,电压,card,SD
From: https://www.cnblogs.com/jiaotaiyang/p/18081600

相关文章

  • 通过GroovySDL实现GradleScript
    文章目录Groovy是什么GroovyDependencyDSL是什么初识GroovyDSLClosure,Delegate,Script&ShellCompilationCustomizersDSLStyleCustomizerDSL风格脚本展示Groovy是什么Groovy是一种在JVM上运行的敏捷开发语言Groovy80%的语法和Java完全一致,同时吸取了......
  • 如何突破DRAM对SSD容量提升的限制?
    近日小编看到PureStorage公司的研发高级副总裁肖恩·罗斯马林(ShawnRosemarin)的一个观点“由于DRAM的局限性,固态硬盘(SSD)的容量难以突破30TB”。这个观点不是完全准确,实际上,Solidigm已经发布了最大容量61.44TBQLCSSD。但是,这个观点背后的逻辑依然是业内在提升SSD容......
  • 限流 SDK 的设计与实现
    需求分析请设计一套SDK,用于实现接口限流,针对某个IP对于特定接口方法的单位时间访问次数进行控制。限流算法:滑动窗口可配置项时间窗口限流次数实现思路算法知识补充通过滑动窗口实现限流思想源于计数器(单位时间内数量超过阈值时拒绝请求),但是引入了滑动窗口,相较于......
  • linux中如何查看系统IO读写能力
    Linux系统中的 iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。iostat属于sys......
  • 将博客搬至CSDN
    New·Object将博客搬至CSDN在数字时代的浪潮中,我始终如一地维护着自己的一方网络空间。从最初的个人网站到现在的CSDN博客,每一次的变迁都记录着我的成长与变化。今天,我想和大家分享一下将博客搬迁至CSDN的决定背后的故事,以及这个决定给我带来的一系列连锁反应。记得最初,我的博......
  • Linux Java调用 海康sdk报 Unable to load library '/home/slife/bsmt/HCNetSDK_linux
    1、问题在Linux下java调研libPlayCtrl.so文件失败 解决方案:sudovim~/.bashrc 在该文件末尾追加:exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/slife/bsmt/HCNetSDK_linux64/刷新一下source~/.bashrcok参考链接 https://www.cnblogs.com/kikyoqiang/p/14911373.......
  • 详解GaussDB(DWS)中3个防过载检查项
    本文分享自华为云社区《【防过载检查项】》,作者:譡里个檔。1.GUC参数检查目的:针对不同版本建议设定不同的参数值,当前先检查出来,后续diagnosis会给出建议值SELECTsplit_part((substring(version()from'\((.*)\)')),'',2)ASversion,(EXISTS(SELECT1FROM(S......
  • Arduino RP2040 + SSD1306 I2C OLED +LittleFS存储GBK字库实现中文显示
    ArduinoRP2040+SSD1306I2COLED+LittleFS存储GBK字库实现中文显示......
  • ESP32学习笔记-读取SD卡并显示到屏幕上
    硬件FireBeetle2ESP32-E开发板1.54"240x240 IPS 广视角TFT显示屏硬件接线测试代码//加载库#include"Arduino.h"#include"FS.h"#include"SD.h"#include"SPI.h"#include"DFRobot_GDL.h"//定义显示屏针脚#defineTFT_DCD2#......
  • P3302 [SDOI2013] 森林 题解
    题目链接:森林有意思的树上可持久化线段树变形题,建议先看这个:P2633Countonatree题解对于本题而言,我们重新阐述树上可持久化线段树的核心思想,对于点路径/边路径上的第\(k\)大问题,我们使用树上前缀和问题的思想,将其转化为可差性问题:一条路径上的权值线段树可以拆分为几棵权......