数码产品协议

深入理解SD卡:协议

2017-09-22  本文已影响0人  发仔很忙

Overview

深入理解SD卡系列文章将介绍SD卡,涉及SD卡的协议及驱动代码。我们学习SD卡目的是为了理解SD卡的驱动代码,修改它,最终解决工作中遇到的SD卡相关的问题。本系列文章的目标是理解SD,包括协议和驱动代码。在学习任何设备驱动时,有个东西我们是无法绕过的,那就是协议,本文讲的就是SD卡的协议。

学习SD卡协议,可以让我们更好的了解SD卡的运作机制。在最开始学习SD卡的时候,我们只需要对SD卡的协议有个大概了解,能基本满足我们看懂SD卡驱动代码就行。如果之后在阅读SD卡驱动代码有不理解的地方,可以回过头来翻翻SD协议文档。建议在读SD驱动源码和学习SD卡协议之间交替进行,互相验证。

关于SD卡,有个叫SD卡协会的组织,这个组织规定了各种涉及SD卡的协议,并发布协议文档。这些SD卡协议文档,最重要的有两种文档:SD Specifications Part 1 Physical Layer Simplified Specification 和SD Specifications Part A2 SD Host Controller Simplified Specification。

个人理解,定协议的目的就是为了使某个事物标准化,标准化后,可以方便大家协作,简化工作量,提高效率,避免重复工作导致的浪费。Physical Layer Simplified Specification(以下简称:卡协议)规定了SD卡的物理规格和SD卡使用的命令协议,像Sandisk、Kingston这类SD卡制造商必须遵守该协议。假设Sandisk开发了一款SD卡没有遵循该协议,而是自己内部新搞了一套协议,这样市面上就没有设备能使用该款SD卡。除非有人专门开发一个驱动去适配该款SD卡,但是这样很浪费人力。如果每个SD卡厂商都使用自己的协议,那么每支持一款SD卡,都需要重新写一套代码去适配它,那这工作量就很恐怖了。

类似的,SD Host Controller Simplified Specification(以下简称:主机协议)用来标准化SD主机控制器,针对的是SD卡主机控制器厂商。这个协议不是强制的,在我们阅读SD驱动代码的时候,如果涉及到SD卡主机控制的代码,我们可能需要翻一下这篇文档,或者查阅SD卡主机控制器厂商提供给我们的文档(一般都是各大cpu芯片厂商提供给我们开发者文档)。

本文的讲解的是卡协议,接下来,会有一些的英文夹杂在中文里面,因为有些名词,还是原汁原味的好,我翻译出来,没了那种韵味,水平有限,望大家谅解。

System Features

本大章节讲解SD的一些基本特征,包括SD卡的物理规格、容量、速度等方面。

Form-factor

目前市面上按物理规格来看,常见的SD卡有三种:

本文中,如果我说SD卡,都是泛指这三类SD卡,除非特意说明。并且如果特指,我会使用标准SD卡或者TF卡等名称代替。

Capacity of Memory

SD卡按容量(Capacity)分类,可以分为标准容量卡、高容量卡,扩展容量卡,详细如下:

  1. Standard Capacity SD Memory Card (SDSC): 这种卡容量小于等于2GB
  2. High Capacity SD Memory Card (SDHC): 这种卡容量大于2GB,小于等于32GB
  3. Extended Capacity SD Memory Card (SDXC):这种卡容量大于32GB, 小于等于2TB

如果你买了一张16G或者32G的SD卡,你会发现SD卡上面印有"HC"字样,代表该卡是SDHC卡,同理,64G的SD卡上面印着"XC",表示SDXC卡。

Voltage range

SD卡按供电范围划分,分两种:

  1. High Voltage SD Memory Card: 操作的电压范围在2.7-3.6V
  2. UHS-II SD Memory Card: 操作的电压范围VDD1: 2.7-3.6V, VDD2: 1.70-1.95V

UHS-II类型的卡参考协议文档: SD Specifications Part 1 UHS-II Simplified Addendum

Bus Speed Mode (using 4 parallel data lines)

