SD卡学习

时间:2024-03-26 13:57:17

作者:发仔很忙
链接:https://www.jianshu.com/p/6272e4cb1eeb

Form-factor
目前市面上按物理规格来看,常见的SD卡有三种:
标准的SD卡,这种卡比较大,在有些相机或者PC电脑上会使用;
第二种是miniSD,这种卡我没怎么使用,不作详述;
最后一种是叫TF卡,也称mirco SD,这种卡比较小,是我们最常接触的,像我们的手机里面使用的就是这种卡。很多人基本上都管我们手机使用的那种卡叫SD卡,这样的叫法实际上不够准确,更准确应该是叫TF卡,但是不管怎样,都没人会去计较,能理解就行。
本文中,如果我说SD卡,都是泛指这三类SD卡,除非特意说明。并且如果特指,我会使用标准SD卡或者TF卡等名称代替。

Capacity of Memory
SD卡按容量(Capacity)分类,可以分为标准容量卡、高容量卡,扩展容量卡,详细如下:
Standard Capacity SD Memory Card (SDSC): 这种卡容量小于等于2GB
High Capacity SD Memory Card (SDHC): 这种卡容量大于2GB,小于等于32GB
Extended Capacity SD Memory Card (SDXC):这种卡容量大于32GB, 小于等于2TB
如果你买了一张16G或者32G的SD卡,你会发现SD卡上面印有"HC"字样,代表该卡是SDHC卡,同理,64G的SD卡上面印着"XC",表示SDXC卡

Voltage range
SD卡按供电范围划分,分两种:
High Voltage SD Memory Card: 操作的电压范围在2.7-3.6V
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卡按总线速度模式来分,有下面几种:

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.
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。

Registers
下图是SD卡的体系架构,可以看到内部包含了一系列的寄存器:
SD卡学习
SD卡学习
CID register
CID是一个128 bits的寄存器,该寄存器包含一个卡的标识信息。
SD卡学习
RCA register
卡的相对地址,该16位卡地址寄存器保存了卡在识别过程中发布的地址。该地址用于在主机识别卡后,利用该地址与卡进行通信。该寄存器只有在SD模式下才有效

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

SD卡学习
OCR register
OCR寄存器保存着SD卡的工作电压范围。如果OCR寄存器的某位为1,表示卡支持该位对应的电压。最后一位表示卡上电后的状态(是否处于”忙状态”),如果该位为0,表示忙,如果为1,表示处于空闲状态
SD卡学习
SCR register
SD配置寄存器提供SD卡的特殊特性信息,其大小为64位。该寄存器由厂商编程,主机不能对它进行编程。
SD卡学习
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初始化的命令序列流程
SD卡学习
上电后,卡会处于3.3V signaling模式下。第一个CMD0命令会选择bus模式:SD模式或者SPI模式。只有在SD模式下,才能进入1.8V signaling模式。一旦卡进入1.8V signal模式,卡不能切换到SPI模式或者3.3V signal模式,除非重新上电。
收到CMD0命令后,卡将进入空闲状态(Idle state),但是仍然工作在SDR12时序下。UHS-I只提供了SD模式,没有提供SPI模式。
由于更高的总线速度需要低水平的signaling,对SDR50、DDR50和SDR104模式,UHS-I提供的signaling为1.8V。host会给卡提供3.3V的电压,并且提供1.8V signaling水平的电压给SDCLK、CMD和DAT[3:0]线,这几个都是从3.3V的电源线转换过来的。为了避免主机与卡之间的电压不匹配,signaling水平在初始化时的电压转换序列中就已经被改变了。主机和卡通过ACMD41命令来确认双方是否支持1.8V signaling模式。如果主机和卡都支持1.8V signaling模式,这就意味着UHS-I卡可用。
UHS-I只能使用4-bit的bus模式,CMD42是个例外。如果卡被锁住了,就需要通过发送CMD42命令(1-bit模式)解锁,然后发送ACMD6命令将bus模式切换到4-bit。
在卡解锁的情况下,CMD19命令执行在1.8V signaling的传输状态。其他情况,CMD19都会被当做非法命令

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

Card identification mode: 对卡reset重置后,主机进入卡识别模式,对卡来说,在reset后,除非收到CMD3命令,否则卡一直处于该模式下。
Data transfer mode: 当卡第一次发布它的RCA后,该卡将处于数据传输模式。而对主机来说,在它识别了bus线上的所有卡后,进入该模式。
Card identification mode
Operating Condition Validation

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

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

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

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

在整个初始化过程中,主机不允许改变正在操作的电压范围。
Card Initialization and Identification Process
SD卡学习
当总线被激合后,主机就开始处理卡的初始化和识别。在主机发送SD_SEND_OP_COND(ACMD41)命令开始处理SD卡初始化时,主机会在ACMD41的参数中设置它的操作条件和设置OCR中的HCS位。HCS位被设置为1表示主机支持SDHC或者SDXC。HCS被设置为0表示主机不支持SDHC和SDXC。

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

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

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

接着,主机发送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卡学习
下面是数据传输模式下关于数据传输的一些总结:

在任何时候,所有的读命令集在执行过程中都可以被stop command (CMD12)打断。cmd12命令将会使数据传输终止,并且使卡退回到传输状态(Transfer State)。读命令集包括:block read(CMD17), multiple block read(CMD18), send write protect(CMD30), send SCR(ACMD51) 和 general command in read mode (CMD56)。
在任何时候,所有的写命令集在执行过程中都可以被stop command (CMD12)打断。写命令集包括: block write(CMD24 and CMD25), program CSD(CMD27), lock/unlock command(CMD42)和general command in write mode(CMD56)。
一旦数据传输完成,卡就会退出数据写状态,并且进入正在编程状态(Programming State)(传输成功),或者进入传输状态(传输失败)。
如果一个块写操作被打断,但是最后一个block的块长度和CRC有效的话,这块数据也将会被编程到卡里。
卡也许会对块写操作提供缓存,这意味着,在一个block还在被编程的情况下,下一个block可以被发送这个卡里面。如果所有的写缓存都已经满了的话,只要卡还在正在编程状态,DAT0线就会一直保持在拉低状态。
对写CSD、写保护和擦除操作来说,卡不会提供缓存。这意味着,在卡正忙于处理这其中任何一个命令时,卡不会接收任何发送到卡的数据。只要卡还在忙,DAT0线就会拉低,并且处于正在编程状态(Programming State)。
当卡正在编程时,不允许任何一个参数设置命令集(Parameter set commands)。参数设置命令集包括: set block length(CMD16), erase block start(CMD32)和erase block end(CMD33)。
当卡正在编程时,不允许任何一个读命令集。
当将其他的卡从准备状态(Stand-by)切换到传输状态(使用CMD7),不会中断当前卡的擦除或者编程操作。当前卡将会切换到断开状态(Disconnect State),并且释放数据线。
当卡正在编程或者待编程时,对其重置(发送CMD0或者CMD15),将会导致操作终止,并且可能会导致卡内的数据内容被破坏。因此主机有责任去禁止这样的操作