SD协议简介_sdr104-程序员宅基地

技术标签: 学习  

前言

Only整理我关心的内容,相当于笔记、便于后期回顾温习,部分图文转载自SD2.0协议详解:命令格式、初始化/读取/写入  ”。更多资料请阅读文后链接。

总结:

  1. SD协议与EMMC协议,其基本指令功能是一样的;特殊指令ACMD是SD专用。
  2. SD Card的初始化与EMMC Card初始化存在区别
  3. SD Card读写访问流程与EMMC Card基本一样

速率与电压:

UHS SDR12 SDR25 SDR50 SDR104 DDR50

  • 12/25是SD 2.0的速率模式
  • 50/104是SD 3.0的速率模式
Default Speed mode: 3.3V供电模式,频率上限25MHz,速度上限 12.5MB/sec
High Speed mode: 3.3V供电模式,频率上限50MHz,速度上限 25MB/sec
SDR12: UHS-I卡, 1.8V供电模式,频率上限25MHz,速度上限 12.5MB/sec
SDR25: UHS-I卡, 1.8V供电模式,频率上限50MHz,速度上限 25MB/sec
SDR50: UHS-I卡, 1.8V供电模式,频率上限100MHz,速度上限 50MB/sec
SDR104: UHS-I卡, 1.8V供电模式,频率上限208MHz,速度上限 104MB/sec
DDR50: UHS-I卡, 1.8V供电模式,频率上限50MHz,性能上限 50MB/sec
UHS156: UHS-II RCLK Frequency Range 26MHz - 52MHz, up to 1.56Gbps per lane.


 

目录

前言

概述

1. SDIO 总线引脚定义

 1.1 时钟要求

2 协议

 2.1 CMD与ACMD

2.2 寄存器一览

2.3 响应格式

2.4  数据格式

2.4.1 数据块

2.4.2 读写模式

2.5 CRC

2.5.1 CRC Token

5.1.2 CRC7 和 CRC16 的计算

2.6 命令

3 Program Flow

3.1 卡初始化流程

3.2 数据传输流程

参考


概述

简要介绍 SD2.0 协议,包括如何初始化卡、读卡、写卡。

另外,本文也可以作为 SD2.0 Specification 的导读。

        SD卡是一种用闪存 (flash) 实现的便携式存储卡。目前已经发展出了不同的代数和规格,按照不同的指标分类如图1。目前最常用的仍然是图1最左侧的 SD 和 SDHC,它们都遵循 SD 2.0 协议。

 感兴趣的读者可以去了解:一个基于 FPGA 的纯 RTL 的 SD 卡读取器:

GitHub - WangXuan95/FPGA-SDcard-Reader: An FPGA-based SD-card reader to read files from FAT16 or FAT32 formatted SD-cards. 基于FPGA的SD卡读取器,可以从FAT16或FAT32格式的SD卡中读取文件。icon-default.png?t=N7T8https://github.com/WangXuan95/FPGA-SDcard-Reader

1. SDIO 总线引脚定义

 1.1 时钟要求

2 协议

 2.1 CMD与ACMD

命令有两种:

  • CMD (普通CMD),比如CMD2, CMD8等。
  • ACMD (Application-Specific Command) 。

而 ACMD 则由 sdcmd 信号线上的两次命令-响应构成,如图7(b),第一次是 CMD55,第二次的命令就会被解读为 ACMD ,例如这里的 CMD41 就被解读为 ACMD41 。

2.2 寄存器一览

card 内部会维护如图8所示的各种寄存器。如果我们只想简单地进行初始化和读写,只需要关注 CSR, OCR, RCA 这三个寄存器。