SD卡按总线速度模式来分,有下面几种:

  1. Default Speed mode: 3.3V供电模式,频率上限25MHz,速度上限 12.5MB/sec
  2. High Speed mode: 3.3V供电模式,频率上限50MHz,速度上限 25MB/sec
  3. SDR12: UHS-I卡, 1.8V供电模式,频率上限25MHz,速度上限 12.5MB/sec
  4. SDR25: UHS-I卡, 1.8V供电模式,频率上限50MHz,速度上限 25MB/sec
  5. SDR50: UHS-I卡, 1.8V供电模式,频率上限100MHz,速度上限 50MB/sec
  6. SDR104: UHS-I卡, 1.8V供电模式,频率上限208MHz,速度上限 104MB/sec
  7. DDR50: UHS-I卡, 1.8V供电模式,频率上限50MHz,性能上限 50MB/sec
  8. UHS156: UHS-II RCLK Frequency Range 26MHz - 52MHz, up to 1.56Gbps per lane.

SDR(Single Date Rate), 一个周期只能采集一次数据,即一个bit,由于SD卡是4条数据线并行传输,所以一个周期能传输4bit,如果频率是50MHz(即1秒传输次数为50 000 000),那么1秒能传输的数据量为25MB(这里1MB为1 000 000 Byte)。所以这就是为什么各种SDR模式里面,频率上限是速度上限的两倍。而对于DDR(Double Data Rate),在时钟上升沿和下降沿都可以采集数据,也就是单一周期内可读取或写入2次,因此4条并行数据线在一个周期内能传输8bit。

Speed Class

SD卡按照读写性能划分,有5种规格,每种规格后面的数字象征最小的读写速度:

厂商卖的SD卡上面基本上都会印着一个用圆圈包围起来的数字10,表示该卡是Class 10 类型的卡。

Bus Protocol

在SD Bus上,有三种transaction:

不管Command,还是Response或者Data,都开始于一个start bit (bit值0),结束于一个end bit(bit值1)。

关于这块的内容不做过多解释了,详情自行阅读"Physical Layer Simplified Specification Version 4.10"文档 "3.6 Bus Protocl" 章节的内容。

Registers

下图是SD卡的体系架构,可以看到内部包含了一系列的寄存器:

<div style="text-align:center" markdown="1">


SD Memory Card Architecture

</div>

各个寄存器的详细信息如下:

SD Memory Card Registers

OCR register

OCR寄存器保存着SD卡的工作电压范围。如果OCR寄存器的某位为1,表示卡支持该位对应的电压。最后一位表示卡上电后的状态(是否处于”忙状态”),如果该位为0,表示忙,如果为1,表示处于空闲状态。

OCR Register Definition

CID register

CID是一个128 bits的寄存器,该寄存器包含一个卡的标识信息。

The CID Fields

CSD Register

卡的描述数据寄存器(CSD)包含了访问该卡数据时的必要配置信息,比如the data format, error correction type, maximum data access time, device size 等等。

The CSD Register Fields (CSD Version 2.0)

RCA register

卡的相对地址,该16位卡地址寄存器保存了卡在识别过程中发布的地址。该地址用于在主机识别卡后,利用该地址与卡进行通信。该寄存器只有在SD模式下才有效。

SCR register

SD配置寄存器提供SD卡的特殊特性信息,其大小为64位。该寄存器由厂商编程,主机不能对它进行编程。

The SCR Fields

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初始化的命令序列流程。

Command Sequence to Use UHS-I

SD Memory Card Functional Description

对SD卡与主机(host)来说,有两种操作模式:

Card identification mode

Operating Condition Validation

SD卡识别模式流程图如下:

SD Memory Card State Diagram (card identification mode)
  1. 在主机与卡通信之前,主机不清楚卡支持的电压范围,并且卡也不知道是否支持主机提供的供电电压。主机会以默认电压发送一个reset指令(CMD0),并且主机默认卡能支持该命令。然后,为了确认电压,主机接下来会发送一个CMD8命令。

  2. 为了验证SD卡接口的操作条件,主机通过发送SEND_IF_COND (CMD8)命令,去获取SD卡支持的工作电压范围。SD卡通过检测CMD8的参数部分来检查主机使用的工作电压,主机通过分析卡CMD8的response参数来确认SD卡是否可以在所给电压下工作,如果SD卡可以在指定电压下工作,则它的response里面会包含cmd8参数里面提供的电压 。如果不支持所给电压,则SD卡不会给出任何响应信息,并继续处于IDLE状态。如果要初始化SDHC和SDXC,在第一次发送ACMD41命令前,必须先发送CMD8。

  3. SD_SEND_OP_COND (ACMD41)命令来识别或者拒绝不匹配host主机供电电压范围的卡。如果SD卡在主机规定的电压范围内不能实现数据传输,卡将放弃下一步的总线操作而进入不活动状态(Inactive State)。

  4. 主机发送ACMD41命令时,可以通过将该命令所带的OCR参数设置为0,用来查询卡支持的工作电压范围。当ACMD41被用于查询时,卡将忽略掉ACMD41里面的HCS参数。主机在查询到卡的工作电压后,也许会将该电压作为接下来发送的ACMD41命令的参数。

  5. 在整个初始化过程中,主机不允许改变正在操作的电压范围。

