SD卡协议
SD卡分类
根据存储容量
根据性能
SD卡协议
简介
引脚
SPI 模式(SPI接口)
命令
命令格式
命令类别
CMD
ACMD
响应
R1
R2
R3
R7
寄存器
CSD
初始化流程
读操作
写操作
擦除&写保护
SD 模式(SDIO接口)
命令
命令格式
命令类别
CMD
class 0
class 2
class 4
class 5
class 6
class 7
class 8
class 9
class 10
ACMD
响应
R1(normal response command)
R1b
R2(CID/CSD寄存器)
R3(OCR寄存器)
R6(Published RCA response)
R7(Card interface condition))
寄存器
OCR
CID
CSD
CSD_STRUCTURE
CSD V1.0
CSD V2.0
SCR
初始化流程
数据传输流程
卡状态跳转表
传输数据格式
CRC
时序要求
参数
命令及响应
读操作
写操作
接口时序
超时条件
IP 设计
SPI 模式
IP 例化界面
IP 接口
IP 状态机
IP 验证
SD模式
IP 例化界面
IP 接口
IP 状态机
IP 验证
雷龙贴片式TF卡
参考资料
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)。
参考资料
Simplified Specifications | SD Association (sdcard.org)
SD NAND,贴片式TF卡,贴片式SD卡,SPI NAND, PSLC NAND,存储芯片,闪存芯片 (longsto.com)
SD2.0协议详解:命令格式、初始化/读取/写入 - 知乎 (zhihu.com)
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_38695100/article/details/142532881
|
|