2.3 响应格式

  • R1响应: 常规响应,48bit,与命令格式相似。其中 [45:40] 应该填充与命令相同的命令号 (命令的命令号是什么,响应里就填充什么) 。[39:8] 位应该填充卡状态 (CSR) 寄存器,实时显示卡的状态。CRC7是校验码的计算类似命令格式,与命令格式类似,需要根据响应的 [47:8] 位来计算。
  • R6响应: 仅针对 CMD3 的响应,48bit。与 R1 响应格式相似,唯一的不同在于 [39:8] 位的不同。[39:24] 位是卡建议的 RCA 。[23:8] 位填充的是较短形式的 CSR 寄存器,只包括了 {CSR[23:22], CSR[19], CSR[12:0]} 。
  • R7响应: 仅针对 CMD8 的响应,48bit。与 R1 响应格式相似,唯一的不同在于 [39:8] 位的不同。
  • R3响应: 仅针对 ACMD41 的响应,48bit。与 R1 响应格式相似,不同之处在于 [45:40] 不填充命令号,而是填充 111111 。[7:1] 不填充 CRC7 ,而是填充 1111111 。[39:8] 填充 OCR 寄存器。
  • R2响应: 仅针对 CMD2, CMD9 的响应,总长度136bit,用来向主机返回 CID 和 CSD 寄存器。其中 CID 和 CSD 寄存器长度为 120bit (不算所谓的内部CRC),被填充在R2的 [127:8] 位。而 [7:1] 填充 CRC7,需要根据 R2 响应的 [135:8] 位来计算。

SD2.0 Specification 中还提到一种响应叫 R1b 响应,R1b是一种特殊的R1,除了同样在 sdcmd 上响应以外,card 还会在 sddat0 上发送一个可选的 busy 信号。根据卡在接收命令之前的状态,卡在接收到这些命令后可能会变得繁忙,并发送 busy 信号,主机应检查是否忙。

2.4  数据格式

2.4.1 数据块

块 (block) 就是硬盘中的扇区 (sector) 的概念。习惯上把任何硬盘 (机械硬盘、固态硬盘、SD卡等) 都分为多个 512B 的扇区,第0个扇区的地址为 0x0000, 第1个扇区的起始地址为 0x0200, ……

2.4.2 读写模式

 SD 卡的读写数据 分为 Standard Bus (窄总线模式) 和 Wide Bus (宽总线模式) 两种模式:

  • 窄总线模式:只使用 sddat0 线传输数据,传输的比特速率=时钟频率。SD卡上电时默认是窄总线模式。
  • 宽总线模式:使用 sddat0~3 四根线传输数据,传输的比特速率=4×时钟频率。需要使用 ACMD6 命令 (SET_BUS_WIDTH) 开启或关闭。

SD 卡的读写都以 512B 的块 (block) 为单位。如图14分别是窄总线模式和宽总线模式下传输一块的位格式,对于两个方向 (读或写) 都适用。

2.5 CRC

2.5.1 CRC Token

host 发送完数据块 2 周期后,card 在 sddat0 上会反馈一个 CRC status 包,而 sddat1~3 这段时间内应该闲置)。

CRC status 包中包括 3-bit 的 CRC status,

  • 若为 010 说明 card 检测到之前 sddat 上传输的 CRC 校验成功;
  • 若为 101 说明 card 检测到 CRC 校验失败。
  • 若host非法操作(例如没有发送CMD24命令就直接在sdcmd上发送数据块),则card不会返回 CRC status 包,host 会读到 111 。

CRC status 发送完后,card 可能会立即发送一个 busy 包,busy 包持续把 sddat0 拉低,说明 card 正在把该块写入 (program) 到 flash 。当写入完成时,card 释放 sddat0 ,sddat0 恢复高电平(弱上拉) ,此时host 才能开始发送下一个命令。

5.1.2 CRC7 和 CRC16 的计算

2.6 命令

  • "bc" : 广播命令,无需响应。广播是指如果SD总线上挂了多张 SD 卡,该命令会在所有卡上生效。本文只考虑 host 连接一张卡的情况。
  • "bcr" : 广播命令,需要响应。
  • "ac" : 非广播 (点对点) 命令,需要响应。只对选中的卡生效 (注: CMD7负责选中/解除选中一张卡) 。
  • "adtc" : 非广播 (点对点) 命令,需要响应。另外还导致 sddat 上的数据传输。例如读命令 (CMD17) 。

3 Program Flow

3.1 卡初始化流程

(1)时钟

上电后,主机需要持续在 sdclk 上发送时钟,频率在范围 100kHz~400kHz 内 (卡初始化阶段要求的时钟频率) 。在图20的流程走完之前都不能提高到 25MHz 

 (2)发送CMD0复位

