SD NAND的CSD(Card Specific Data)寄存器是SD卡中一个非常重要的寄存器,用来存储卡的特定信息,包含容量、速度、读写块大小等。理解和正确使用CSD寄存器对开发者在嵌入式系统中有效驱动和管理SD NAND非常关键。
CSD寄存器概述
CSD寄存器的长度为128位(16字节),它描述了SD卡的各种参数,帮助主机系统理解SD卡的特性。SD卡协议根据卡的版本不同分为两种CSD结构:
CSD v1.0:适用于SD Standard Capacity(SDSC),容量不超过2GB的卡。
CSD v2.0:适用于SD High Capacity(SDHC)和SD eXtended Capacity(SDXC),容量从4GB到2TB。
CSD寄存器格式(v2.0)
CSD寄存器的128位按位分布描述了SD卡的多种特性,常见的字段包括卡的容量、读写速度、数据块长度等。以下是SDHC/SDXC卡中常见的CSD寄存器字段的详细介绍:
SD 2.0及以上的SD卡使用CSD版本2.0。CSD寄存器的128位分为多个字段,每个字段的含义如下:
SD 2.0及以上的SD卡使用CSD版本2.0。CSD寄存器的128位分为多个字段,每个字段的含义如下:
位范围 | 字段名称 | 长度 (bit) | 描述 |
---|---|---|---|
127:126 | CSD_STRUCTURE | 2 | CSD结构,表示CSD寄存器的版本 |
125:120 | TAAC | 8 | 数据读访问时间1 |
119:112 | NSAC | 8 | 数据读访问时间2 |
111:104 | TRAN_SPEED | 8 | 最大数据传输速度 |
103:96 | CCC | 12 | 卡命令类别 |
95:84 | READ_BL_LEN | 4 | 读数据块长度 |
83:83 | READ_BL_PARTIAL | 1 | 是否支持部分块读取 |
82:82 | WRITE_BLK_MISALIGN | 1 | 写块是否跨页对齐 |
81:81 | READ_BLK_MISALIGN | 1 | 读块是否跨页对齐 |
80:80 | DSR_IMP | 1 | 是否支持DSR(驱动器配置寄存器) |
79:48 | C_SIZE | 22 | 卡容量 |
47:47 | ERASE_BLK_EN | 1 | 是否支持单个块擦除 |
46:39 | SECTOR_SIZE | 7 | 擦除扇区大小 |
38:32 | WP_GRP_SIZE | 7 | 写保护组大小 |
31:31 | WP_GRP_ENABLE | 1 | 是否支持写保护组 |
30:29 | R2W_FACTOR | 3 | 写相对于读的时间因子 |
28:26 | WRITE_BL_LEN | 4 | 写块长度 |
25:25 | WRITE_BL_PARTIAL | 1 | 是否支持部分块写入 |
24:23 | FILE_FORMAT_GRP | 2 | 文件格式分组 |
22:22 | COPY | 1 | 是否为复制的内容 |
21:21 | PERM_WRITE_PROTECT | 1 | 是否为永久写保护 |
20:20 | TMP_WRITE_PROTECT | 1 | 是否为临时写保护 |
19:18 | FILE_FORMAT | 2 | 文件格式 |
17:16 | RESERVED | 2 | 保留位 |
15:1 | CRC | 7 | CSD寄存器的CRC校验码 |
0 | NOT_USED | 1 | 未使用位 |
2. CSD寄存器的关键字段
通用字段
以下字段在CSD寄存器中很常见,主要提供卡片的能力和性能信息:
CSD结构版本 (CSD_STRUCTURE):定义了CSD寄存器的结构格式,通常有两个版本:
CSD 1.0:用于SDSC卡。
CSD 2.0:用于SDHC和SDXC卡。
读块长度 (READ_BL_LEN):表示读取时的最大块长度。典型值是512字节或1024字节。
卡容量 (C_SIZE):卡的总存储容量,以块数表示。通过它和块长度可以计算出总容量。
对于SDHC和SDXC卡,容量使用的是C_SIZE_MULT(用于计算实际容量)。
传输速度 (TRAN_SPEED):此字段表示卡的最大传输速度。通过这个值可以决定主机的传输时钟频率。
文件格式 (FILE_FORMAT):表示卡的文件系统格式,通常为FAT12、FAT16、FAT32。
擦除块大小 (ERASE_BLK_EN):表示擦除操作是否按块进行。这个字段用于确定能否进行快速擦除操作。
版本特定字段
SDHC/SDXC 特定字段:
C_SIZE: 对于SDHC和SDXC,C_SIZE字段和其他字段组合用于计算卡片的总容量。
WRITE_BL_LEN: 代表卡片的写块长度,通常为512字节。
SDSC 特定字段:
CSD1.0格式下的C_SIZE字段用于直接表示卡片的容量,但较小容量的卡片采用的是老的CSD格式。
3. 如何正确使用CSD寄存器
读取CSD寄存器
发送CMD9 (SEND_CSD):主机通过向卡发送命令CMD9来读取CSD寄存器。SD卡在接收到此命令后,返回128位的CSD寄存器内容。
解析CSD寄存器字段:主机需要根据CSD寄存器的结构版本(CSD_STRUCTURE)来解析各个字段。例如:
对于SDSC卡,使用CSD v1.0格式解析字段。
对于SDHC和SDXC卡,使用CSD v2.0格式解析字段。
根据需要调整主机设置:在成功解析CSD寄存器内容后,主机可以根据这些字段信息来调整操作模式。例如:
设置传输速率:根据TRAN_SPEED字段设定主机与卡片之间的时钟频率。
设置块大小:根据READ_BL_LEN和WRITE_BL_LEN字段,调整读写时的块大小。
示例:计算SD卡容量
可以通过以下公式来计算卡的实际容量:
对于SDSC卡:
容量 = (C_SIZE + 1) * 2^(C_SIZE_MULT + 2) * 2^READ_BL_LEN
对于SDHC/SDXC卡:
容量 = (C_SIZE + 1) * 512 KB
注意事项
兼容性问题:不同SD卡可能使用不同的CSD版本,主机需要能够处理多个版本的CSD寄存器。
时钟配置:必须根据TRAN_SPEED字段正确配置主机的SPI时钟频率,否则可能导致通信失败或性能不佳。
块操作:根据READ_BL_LEN和WRITE_BL_LEN字段的值,主机在读写时要正确设置块长度。如果块长度设置不当,可能会导致读写失败。
5. 实际应用
固件配置:在设计驱动程序时,解析CSD寄存器是初始化SD卡的关键步骤,主机根据CSD寄存器信息决定如何进行高效的读写操作。
调试信息:如果SD卡无法正常工作,检查CSD寄存器的解析是否正确可以帮助定位问题,尤其是在频率、块大小等参数配置上。
理解并正确使用CSD寄存器是驱动SDNAND卡的基础,有助于优化传输性能并确保数据可靠性。