结构
- 控制器:位于SD卡的表面,是卡的心脏,负责管理数据传输、命令解析和错误校验等功能。
- 存储单元:存储单元是实际存储数据的地方,通常由NAND型闪存组成。
- 接口:SD卡有一个9针的接口,用于与主机设备通信,包括数据线、命令线和电源线。
- 金手指:SD卡的一端有金属接触点,用于与设备进行物理连接。
- 封装:封装用于保护内部电路,通常由塑料或其他材料制成,以防水、防尘和防震。
硬件连接模式
SD卡(Secure Digital Card)通常通过一个串行接口与主机设备进行通信。SD卡接口支持两种主要的通信模式:SD模式和SPI模式。
-
SD模式:这是SD卡的标准通信模式,使用专门的SD卡协议。在这种模式下,数据传输使用的是4线串行接口,包括时钟线(CLK)、数据线(CMD和DAT0-DAT3)。SD模式支持更高的数据传输速率,并且可以进行多线操作,即在多个数据线上同时传输数据。
-
SPI模式:这是一种兼容模式,允许SD卡通过SPI(Serial Peripheral Interface)接口与主机设备通信。SPI是一种常见的串行通信协议,用于与许多类型的串行设备进行通信。在SPI模式下,SD卡使用四线接口:时钟(SCK)、数据输出(MISO)、数据输入(MOSI)和片选(CS)。SPI模式的数据传输速率通常低于SD模式,但它提供了一种简单的方式来与不支持SD模式的主机设备进行通信。
SDIO
SPI
生命周期阶段
初次连接 --> 卡识别模式 --> 数据模式 --> 连接断开
-
初次连接:当SD卡首次插入到主机设备(如数码相机、手机、读卡器等)时,主机设备会检测到新的存储介质,并开始与SD卡进行通信。
-
卡识别模式:主机设备通过发送特定的命令来初始化与SD卡的通信,并获取SD卡的信息,如制造商信息、存储容量、速度等级等。这个过程包括对SD卡的CID和CSD寄存器进行读取,以及可能的SCR寄存器读取(用于获取SD卡支持的SD规范和操作特性)。
-
数据模式:一旦卡识别模式完成,SD卡就会进入数据模式。在这个模式下,主机设备可以进行实际的数据读写操作,包括文件的存储、检索和删除等。
-
连接断开:当用户从主机设备中移除SD卡时,连接会断开。在断开连接之前,主机设备通常会执行一些清理操作,以确保数据的安全写入和卡的妥善关闭。
包结构概述
-
命令包(Command Packet):
- 起始位(Start Bit):一个位,标志命令包的开始。
- 传输方向位(Transmission Bit):一个位,指示命令包的方向,0表示主机到卡,1表示卡到主机(用于响应)。
- Command Index(CMD IDX):6位,命令索引,指示具体的命令。
- Argument(ARG):32位,命令参数,提供执行命令所需的额外信息。
- CRC(CRC):7位,循环冗余校验码,用于检测命令包在传输过程中是否出现错误。
- 停止位(Stop Bit):一个位,标志命令包的结束。
- [起始位(0)][传输方向位(0)][命令索引(6位)][参数(32位)][CRC(7位)][停止位(1)]
-
响应包(Response Packet):
- 起始位(Start Bit):一个位,标志响应包的开始。
- 传输方向位(Transmission Bit):一个位,指示响应包的方向,1表示卡到主机。
- 响应数据(Response Data):48位(对于R2类型响应)或32位(对于R3/R4类型响应),或者更少(对于R1/R5/R6/R7类型响应),具体取决于响应的类型。
- 停止位(Stop Bit):一个位,标志响应包的结束。
- [起始位(0)][传输方向位(1)][响应数据(32位或48位)][停止位(1)]
- 注意:响应通常不包含CRC,但有些特定的响应类型可能会包含CRC。
-
数据包(Data Packet):
- 起始位(Start Bit):一个位,标志数据包的开始。
- 数据块(Data Block):一定长度的数据,通常是512字节,但也可以是其他大小,取决于卡的配置和传输模式。
- CRC(CRC):16位,循环冗余校验码,用于检测数据块在传输过程中是否出现错误。
- 停止位(Stop Bit):一个位,标志数据包的结束。
- [起始位(0)][传输方向位(1)][数据位(512字节)][CRC(16位)][停止位(1)]
数据包的格式
-
常规数据包格式(Standard Data Packet Format):
- 这种格式通常用于标准的SD卡操作,数据以8位宽度传输。每个数据包包含一个起始位、一个传输方向位、数据位、一个16位的CRC校验码和一个停止位。这种格式适用于大多数SD卡操作,包括单块和多块数据传输。
它先发低字节再发高字节,而每个字节则是先发高位再发低位,4线传输示意如
图 35‑6 8位宽数据包传输
4线同步发送,每根线发送一个字节的其中两个位,数据位在四线顺序排列发送,DAT3数据线发较高位,DAT0数据线发较低位。
-
宽位数据包格式(Wide Bus Data Packet Format):
- 这种格式用于SDHC(Secure Digital High Capacity)和SDXC(Secure Digital Extended Capacity)卡,以及在某些高速模式下。它允许数据以更宽的宽度(4位或8位)传输,从而提高数据传输速率。宽位数据包格式同样包含起始位、传输方向位、数据位、CRC校验码和停止位,但是数据位的宽度更大,因此可以在单个时钟周期内传输更多的数据。
对SD卡而言宽位数据包发送方式是针对SD卡SSR(SD状态)寄存器内容发送的,SSR寄存器总共有512bit,在 主机发出ACMD13命令后SD卡将SSR寄存器内容通过DAT线发送给主机。宽位数据包格式示意见 图35_7。
图 35‑7 宽位数据包传输
指令1
主-->卡
命令序号 | 类型 | 参数 | 响应 | 缩写 | 描述 | |
基本命令(Class |
| |||||
CMD0 | bc | [31:0]填充位 |
| GO_IDLE_STATE | 复位所有的卡到idle状态。 | |
CMD2 | bcr | [31:0]填充位 | R2 | ALL_SEND_CID | 通知所有卡通过CMD线返回CID值。 | |
CMD3 | bcr | [31:0]填充位 | R6 | SEND_RELATIVE_ADDR | 通知所有卡发布新RCA。 | |
CMD4 | bc | [31:16]DSR[15:0]填充位 |
| SET_DSR | 编程所有卡的DSR。 | |
CMD7 | ac | [31:16]RCA[15:0]填充位 | R1b | SELECT/DESELECT_CARD | 选择/取消选择RCA地址卡。 | |
CMD8 | bcr | [31:12]保留位[11:8]VHS[7:0]检查模式 | R7 | SEND_IF_COND | 发送SD卡接口条件,包含主机支持的电压信息,并询问卡是否支持。 | |
CMD9 | ac | [31:16]RCA[15:0]填充位 | R2 | SEND_CSD | 选定卡通过CMD线发送CSD内容 | |
CMD10 | ac | [31:16]RCA[15:0]填充位 | R2 | SEND_CID | 选定卡通过CMD线发送CID内容 | |
CMD12 | ac | [31:0]填充位 | R1b | STOP_TRANSMISSION | 强制卡停止传输 | |
CMD13 | ac | [31:16]RCA[15:0]填充位 | R1 | SEND_STATUS | 选定卡通过CMD线发送它状态寄存器 | |
CMD15 | ac | [31:16]RCA[15:0]填充位 |
| GO_INACTIVE_STATE | 使选定卡进入“inactive”状态 | |
面向块的读操作(Class |
| |||||
CMD16 | ac | [31:0]块长度 | R1 | SET_BLOCK_LEN | 对于标准SD卡,设置块命令的长度,对于SDHC卡块命令长度固定为512字节。 | |
CMD17 | adtc | [31:0]数据地址 | R1 | READ_SINGLE_BLOCK | 对于标准卡,读取SEL_BLOCK_LEN长度字节的块;对于SDHC卡,读取512字节的块。 | |
CMD18 | adtc | [31:0]数据地址 | R1 | READ_MULTIPLE_BLOCK | 连续从SD卡读取数据块,直到被CMD12中断。块长度同CMD17。 | |
面向块的写操作(Class |
| |||||
CMD24 | adtc | [31:0]数据地址 | R1 | WRITE_BLOCK | 对于标准卡,写入SEL_BLOCK_LEN长度字节的块;对于SDHC卡,写入512字节的块。 | |
CMD25 | adtc | [31:0]数据地址 | R1 | WRITE_MILTIPLE_BLOCK | 连续向SD卡写入数据块,直到被CMD12中断。每块长度同CMD17。 | |
CMD27 | adtc | [31:0]填充位 | R1 | PROGRAM_CSD | 对CSD的可编程位进行编程 | |
擦除命令(Class |
| |||||
CMD32 | ac | [31:0]数据地址 | R1 | ERASE_WR_BLK_START | 设置擦除的起始块地址 | |
CMD33 | ac | [31:0]数据地址 | R1 | ERASE_WR_BLK_END | 设置擦除的结束块地址 | |
CMD38 | ac | [31:0]填充位 | R1b | ERASE | 擦除预先选定的块 | |
加锁命令(Class |
| |||||
CMD42 | adtc | [31:0]保留 | R1 | LOCK_UNLOCK | 加锁/解锁SD卡 | |
特定应用命令(Class |
| |||||
CMD55 | ac | [31:16]RCA[15:0]填充位 | R1 | APP_CMD | 指定下个命令为特定应用命令,不是标准命令 | |
CMD56 | adtc | [31:1]填充位[0]读/写 | R1 | GEN_CMD | 通用命令,或者特定应用命令中,用于传输一个数据块,最低位为1表示读数据,为0表示写数据 | |
SD卡特定应用命令 | ||||||
ACMD6 | ac | [31:2]填充位[1:0]总线宽度 | R1 | SET_BUS_WIDTH | 定义数据总线宽度(‘00’=1bit,’10’=4bit)。 | |
ACMD13 | adtc | [31:0]填充位 | R1 | SD_STATUS | 发送SD状态 | |
ACMD41 | Bcr | [32]保留位[30]HCS(OCR[30]) | [29:24]保留位[23:0]VDD电压(OCR[23:0]) | R3 | SD_SEND_OP_COND | 主机要求卡发送它的支持信息(HCS)和OCR寄存器内容。 |
ACMD51 | adtc | [31:0]填充位 | R1 | SEND_SCR | 读取配置寄存器SCR |
CMD后面的数字就是指令的值
- CMD0 (GO_IDLE_STATE): 使SD卡进入空闲状态。
- CMD1 (SEND_OP_COND): 查询或设置SD卡的供电电压和操作条件。
- CMD2 (ALL_SEND_CID): 读取SD卡的CID(卡识别数据)。
- CMD3 (SEND_RELATIVE_ADDR): 发送相对地址(RCA)。
- CMD4 (SET_RELATIVE_ADDR): 设置相对地址。
- CMD5 (SEND_IF_COND): 发送接口条件。
- CMD6 (SWITCH_FUNC): 切换功能。
- CMD7 (SELECT_CARD): 选择卡。
- CMD8 (SEND_IF_RCA): 发送RCA(相对卡地址)。
- CMD9 (SEND_CSD): 读取CSD(卡特定数据)。
- CMD10 (SEND_CID): 再次读取CID。
- CMD11 (SEND_STATUS): 读取状态。
- CMD12 (CRC_ON_OFF): 启用或禁用CRC。
- CMD13 (SEND_NUM_WRITE_BLOCKS): 发送写块的数量。
- CMD14 (SET_WRITE_BLK_ERASE_COUNT): 设置写块/擦除计数。
- CMD15 (READ_SINGLE_BLOCK): 读取单块数据。
- CMD16 (READ_MULTIPLE_BLOCK): 读取多块数据。
- CMD17 (WRITE_SINGLE_BLOCK): 写入单块数据。
- CMD18 (WRITE_MULTIPLE_BLOCK): 写入多块数据。
- CMD19 (PROGRAM_CSD): 编程CSD。
- CMD20 (SET_BLOCKLEN): 设置块长度。
- CMD21 (READ_OCR): 读取OCR(操作条件寄存器)。
- CMD22 (CRC_ON_OFF): 启用或禁用CRC。
- CMD23 (SEND_SCR): 发送SCR(SD卡规范寄存器)。
- CMD24 (SEND_EXT_CSD): 发送扩展CSD(对于SDHC和SDXC卡)。
- CMD25 (SEND_CID): 再次读取CID。
- CMD26 (SEND_STATUS): 再次读取状态。
- CMD27 (SEND_NUM_WRITE_BLOCKS): 再次发送写块的数量。
- CMD28 (SET_WRITE_BLK_ERASE_COUNT): 再次设置写块/擦除计数。
- CMD29 (READ_SINGLE_BLOCK): 再次读取单块数据。
- CMD30 (READ_MULTIPLE_BLOCK): 再次读取多块数据。
- CMD31 (WRITE_SINGLE_BLOCK): 再次写入单块数据。
- CMD32 (WRITE_MULTIPLE_BLOCK): 再次写入多块数据。
- CMD33 (PROGRAM_CSD): 再次编程CSD。
- CMD34 (SET_BLOCKLEN): 再次设置块长度。
- CMD35 (READ_OCR): 再次读取OCR。 3
实例
命令包(主机设备发送):
[起始位(0)][传输方向位(0)][CMD2(000001)][参数(0)][CRC(7位)][停止位(1)]
响应包(SD卡发送):
[起始位(0)][传输方向位(1)][CID数据(512字节)][CRC(16位)][停止位(1)]
响应指令
卡-->主机
-
R1响应:
- 返回一个32位的二进制数。
- 第一个字节(8位)是响应类型,其中0x00表示正常响应,0x01表示错误响应。
- 剩余的29位是状态位,用于表示SD卡的状态。
- 最后一个字节(8位)是CRC校验码,用于验证响应数据的完整性。
-
R2响应:
- 返回一个48位的二进制数。
- 第一个字节(8位)是响应类型,其中0x00表示正常响应,0x01表示错误响应。
- 接下来的32位是状态位。
- 最后的16位是CRC校验码。
-
R3响应:
- 返回一个32位的二进制数。
- 第一个字节(8位)是响应类型,其中0x00表示正常响应,0x01表示错误响应。
- 接下来的31位是状态位。
- 最后的1位是CRC校验码。
-
R4响应:
- 返回一个32位的二进制数。
- 第一个字节(8位)是响应类型,其中0x00表示正常响应,0x01表示错误响应。
- 接下来的31位是状态位。
- 最后的1位是CRC校验码。
-
R5响应:
- 返回一个32位的二进制数。
- 第一个字节(8位)是响应类型,其中0x00表示正常响应,0x01表示错误响应。
- 接下来的31位是状态位。
- 最后的1位是CRC校验码。
-
R6响应:
- 返回一个32位的二进制数。
- 第一个字节(8位)是响应类型,其中0x00表示正常响应,0x01表示错误响应。
- 接下来的31位是状态位。
- 最后的1位是CRC校验码。
-
R7响应:
- 返回一个32位的二进制数。
- 第一个字节(8位)是响应类型,其中0x00表示正常响应,0x01表示错误响应。
- 接下来的31位是状态位。
- 最后的1位是CRC校验码。
-
R1b响应:
- 返回一个32位的二进制数。
- 第一个字节(8位)是响应类型,其中0x00表示正常响应,0x01表示错误响应。
- 接下来的29位是状态位。
- 最后的3位是CRC校验码。
状态位
- 0x00000001:表示命令被拒绝(Command Rejected)。
- 0x00000002:表示命令序列错误(Command Sequence Error)。
- 0x00000004:表示命令参数错误(Command Parameter Error)。
- 0x00000008:表示命令错误(Command Error)。
- 0x00000010:表示命令完成(Command Complete)。
- 0x00000020:表示数据传输开始(Data Transfer Start)。
- 0x00000040:表示数据传输结束(Data Transfer End)。
- 0x00000080:表示数据传输异常(Data Transfer Aborted)。
- 0x00000100:表示数据传输结束(Data Transfer End)。
- 0x00000200:表示数据传输异常(Data Transfer Aborted)。
- 0x00000400:表示数据传输结束(Data Transfer End)。
- 0x00000800:表示数据传输异常(Data Transfer Aborted)。
- 0x00001000:表示数据传输结束(Data Transfer End)。
- 0x00002000:表示数据传输异常(Data Transfer Aborted)。
- 0x00004000:表示数据传输结束(Data Transfer End)。
- 0x00008000:表示数据传输异常(Data Transfer Aborted)。
- 0x00010000:表示数据传输结束(Data Transfer End)。
- 0x00020000:表示数据传输异常(Data Transfer Aborted)。
- 0x00040000:表示数据传输结束(Data Transfer End)。
- 0x00080000:表示数据传输异常(Data Transfer Aborted)。
- 0x00100000:表示数据传输结束(Data Transfer End)。
- 0x00200000:表示数据传输异常(Data Transfer Aborted)。
- 0x00400000:表示数据传输结束(Data Transfer End)。
- 0x00800000:表示数据传输异常(Data Transfer Aborted)。
- 0x01000000:表示数据传输结束(Data Transfer End)。
- 0x02000000:表示数据传输异常(Data Transfer Aborted)。
- 0x04000000:表示数据传输结束(Data Transfer End)。
- 0x08000000:表示数据传输异常(Data Transfer Aborted)。
- 0x10000000:表示数据传输结束(Data Transfer End)。
- 0x20000000:表示数据传输异常(Data Transfer Aborted)。
- 0x40000000:表示数据传输结束(Data Transfer End)。
- 0x80000000:表示数据传输异常(Data Transfer Aborted)。
结构
[起始位(0)][传输方向位(1)][响应类型(2位)][状态位(32位或29位)][CRC(16位或8位)][停止位(1)]
- 起始位(Start Bit):一个位,总是为0,表示响应的开始。
- 传输方向位(Transmission Bit):一个位,对于响应总是1,表示响应是从卡到主机的。
- 响应类型(Response Type):两个位,其中00表示正常响应,01表示错误响应,10表示扩展响应,11保留。
- 状态位(Status Bits):接下来的32位或29位,包含执行命令后的状态信息。
- CRC(Cyclic Redundancy Check):接下来的16位或8位,是CRC校验码,用于验证响应数据的完整性。
- 停止位(Stop Bit):一个位,总是为1,表示响应的结束。
默认时钟
SD卡和模式的默认时钟频率的一般指南:
-
标准SD卡:
- 默认时钟频率通常为100 kHz(千赫兹)。
-
SDHC卡:
- 默认时钟频率通常为25 MHz(兆赫兹)。
-
SDXC卡:
- 默认时钟频率通常为50 MHz。
-
UHS-I卡:
- 默认时钟频率通常为100 MHz。
-
UHS-II卡:
- 默认时钟频率通常为300 MHz。