时钟稳定持续一段时间 (比如几毫秒) 后,host 发送 CMD0 命令,命令的 argument 字段取 0x00000000 (填充位) 。在这个过程中还需要保持 sddat3 信号为高电平,保证 SD 卡进入 SDIO 总线模式而不是 SPI 模式 (如果 sddat3 上有上拉电阻,则不需要特殊处理,否则需要 host 把 sddat3 强驱动到高电平) 。

(3)发送CMD8鉴别 SD1.X 和 SD2.0

host 发送 CMD8 命令并等待响应,命令的 argument 字段一般取 0x000001AA ,代表 VHS 字段=0x1 (2.7~3.6V) ,check pattern=0xAA 。如果 CMD8 超时没有响应 (超时的判断方法会在第9节讲) ,则要么提供的电压和 SD 卡要求的电压不匹配,要么是 SD 1.X 卡。如果有响应 (R7响应) ,则认为是 SD 2.0 卡。

(4) 发送ACMD41

发送 ACMD41 命令,命令的 argument 字段要取 0x40100000 ,根据图15,其含义是 HCS=1 (代表主机支持大容量卡 SDHC) ,VDD Voltage Window (OCR[23:0]) = 0x100000

ACMD41 会返回 R3 类型的响应 (如图13) ,其中包含了 OCR 寄存器。对 OCR 寄存器的说明见第 4.3 节。host 需要检查 OCR[31] 是否位 1 。如果不为 1 ,说明卡尚未上电,需要不断轮循发送 ACMD41 直到 OCR[31]=1 为止。当 OCR[31]=1 时,OCR[30] (CCS) 指示了卡是否为大容量卡。

结合之前 CMD8 的结果,可以区分出卡的三种类型:

  • CMD8 无响应,ACMD41 响应的 OCR[30]=0 :SD 1.X 卡。
  • CMD8 有响应,ACMD41 响应的 OCR[30]=0 :SD 2.0 非大容量卡。
  • CMD8 有响应,ACMD41 响应的 OCR[30]=1 :SDHC 2.0 非大容量卡。

(5)发送 CMD2 : 获取CID寄存器

host 发送 CMD2 命令并等待响应,命令的 argument 字段取 0x00000000 (填充位) 。card 会返回 R2 类响应,其中包含了 CID 寄存器 (如图13) ,是该卡的识别号,host 可以忽略 CID 的内容。

(6)发送 CMD3 : 要求card指定一个RCA

host 发送 CMD3 命令并等待响应,命令的 argument 字段取 0x00000000 (填充位) 。card 会返回 R6 类响应,其中包含了卡指定的 RCA (16bit) ,这是卡自荐的地址,host 需要保存下来以便后续使用 CMD7 来选中此卡。

至此,SD卡初始化完成。进入 data transfer mode ,此时可以把时钟频率提高到最高 25MHz 

3.2 数据传输流程

(1) 选中卡 (CMD7)

进入 data transfer mode 后的第一步一般是使用 card 指定的 RCA 来选中它。host 发送 CMD7 命令并等待响应,其中命令的 argument 字段的高 16bit 应该取 RCA ,而低 16bit 取 0x0000 (填充位) 。card 会响应 R1 。如图21,CMD7会让卡从 Standby State (未选中) 跳转到 Transfer State (选中) 。

(2) 设置 block length (CMD16)

选中卡后,host 发送 CMD16 命令并等待响应,其中命令的 argument 字段应该取 0x00000200 ,代表 host 指定 block length=512B (0x200) ,也即一个硬盘扇区的大小。一般来说不能设定为其它值。

至此,SD卡读写前的所有准备工作完成。

(3)SD卡读写 (CMD17, CMD18, CMD24, CMD25)

SD卡的读写命令包括单块读 (CMD17), 多块读 (CMD18), 单块写 (CMD24), 多块写 (CMD25) 。它们的 argument 都是 32 位的要读/写的地址,分两种情况处理:

  • 对于 SD 1.X 和 SD2.0 非大容量卡,argument 要填字节地址。例如,要读/写第0个扇区,argument 应该填充 0x00000000 ;要读/写第1个扇区,argument 应该填充 0x00000200 ;要读/写第2个扇区,argument 应该填充 0x00000400 ……
  • 对于 SDHC 2.0 大容量卡,argument 要填扇区地址。例如,要读/写第0个扇区,argument 应该填充 0x00000000 ;要读/写第1个扇区,argument 应该填充 0x00000001 ;要读/写第2个扇区,argument 应该填充 0x00000002 ……

