Linux SD Driver (三)

三、SD 存储卡功能描述

SD 卡有两种操作模式:

1卡片识别模式2数据传输模式

所有的通信都是由主机控制的,即通过编址命令或者广播命令。卡片在两种模式之间的状态转换如下图所示:

Linux SD Driver (三)

1卡片识别模式

当主机复位所有卡片后将进入卡片识别模式,在识别模式下将会确认卡片的操作电压并要求卡片发布自己的

相对地址(默认地址为0x0000),在此操作模式下只会用到 CMD 线并且工作在专门的时钟频率 F-od400 KHz)。

识别模式的流程图如下:

Linux SD Driver (三)

主机首先会发送 CMD8 去确定卡片的工作电压:如果卡片不支持当前电压(包含在 CMD8 参数里面),则不会

返回并保持在空闲状态;如果卡片能够在当前电压工作,则会返回卡片支持的电压以及检测图案,还有相应的CRC 

校验码

卡片的初始化将在主机发送ACMD41命令后开始,主机每间隔1就发送一次 ACMD41 命令,直到初始化完成

OCR 寄存器的 bit31 置位)。在主机发送的第一个 ACMD41 中应该包含主机支持的容量信息(HCS工作条件

如果主机请求 1.8V 的工作电压(S18R = 1),并且卡片也支持(S18A = 1),则可以通过CMD11切换到 1.8V 

的工作电压。当初始化完成后,

主机发送 CMD2命令获取CID 寄存器信息,当卡片返回后主机接着发送CMD3命令要求卡片发布自己的相对地址

一旦主机接收到相对地址,卡片就进入等待状态(这时候主机可以通过 CMD3 命令重复要求卡片发布相对地址)。

ACMD41的示意图如下所示:

Linux SD Driver (三)

它的应答格式如下(R3)图所示:

Linux SD Driver (三)

2、数据传输模式

CMD7 用于选择一个卡片进入传输模式,在同一时间只能有一个卡片处于传输模式。如果当前卡片与主机处于

数据传输模式的连接状态,新的 CMD7 命令中的RCA [bit16 -bit31] 不是当前卡片的,则会释放连接并且当前

卡片进入等待状态,然后连接 RCA 的卡片。如果主机发送 CMD7 时,RCA = 0x0000,则所有的卡片都进

入等待状态。数据传输模式下的状态转换如下图所示:

3、数据读写流程

在卡片上电以及执行 CMD0 后为 1bitbus,宽总线(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 寄存器。被加锁的

卡片可以响应 class0CMD16ACMD41LOCK CARDclass7)命令,但是不能访问数据。

如果卡片被加锁,则 PWD_LEN不为 0,卡片在上电后就会进入锁定状态。加锁解锁的命令为CMD42

该命令的数据块格式如下图所示:

Linux SD Driver (三)

ERASE:强制擦除操作,第 0 byte bit3 需要置 1,并且其他位置 0

LOCK_UNLOCK1 = Lockthe card0 = Unlock the card。这个 bit 的操作需要和 SET_PWD 相同。

CLR_PWD1 = 清除密码。

SET_PWD1 = 设置新密码。

PWDS_LEN:定义了密码的长度(bytes),如果改变密码,则是新密码和旧密码的长度。

PWD:如果是新密码,则保存的是新密码。如果改变密码,则保存的是新密码和旧密码。

应当在发送 CMD42 之前通过 CMD16 设置数据块长度,而且数据块长度应该不小于 CMD42 数据块的长度。