三、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,则所有的卡片都进
入等待状态。数据传输模式下的状态转换如下图所示:
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 寄存器。被加锁的
卡片可以响应 class0、CMD16、ACMD41、LOCK CARD(class7)命令,但是不能访问数据。
如果卡片被加锁,则 PWD_LEN不为 0,卡片在上电后就会进入锁定状态。加锁解锁的命令为CMD42,
该命令的数据块格式如下图所示:
* ERASE:强制擦除操作,第 0 byte 的 bit3 需要置 1,并且其他位置 0。
* LOCK_UNLOCK:1 = Lockthe card,0 = Unlock the card。这个 bit 的操作需要和 SET_PWD 相同。
* CLR_PWD:1 = 清除密码。
* SET_PWD:1 = 设置新密码。
* PWDS_LEN:定义了密码的长度(bytes),如果改变密码,则是新密码和旧密码的长度。
* PWD:如果是新密码,则保存的是新密码。如果改变密码,则保存的是新密码和旧密码。
应当在发送 CMD42 之前通过 CMD16 设置数据块长度,而且数据块长度应该不小于 CMD42 数据块的长度。