CMD17, CMD18, CMD24, CMD25 的响应都是 R1 ,其中会携带 CSR 寄存器。

CMD17, CMD18, CMD24, CMD25 还会导致 sddat 上的动作,其大致的时序见之前的图6(c)(d)(e)(f),而 sddat 上的位格式在之前 5.3 节讲过。下文第9节会细化其具体时序要求。

4 UHS

UHS(Ultra High Speed)是与SDXC同时推出的SD卡总线标准。此标准适用于SDHC和SDXC。

UHS-I最高传输速度(理论值)为104MB/s。英文字母I代表该设备(SD卡或读卡器)支持UHS-I接口。英文字母U,包含数目字1,代表该设备读写速度达U1。

UHS-II最高传输速度达312MB/s,是UHS-I的三倍。

设备(如智能手机)必须支持UHS,才能保证达到U1或U3最低写入速度。

下面介绍UHS-I初始化的命令序列流程。

参考

1、作者 博文
SD2.0协议详解:命令格式、初始化/读取/写入
深入理解SD卡:协议
SD卡通识篇 - 知乎 (zhihu.com)
09-sd卡的电压切换_sd卡cmd11
嵌入式中SD卡接口电路设计_sd卡输出电流
SD卡命令详解
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_22168673/article/details/129830610

智能推荐

生活垃圾数据集(YOLO版)_垃圾回收数据集-程序员宅基地

文章浏览阅读1.6k次,点赞5次,收藏20次。【有害垃圾】:电池(1 号、2 号、5 号)、过期药品或内包装等;【可回收垃圾】:易拉罐、小号矿泉水瓶;【厨余垃圾】:小土豆、切过的白萝卜、胡萝卜,尺寸为电池大小;【其他垃圾】:瓷片、鹅卵石(小土豆大小)、砖块等。文件结构|----classes.txt # 标签种类|----data-txt\ # 数据集文件集合|----images\ # 数据集图片|----labels\ # yolo标签。_垃圾回收数据集

天气系统3------微服务_cityid=101280803-程序员宅基地

文章浏览阅读272次。之前写到 通过封装的API 已经可以做到使用redis进行缓存天气信息但是这一操作每次都由客户使用时才进行更新 不友好 所以应该自己实现半小时的定时存入redis 使用quartz框架 首先添加依赖build.gradle中// Quartz compile('org.springframework.boot:spring-boot-starter-quartz'..._cityid=101280803

python wxpython 不同Frame 之间的参数传递_wxpython frame.bind-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏8次。对于使用触发事件来反应的按钮传递参数如下:可以通过lambda对function的参数传递:t.Bind(wx.EVT_BUTTON, lambda x, textctrl=t: self.input_fun(event=x, textctrl=textctrl))前提需要self.input_fun(self,event,t):传入参数而同时两个Frame之间的参数传..._wxpython frame.bind

cocos小游戏开发总结-程序员宅基地

文章浏览阅读1.9k次。最近接到一个任务要开发消消乐小游戏,当然首先就想到乐cocosCreator来作为开发工具。开发本身倒没有多少难点。消消乐的开发官网发行的书上有专门讲到。下面主要总结一下开发中遇到的问题以及解决方法屏幕适配由于设计尺寸是750*1336,如果适应高度,则在iphonX下,内容会超出屏幕宽度。按宽适应,iphon4下内容会超出屏幕高度。所以就需要根据屏幕比例来动态设置适配策略。 onLoad..._750*1336

ssm435银行贷款管理系统+vue_vue3重构信贷管理系统-程序员宅基地

文章浏览阅读745次,点赞21次,收藏21次。web项目的框架,通常更简单的数据源。21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确、快速、完善,并能提高工作管理效率,促进其发展。论文主要是对银行贷款管理系统进行了介绍,包括研究的现状,还有涉及的开发背景,然后还对系统的设计目标进行了论述,还有系统的需求,以及整个的设计方案,对系统的设计以及实现,也都论述的比较细致,最后对银行贷款管理系统进行了一些具体测试。_vue3重构信贷管理系统

乌龟棋 题解-程序员宅基地

