一、SD 存储卡特性介绍
1、存储容量
a、标准容量SD存储卡(SDSC): 不大于2GB
b、大容量SD存储卡(SDHC): 大于2GB、不大于32GB
c、超大容量SD存储卡(SDXC):大于32GB、不大于2TB
2、电压范围
高电压SD存储卡,电压范围为:2.7 ~ 3.6 V
3、SD 存储卡可以用密码保护(CMD42 - LOCK_UNLOCK)
4、标准 SD 存储卡的厚度是 2.1mm 或者 1.4 mm
5、SD 存储卡传输速度分类
a、class-0: 这类卡片不指定性能
b、class-2: 不低于 2MB / s
c、class-4: 不低于 4MB / s
d、class-6: 不低于 6MB / s
e、class-10: 不低于 10MB / s
* 大容量和超大容量 SD 存储卡至少应该为 class-2
6、SD 存储卡结构图
引脚说明如下图所示:
二、SD Bus
1、Command: 命令是一次操作开始的令牌,从主机发送到一个卡片(编址命令)或者连接到主机的所有卡片(广播命令)。命令的编码格式如下图所示:每个令牌都有一个起始位和结束位,总长度为48 bits,并且每个令牌都有 7 bits 的CRC 校验码。命令只能通过CMD 线传输,并且MSB 为先。
下面是 CMD8 的示意图:
* bit[40:45] - Command index 的内容就是 CMD 的编号
* bit[8:39] - Command Argument 为每个命令自带的参数
* Command 共分为12类(class0 - class11),在寄存器 CSD 中有 12 bits CCC (Card Command Class)对本卡支持的分类进行描述,基本命令(class-0)如下图所示:
2、Response:应答是卡片发回数据的令牌,响应主机之前发送的命令。应答的编码格式如下图所示:每个令牌都有一个起始位和结束位,总长度为48 bits 或者136 bits,有相应的 CRC 校验码。应答信号也只在 CMD 线上传输,并且 MSB 为先。
* SD 存储卡有 5 种类型的应答:R1、R1b、R2、R3、R6,SDIO 卡还支持另外两种应答类型:R4、R5,除了 R3 其他类型的应答都有 CRC 校验码
* R1 为通常命令的应答格式,如下图所示
* R6 为 CMD3 的专用应答格式,其中 Argument 字段的高 16 bits 为卡片新的相对地址,如下图所示
3、Data:数据通过 DATA 线双向传输。数据传输有两种模式:
a、Usual data 模式:通常的数据以最低有效字节为先发送,在单个字节里面以最高有效位为先,示意图如下:
b、Wide width data 模式:最高有效位先传输,示意图如下:
三、SD 存储卡寄存器
每个 SD 存储卡都有一组信息寄存器,如下图所示:
其中 CID、OCR、CSD、SCR 存储了卡片的具体信息,RCA、DSR 寄存器存储了实际的配置参数。
1、OCR 寄存器
OCR (操作条件)寄存器中存储了卡片的电压信息以及部分状态信息:其中一个状态位(bit 31)指示卡片的上电操作是否完成,另外一个状态位(bit 30)指示卡片的容量状态(0代表SDSC、1代表SDHC或者SDXC)。寄存器的说明如下图所示:
2、CID 寄存器
CID (识别信息)寄存器总共 128 bits,包含了卡片的识别信息,每个独立的卡片都应该有一组独一无二的识别信息。寄存器说明如下图所示:
3、CSD 寄存器
CSD(具体信息)寄存器也是 128 bits,提供了访问卡片内容的一些信息如:传输速率、数据格式、错误类型、最大是数据访问时间、DSR 寄存器是否启用的。其中 bit[126:127] 记录了 CSD 的版本号,CSD version 1.0 为标准容量卡所用,CSD version 2.0 为大容量或超大容量卡所用。CSD version 1.0 寄存器说明如下图所示:
4、SCR 寄存器
SCR(SD 配置)寄存器总共 64 bits,定义了卡片的一些特殊功能,寄存器说明如下图所示:
5、CSR 寄存器
CSR(卡片状态)寄存器总共 32bits,代表了执行一个命令的错误和状态信息,其信息包含在 R1 格式的应答中返回给主机,寄存器说明如下图所示:
6、SD Status 寄存器
SD Status 寄存器包含了 SD 存储卡的的专有属性并为以后的功能扩展保留了足够的空间,其大小为 512bits 即一个块大小,这个寄存器作为ACMD13命令的执行结果,通过DATA线发送到主机,寄存器说明如下图所示:
四、SD 存储卡功能描述
SD 卡有两种操作模式:1、卡片识别模式,2、数据传输模式。所有的通信都是由主机控制的,即通过编址命令或者广播命令。卡片在两种模式之间的状态转换如下图所示:
1、卡片识别模式
当主机复位所有卡片后将进入卡片识别模式,在识别模式下将会确认卡片的操作电压并要求卡片发布自己的相对地址(默认地址为0x0000),在此操作模式下只会用到 CMD 线并且工作在专门的时钟频率 F-od(400 KHz)。识别模式的流程图如下:
主机首先会发送 CMD8 去确定卡片的工作电压:如果卡片不支持当前电压(包含在 CMD8 参数里面),则不会返回并保持在空闲状态;如果卡片能够在当前电压工作,则会返回卡片支持的电压以及检测图案,还有相应的CRC 校验码。卡片的初始化将在主机发送ACMD41命令后开始,主机每间隔1秒就发送一次 ACMD41 命令,直到初始化完成(OCR 寄存器的 bit31 置位)。在主机发送的第一个 ACMD41 中应该包含主机支持的容量信息(HCS)和工作条件。如果主机请求 1.8V 的工作电压(S18R = 1),并且卡片也支持(S18A = 1),则可以通过CMD11切换到 1.8V 的工作电压。当初始化完成后,主机发送 CMD2命令获取CID 寄存器信息,当卡片返回后主机接着发送CMD3命令要求卡片发布自己的相对地址,一旦主机接收到相对地址,卡片就进入等待状态(这时候主机可以通过 CMD3 命令重复要求卡片发布相对地址)。ACMD41的示意图如下所示:
它的应答格式如下(R3)图所示:
2、数据传输模式
CMD7 用于选择一个卡片进入传输模式,在同一时间只能有一个卡片处于传输模式。如果当前卡片与主机处于数据传输模式的连接状态,新的 CMD7 命令中的RCA [bit16 - bit31] 不是当前卡片的,则会释放连接并且当前卡片进入等待状态,然后连接新 RCA 的卡片。如果主机发送 CMD7 时,RCA = 0x0000,则所有的卡片都进入等待状态。数据传输模式下的状态转换如下图所示:
a、所有读取数据的命令在任何时间都能被 CMD12 终止。读取数据的命令包括:CMD17(读取单块数据)、CMD18(读取多块数据)、CMD30(读取写保护状态位)、ACMD51(读取 CSR 寄存器)、ACMD56。
b、所有写入数据的命令在任何时间都能被 CMD12 终止。写入数据的命令包括:CMD24(写入单块数据)、CMD25(写入多块数据)、CMD27(设置 CSD 寄存器)、CMD42(加锁解锁)、ACMD56。、
c、一旦数据传输完成,卡片将会马上退出数据写状态并且切换到编程状态(数据传输成功就写入存储介质)或者传输状态(数据传输失败)。
d、如果写操作停止,块长度和最后一块的 CRC 校验码是有效的,数据将会被写入存储介质。
e、卡片支持写缓存,这就意味着当前块在进行编程操作时下一块也可以进行传输。如果写缓存满了,卡片还是处在编程状态,则卡片会将DATA0一直拉低(忙状态)。
f、设置 CSD 寄存器时不提供缓存,也就是如果正在进行 CSD 设置,任何的数据传输命令都将被拒绝执行,DATA0 也会被一直拉低。
g、当卡片处于编程状态时,读命令和参数设置命令将不被执行。参数设置命令包括:CMD16(设置块长度)、CMD32(设置擦除的起始块数)、CMD33(设置擦除的结束块数)。
h、CMD7 命令不会终止擦除和编程操作。
i、通过 CMD0 或者 CMD15 重置卡片时将会结束所有挂起或者正在进行的操作,这有可能会破坏卡片的数据,所以需要主机来保证安全。
j、CMD class10 的命令之间的状态转换由厂家自己定义。
3、数据读写流程
在卡片上电以及执行 CMD0 后为 1bit bus,宽总线(4bit bus)模式可以通过 ACMD6 命令设置,在设置时卡片必须处理传输模式而且没有加锁。容量大于 2GB 的卡片最大块长度可能为 1024 字节,但是 CMD16 命令最大只支持 512 字节。
a、读取数据
当总线上没有数据传输时总线保持高电平,传输以低电平开始并以高电平结束,数据流包括有效数据和ECC值,一个 CRC 校验码将会被加入到每块数据的末尾以确保传输的完整性。CMD17命令将会读取一个块的数据,块的地址在命令的参数中列出(SDSC的地址以字节为单位,SDHC 和SDXC 的地址以块 - 512bytes 为单位)。CMD18命令将会连续的读取块数据直到主机发送 CMD12 命令,CMD23 命令可以指定读取的块数。
b、写入数据
写数据流程和读取数据流程类似。单块写入命令为 CMD24,多块写入命令为 CMD25。
c、擦除数据
擦除数据的流程和读取多块数据的流程类似。CMD32 命令指定擦除的开始块,CMD33 命令指定擦除的结束块,CMD38命令启动擦除。如果将要擦除的块是写保护的则跳过。在擦除过程中DATA0保持低电平。在写或者擦除的过程中可以通过CMD7命令去操作别的卡片。
d、加锁解锁
SD 存储卡支持加锁功能,密码以及长度保存在 128bits 的 PWD 和 8bits 的 PWD_LEN 寄存器。被加锁的卡片可以响应 class0 、CMD16、ACMD41、LOCK CARD(class7)命令,但是不能访问数据。如果卡片被加锁,则 PWD_LEN不为 0,卡片在上电后就会进入锁定状态。加锁解锁的命令为CMD42,该命令的数据块格式如下图所示:
* ERASE:强制擦除操作,第 0 byte 的 bit3 需要置 1,并且其他位置 0。
* LOCK_UNLOCK:1 = Lock the card,0 = Unlock the card。这个 bit 的操作需要和 SET_PWD 相同。
* CLR_PWD:1 = 清除密码。
* SET_PWD:1 = 设置新密码。
* PWDS_LEN:定义了密码的长度(bytes),如果改变密码,则是新密码和旧密码的长度。
* PWD:如果是新密码,则保存的是新密码。如果改变密码,则保存的是新密码和旧密码。
应当在发送 CMD42 之前通过 CMD16 设置数据块长度,而且数据块长度应该不小于 CMD42 数据块的长度。