SD卡分类
根据存储容量
- Standard Capacity SD Memory Card(SDSC):容量 <= 2GB (231 byte)
- High Capacity SD Memory Card(SDHC):2GB< 容量 <= 32GB (235 byte)
- Extended Capacity SD Memory Card(SDXC):32GB< 容量 <= 2TB (241 byte)
- Ultra Capacity SD Memory Card(SDUC):2TB< 容量 <= 128TB (247 byte)
注:容量的单位 1MB = 1024x1024 B
根据性能
- Class 0:未指定速率
- Class 2:速率 >= 2MB/sec(默认速率模式)
- Class 4:速率 >= 4MB/sec(默认速率模式)
- Class 6:速率 >= 6MB/sec(默认速率模式)
- Class 10:速率 >= 10MB/sec(高速模式)
注:性能的单位 1MB/sec = 1000x1000 B/sec
SD卡协议
简介
SD卡的协议是一种简单的命令/响应的协议。全部命令由主机发起,SD卡接收到命令后并返回响应数据。根据命令的不同,返回的数据内容和长度也不同。SD卡命令是一个 6 字节组成的命令包,其中第一个字节为命令号, 命令号高位 bit7-6 为固定的 “01“,其它 6bit 为具体的命令号。第 2-5 字节为命令参数。第 6 个字节为 7bit 的 CRC 校验加 1bit 的结束位。如果在 SPI 模式的时候,CRC 校验位为可选。如下图所示,Command 表示命令,通常使用十进制表示名称,例如 CMD17,这个时候Command就是十进制的17。
SD卡对每个命令会返回一个响应,每个命令有一定的响应格式。响应的格式跟给它的命令号有关。
引脚
- host 端将 CMD、DAT0-3 作为输入引脚,并且默认上拉
SPI 模式(SPI接口)
命令
命令格式
命令类别
- 不同功能命令归属于不同的类别
- 通过 CMD27 更改 CSD 寄存器中的 CCC 参数,但该寄存器只有部分参数可写,其余都是只读
CMD
ACMD
响应
在 SPI 模式中,有 5 种响应格式:R1, R1b, R2, R3, R7,不同命令对应的响应格式也不一样,详细见上一章节“命令”。
R1
- 除了 bit0(in idle state),其余状态都是读清
R2
- 除了 bit0(Card is locked),其余状态都是读清
R3
R7
寄存器
SPI 模式除了不支持 RCA 寄存器,其余同 SD 模式一样
CSD
有三种不同寄存器定义,分别对应三种 SD 卡
初始化流程
- 上电后延时至少 74 个 clock,等待 SD 卡内部操作完成
- SD 卡上电默认是 SD 模式,通过拉低 CS 信号,然后发送 CMD0 命令,试图进入 SPI 模式。若响应 R1 值为 0x01 时,则进入 SPI 模式,否则还是 SD 模式;(进入 SPI 模式后只有重新上电才能进入 SD 模式)
读操作
- SPI 模式支持单块读(CMD17)和多块读操作(CMD18)
- 对于标准容量卡,数据块的大小由 SET_BLOCKLEN 参数决定(CMD16)
- 对于 SDHC 和 SDXC 卡,数据块大小固定为 512B,起始地址必须与块边界对齐
- 每个数据块后面填充 16bit CRC 校验,使用标准 CCITT 多项式 X16 + X12 + X5 +1
- 最大块长度固定为 512B,无论 READ_BL_LEN 参数值(CSD 寄存器),除非 READ_BL_PARTIAL 为 1,块长度才可以设置为 1-512B 任意大小
- 每个块不能跨物理扇区
- 多块读每一块都填充 16bit CRC 校验,通过 CMD12 停止多块读操作
写操作
-
SPI 模式支持单块读(CMD24)和多块读操作(CMD25)
-
单块写时,每个数据块前需添加 “Start Block“;多块写只有第一块需要添加 ”Start Block“,但是最后一块需要添加 ”Stop Tran“
-
可通过 CMD13 查看写结果;通过 ACMD22 查看多块写时正确写入的块个数
-
当卡处于 busy 状态,置位 CS 信号不会中断写入进程,而且 busy 状态会忽略所有命令,除了 CMD0 可以复位卡,但是同时会破坏卡内数据(避免这样操作)
-
Data Response
-
写每个数据块时,卡都会给 Data Response,格式如下:
-
多块写操作时遇到 CRC 或者 Write Error时,主机要发送 CMD12 停止数据传输
-
当遇到 Write Error 时,可通过 CMD13 查看写错误原因,并可通过 ACMD22 查看多块写时正确写入的块个数
-
-
Start Block、Stop tran
-
对于单块写、单/多块读
- 第 1 byte:Start Block(8‘hFE)
- byte 2-513(具体取决于块大小):User data
- 最后 2 byte:16bit CRC
-
对于多块写
- 每个需要写入的数据块前面发送 1 Byte 的 Start Block(8’hFC)
- 停止写操作发送 1 Byte 的 Stop Tran(8‘hFD)
注:多块读通过发送 CMD12 停止读操作
-
-
Data Error
- 当读操作失败时,卡会响应 Data Error,格式如下:
擦除&写保护
SD 模式(SDIO接口)
命令
命令格式
SD 模式和 SPI 模式下的命令格式都一样。
命令类别
- 不同功能命令归属于不同的类别
CMD
class 0
class 2
class 4
class 5
class 6
class 7
class 8
class 9
class 10
ACMD
响应
在 SD 模式中,有 6 种响应格式:R1, R1b, R2, R3, R6, R7,不同命令对应的响应格式也不一样,详细见上一章节“命令”。
R1(normal response command)
常规响应,48bit,与命令格式相似。其中 [45:40]
填充与命令相同的命令号 (命令的命令号是什么,响应里就填充什么) 。[39:8]
为卡状态信息,CRC7则根据 [47:8]
位计算得到的。
R1b
R1b响应与R1响应基本相同,区别在于R1b响应允许在数据线上传输一个可选的忙信号(busy signal)。这意味着在接收到某些命令后,根据卡在接收命令之前的状态,卡可能会变得忙碌。主机需要在响应时检查忙信号。
R2(CID/CSD寄存器)
CID寄存器的内容作为对命令CMD2和CMD10的响应被发送。CSD寄存器的内容作为对命令CMD9的响应被发送。只有CID和CSD的位[127:1]被传输,这些寄存器的保留位[0]被响应的结束位所取代。
R3(OCR寄存器)
R6(Published RCA response)
R7(Card interface condition))
寄存器
OCR
可通过 ACMD41 命令返回 R3 响应获取该寄存器值。
32位的操作条件寄存器(OCR)存储了卡片的VDD电压配置文件。此外,该寄存器还包括两个状态信息位。
- 第31位 - 卡片上电状态位,如果卡片的上电程序已经完成,此状态位将被设置。
- 第30位 - 卡片容量状态位,如果卡片是高容量SD存储卡,则此状态位被设置为1;0表示该卡片是标准容量SD存储卡。
CID
可通过 CMD2/10 命令返回 R2 响应获取该寄存器值。
Card Identification (CID) 寄存器是128位宽,它包含了在卡片识别阶段使用的卡片识别信息。每张单独的读写(RW)卡都应该有一个唯一的识别号码。CID寄存器的结构如下所述:
- MID(Manufacturer ID):制造商ID,8位,由“SD卡协会”控制并分配的制造商ID号。
- OID(OEM/Application ID):OEM/Application ID,16位,用于识别卡的OEM和/或卡的内容ID号。
- PNM(Product Name):产品名称,40位,SD128, SD064, SD032, SD016, SD008等。
- PRV(Product Revision):产品修订号,8位,两个二进制编码的十进制数字(BCD)。
- PSN(Serial Number):序列号,32位,32位无符号整数。
- Reserved:保留位,4位。
- MDT(Manufacture Date Code):生产日期码,12位,生产日期格式:2001年4月 = 0x014。
- CRC(CRC7 checksum):CRC校验值,7位,CRC校验值。
- Reserved, always ‘1’:保留位,始终为“1”,1位。
这些信息是在卡的生产期间被编程(烧录),主控制器不能修改它们的内容。请注意,SD卡的CID寄存器和MMC卡的CID寄存器在记录结构上是不同的。
CSD
可通过 CMD9 命令返回 R2 响应获取该寄存器值。
Card-Specific Data (CSD) 寄存器提供了关于如何访问卡片内容的信息。CSD定义了数据格式、错误校正类型、最大数据访问时间、数据传输速度以及是否可以使用DSR寄存器等。寄存器中可编程的部分(下面标记为W或E的条目)可以通过CMD27命令进行更改。
- bit103:96 表示SD卡支持的最大数据传输速度(TRAN_SPEED)
CSD_STRUCTURE
CSD V1.0
CSD V2.0
SCR
可通过 ACMD51 命令返回 R1 响应获取该寄存器值。
SD CARD Configuration Register (SCR) 提供了SD卡的一些特殊特性信息,这些特性是针对特定卡片配置的。SCR寄存器的大小为64位,由SD卡制造商在工厂内设置。以下是SCR寄存器内容的描述:
- SCR_STRUCTURE:4位,用于说明SD卡内的物理级中SCR结构的版本号。
- SD_SPEC:4位,描述SD卡在物理级上所支持的规范版本。
- DATA_STAT_AFTER_ERASE:1位,定义了数据在擦除后的状态,这个值取决于卡的供应商。
- SD_SECURITY:3位,描述了该卡所支持的安全算法。例如,0表示无安全支持,1表示安全协议1.0,2表示安全协议2.0等。
- SD_BUS_WIDTHS:4位,表示SD卡支持的数据总线宽度,例如1表示支持1位数据宽度,4表示支持4位数据宽度。
- Reserved:1位,保留位,通常设置为0。
- Reserved for manufacturer usage:3位,保留位,供制造商使用,通常设置为0。
这些字段共同定义了SCR寄存器的内容,它们为主机提供了关于SD卡特性的重要信息。
初始化流程
注:初始化期间要保证 DAT3 引脚为高电平,初始化时钟频率为100KHz~400KHz。
- 上电后延时至少 74 个 clock,等待 SD 卡内部操作完成;
- SD 卡上电默认是 SD 模式,然后发送 CMD0 命令 {2’b1,6’d0,32’b0,7’h4A,1’b1} 复位 SD 卡;
- 至少等待 8 个时钟周期后,发送 CMD8 命令 {2’b1,6’d8,24’b0,4‘h1,8’hAA,7’h43,1’b1} 鉴别 SD1.X 和 SD2.0(VHS 字段=0x1 (2.7~3.6V) ,check pattern=0xAA);
- 若正常返回 R7 响应,且返回的 VHS 和 check pattern 值与发送的内容一致,则发送 CMD55 命令{2’b1,6’d55,32’b0,7’h32,1’b1} ;
- 接收到 R1/R3 响应后,至少等待 8 个时钟周期后,发送 ACMD41 命令{2’b1,6’d41,8‘h40,24’b0,7’h3B,1’b1} 判断 SD 卡容量(HCS = 1);
- 若返回 R3 响应,且 OCR 寄存器 bit31 为 0,则重复步骤 5,否则进行下一步(此时 OCR 寄存器 bit30(CCS)值用于指示 SD 的容量);
- 接收到 R3 响应后,至少等待 8 个时钟周期后,发送 CMD2 命令 {2’b1,6’d2,32’b0,7’h26,1’b1} 获取 CID 寄存器值;
- 接收到 R3 响应后,至少等待 8 个时钟周期后,发送 CMD3 命令 {2’b1,6’d3,32’b0,7’h10,1’b1} 请求从端返回 RCA 值,主端记录该参数值,后续通过 CMD7 选择对应地址的从端设备进行通信;
- 初始化流程结束,SD 卡进入 data transfer mode。
数据传输流程
- 通过 CMD9 命令返回 R2 响应获取 CSD 寄存器值,获取当前 SD 卡所支持最大的数据传输速率,并更新FPGA寄存器值(调试时获取该参数,用于后续重新编译更改总线时钟);
- 通过 CMD7 命令选择 SD 卡;
- 通过 ACMD51 命令返回 R1 响应获取 SCR 寄存器值,获取从端支持的总线宽度,更新FPGA寄存器值;
- 通过 ACMD6 命令设置总线宽度;
- 进入 Transfer State;
卡状态跳转表
传输数据格式
CRC
时序要求
参数
命令及响应
- CMD2、ACMD41 -> 响应:命令和响应之间固定间隔5个周期
- 其他命令 -> 响应:命令和响应之间最少间隔2个周期,最多间隔64个周期
- 响应 -> 新命令:响应结束和新命令之间最少间隔8个周期
- 命令 -> 新命令:若前一条命令没有响应内容(如CMD0),则两条命令之间最少间隔8个周期
读操作
- 单块读
- 多块读
写操作
- 单块写
- 多块写
接口时序
超时条件
-
读超时
对于标准容量SD存储卡,读操作超时条件发生的时间是以下两者中较小的一个:CSD参数TAAC和NSAC给出的典型访问时间的100倍,或100毫秒。
高容量SD存储卡将TAAC和NSAC指示为固定值。主机应使用100毫秒超时(最低)进行单次和多次读操作,而不是使用TAAC和NSAC。
-
写超时
对于标准容量SD存储卡,写操作超时条件发生的时间是以下两者中较小的一个:CSD中的R2W_FACTOR对应倍数乘以读超时时间,或250毫秒。
高容量SD存储卡将R2W_FACTOR指示为固定值。 所有写操作的最大忙碌时间定义为250毫秒。主机应使用250毫秒超时(最低)进行单次和多次写操作,而不是使用R2W_FACTOR。
IP 设计
SPI 模式
IP 例化界面
IP 接口
信号 | 方向 | 说明 |
---|---|---|
ref_clk | input | 模块参考时钟 |
ref_rst | input | 模块复位信号 |
spi_clk_o | output | SD 卡 SPI 模式时钟,spi_clk frequency = ref_clk / 4 |
spi_cs_n_o | output | SD 卡 SPI 模式片选信号 |
spi_miso_i | input | SD 卡 SPI 模式主端数据输入 |
spi_mosi_o | output | SD 卡 SPI 模式主端数据输出 |
o_sd_init_done | output | SD 卡初始化完成指示,高有效 |
o_status_flag[31:0] | output | 状态机状态,定义见下图 |
o_card_type[3:0] | output | SD 卡类型,定义见下图 |
i_sd_wr_en | input | 写使能,在 o_sd_wr_end 置位后更新状态。若只写一个 block,则在 o_sd_wr_end 拉低 i_sd_wr_en 信号 |
i_sd_wr_addr[31:0] | input | 写地址,对于 SDHC 和 SDXC 卡,数据块大小固定为 512B,起始地址必须与块边界对齐 |
i_sd_wr_data[7:0] | input | 写数据 |
o_sd_wr_data_req | output | 写数据请求,置位时下个时钟周期更新写数据 i_sd_wr_data |
o_sd_wr_end | output | 写完成指示,高有效 |
i_sd_rd_en | input | 读使能,在 o_sd_rd_end 或 o_sd_rd_err 置位后更新状态。若只读一个 block,则在 o_sd_rd_end 拉低 i_sd_rd_en信号 |
i_sd_rd_addr[31:0] | input | 读地址,对于 SDHC 和 SDXC 卡,数据块大小固定为 512B,起始地址必须与块边界对齐 |
o_sd_rd_data[7:0] | output | 读数据 |
o_sd_rd_data_vld | output | 读数据有效指示 |
o_sd_rd_err | output | 读操作错误 |
o_sd_rd_end | output | 读完成指示,高有效 |
IP 状态机
IP 验证
这里使用 闪迪HC-16G 和 雷龙 SD NAND (型号:CSNP32GCR01-BOW ) 进行单 block 读写测试。
注:SDHC 卡固定 block 大小为 512 bytes。
- 首先读取第二个 block 的数据,一开始为全 0
- 然后往第二个 block 写顺序数
- 写完成后再次读取第二个 block 数据,发现与写入数据一致
- 测试完成
SD模式
IP 例化界面
IP 接口
IP 状态机
IP 验证
雷龙贴片式TF卡
雷龙 SD NAND (型号:CSNP32GCR01-BOW ) 贴片式TF卡,,LGA-8封装,标准SDIO接口,兼容SPI/SD接口,可替代普通TF卡/SD卡,尺寸6x8mm毫米,内置SLC晶圆擦写寿命10万次,耐高低温,速度级别Class10(读取速度23.5MB/S写入速度12.3MB/S)。