文章浏览阅读774次。题目描述原题目戳这里小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。乌龟棋的棋盘是一行 NNN 个格子,每个格子上一个分数(非负整数)。棋盘第 111 格是唯一的起点,第 NNN 格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。乌龟棋中 MMM 张爬行卡片,分成 444 种不同的类型( MMM 张卡片中不一定包含所有 444 种类型的卡片,见样例),每种类型的卡片上分别标有 1,2,3,41, 2, 3, 41,2,3,4 四个数字之一,表示使用这种卡片后,乌龟棋子将向前爬行相应的格子数

随便推点

python内存泄露的原因_Python服务端内存泄露的处理过程-程序员宅基地

文章浏览阅读1.5k次。吐槽内存泄露 ? 内存暴涨 ? OOM ?首先提一下我自己曾经历过多次内存泄露,到底有几次? 我自己心里悲伤的回想了下,造成线上影响的内存泄露事件有将近5次了,没上线就查出内存暴涨次数可能更多。这次不是最惨,相信也不会是最后的内存的泄露。有人说,内存泄露对于程序员来说,是个好事,也是个坏事。 怎么说? 好事在于,技术又有所长进,经验有所心得…. 毕竟不是所有程序员都写过OOM的服务…. 坏事..._python内存泄露

Sensor (draft)_draft sensor-程序员宅基地

文章浏览阅读747次。1.sensor typeTYPE_ACCELEROMETER=1 TYPE_MAGNETIC_FIELD=2 (what's value mean at x and z axis)TYPE_ORIENTATION=3TYPE_GYROSCOPE=4 TYPE_LIGHT=5(in )TYPE_PRESSURE=6TYPE_TEMPERATURE=7TYPE_PRO_draft sensor

【刘庆源码共享】稀疏线性系统求解算法MGMRES(m) 之 矩阵类定义三(C++)_gmres不构造矩阵-程序员宅基地

文章浏览阅读581次。/* * Copyright (c) 2009 湖南师范大学数计院 一心飞翔项目组 * All Right Reserved * * 文件名:matrix.cpp 定义Point、Node、Matrix类的各个方法 * 摘 要:定义矩阵类,包括矩阵的相关信息和方法 * * 作 者:刘 庆 * 修改日期:2009年7月19日21:15:12 **/

三分钟带你看完HTML5增强的【iframe元素】_iframe allow-top-navigation-程序员宅基地

文章浏览阅读1.7w次,点赞6次,收藏20次。HTML不再推荐页面中使用框架集,因此HTML5删除了<frameset>、<frame>和<noframes>这三个元素。不过HTML5还保留了<iframe>元素,该元素可以在普通的HTML页面中使用,生成一个行内框架,可以直接放在HTML页面的任意位置。除了指定id、class和style之外,还可以指定如下属性:src 指定一个UR..._iframe allow-top-navigation

Java之 Spring Cloud 微服务的链路追踪 Sleuth 和 Zipkin(第三个阶段)【三】【SpringBoot项目实现商品服务器端是调用】-程序员宅基地

文章浏览阅读785次,点赞29次,收藏12次。Zipkin 是 Twitter 的一个开源项目,它基于 Google Dapper 实现,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现。我们可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的 REST API 接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序,从而及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源。除了面向开发的 API 接口之外,它也提供了方便的 UI 组件来帮助我们直观的搜索跟踪信息和分析请求链路明细,

烁博科技|浅谈视频安全监控行业发展_2018年8月由于某知名视频监控厂商多款摄像机存在安全漏洞-程序员宅基地

文章浏览阅读358次。“随着天网工程的建设,中国已经建成世界上规模最大的视频监控网,摄像头总 数超过2000万个,成为世界上最安全的国家。视频图像及配套数据已经应用在反恐维稳、治安防控、侦查破案、交通行政管理、服务民生等各行业各领域。烁博科技视频安全核心能力:精准智能数据采集能力:在建设之初即以应用需求为导向,开展点位选择、设备选型等布建工作,实现前端采集设备的精细化部署。随需而动的AI数据挖掘能力:让AI所需要的算力、算法、数据、服务都在应用需求的牵引下实现合理的调度,实现解析能力的最大化。完善的数据治理能力:面_2018年8月由于某知名视频监控厂商多款摄像机存在安全漏洞