Card Initialization and Identification Process

Card Initialization and Identification Flow (SD mode)
  1. 当总线被激合后,主机就开始处理卡的初始化和识别。在主机发送SD_SEND_OP_COND(ACMD41)命令开始处理SD卡初始化时,主机会在ACMD41的参数中设置它的操作条件和设置OCR中的HCS位。HCS位被设置为1表示主机支持SDHC或者SDXC。HCS被设置为0表示主机不支持SDHC和SDXC。

  2. 卡利用OCR里面的busy位来通知主机ACMD41的初始化已经完成。如果busy位为0,表示卡还在初始化,如果busy位为1,说明初始化已经完成。主机会在1s的时间内,重复不断地发送ACMD41命令,直到busy位被置1为止。卡只有在第一次收到设置电压的ACMD41命令时,才会去检查操作条件和OCR中的HCS位。并且在重复发送ACMD41命令的这段时间里,主机不应该发送任何命令,除了CMD0。

  3. 如果卡能正确响应CMD8,之后,卡对ACMD41命令的响应会包含一个CCS字段,CCS在卡返回ready时(busy位置1)有效。CCS=0表示卡是SDSC,CCS=1表示卡是SDHC或者SDXC。

  4. 在ACMD41之后,主机会发送 ALL_SEND_CID (CMD2),获取卡的CID。在卡发送它的CID之后,卡进入识别状态(Identification State)。

  5. 接着,主机发送CMD3 (SEND_RELATIVE_ADDR),请求卡发布卡的RCA。RCA是一个比CID短的,并且将来在数据传输模式中使用的地址。

Data Transfer Mode

因为一些卡在识别模式(Identification Mode)下,对操作频率有限制,所以在识别模式结束前,主机的频率需要一直保持在 fOD。在数据传输模式(Data Transfer Mode),主机频率在fpp范围内是可执行的。

主机必须发送SEND_CSD(CMD9)来获得卡规格数据寄存器(CSD)内容,获取像块大小、卡容量这类信息。

SET_DSR(CMD4)广播命令配置所有识别到的卡的驱动阶段。它对DSR寄存器进行编程以适应应用的总线布局(长度)、总线上卡的数目和数据传输频率。clock rate也是在这个时候从fOD切到fpp。对卡和主机来说,SET_DSR(CMD4)命令是个可选。

CMD7用于选择卡,并且将卡带入传输状态(Transfer State)。在同一个时间内,只有一张卡能进入传输状态。当发送的CMD7的RCA地址参数为"0x0000",所有卡将跳回到准备状态(Stand-by State )。

SD卡数据传输模式的流程图如下:

SD Memory Card State Diagram (data transfer mode)

对已经拥有RCA的卡来说,对它发送identification commands(比如ACMD41、CMD2),它将不会有任何回应。在数据传输模式下,主机与被选中的卡(使用定向命令)之间的数据传输都是点对点的。通过cmd线,所有定向命令(addressed commands)都会收到一个用于确认的response。

下面是数据传输模式下关于数据传输的一些总结:

至此,本文关于SD卡协议的内容就介绍到这里。通过本文,可以对SD卡有个大概的了解,尤其是关于SD卡初始化这段内容。就SD卡协议这方面来说,了解一些基本的东西就行。在我们今后在遇到SD问题时需要时,可以翻出来看一下。水平有限,有些地方可能会出现错误,望各位能指出来,希望能和各位共同探讨技术方面的内容。

上一篇 下一篇

猜你喜欢

热点阅读