文章目录
- CID(Card IDentification)
- RCA(Relative Card Address)
- DSR(Driver Stage Register)
- CSD(Card-Specific Data)
- SCR(SD CARD Configuration Register)
- OCR(Operation Conditions Register)
- SSR(SD Status Register)
- CSR(Card Status Register)
本文章主要讲解SD2.0的各个卡寄存器(Card Register),基础概念和其它内容请参考以下文章。
SD2.0 Specification简述
每一张SD卡都有一系列SD卡寄存器,这些寄存器包含了SD卡的各种信息,每个寄存器描述的内容信息大体如下图所示
CID(Card IDentification)
CID大小为128 bits,主要包含的是上电识别过程中会用到的一些身份信息,这个过程是通过CMD2命令来获取CID的(详情参考文章:SD2.0 Specification之上电初始化),每一张可写可读卡都有自己唯一的身份信息,下图是CID各个域的大小及含义。
- MID
制造商的ID编码,只有8 bits大小,这个编码号由SD-3C, LLC组织控制和分配,确保唯一性。 - OID
2个字符大小的OEM/Application ID,也是由SD-3C, LLC组织控制和分配,确保唯一性。 - PNM
生产名,5字节大小的字符串。 - PRV
生产版本号,8 bits大小。如0110 0011表示版本6.2 - PSN
序列号,32 bits。 - MDT
生产日期,12 bits。[19:12] 表示年,0表示2000年; [11:8]表示月,1表示1月。如00000001 0100表示2001年4月。 - CRC
对前面120 bits进行CRC7计算所得的校验值。
RCA(Relative Card Address)
RCA是SD卡在上电识别过程告诉主机的寻址地址,主机在拿到该地址后可以通过该地址单独访问该卡。这个地址值默认是0,主机可以通过发CMD3命令让SD卡修改RCA。
DSR(Driver Stage Register)
这个寄存器跟输出驱动力有关,是可选的,SD卡不一定有实现相关功能,CSD里有定义是否支持DSR。默认值是0x0404,可通过CMD4修改该寄存器。
CSD(Card-Specific Data)
CSD数据结构有2个版本,分别是1.0和2.0,1.0对应的是SD1.x标准的卡或者SD2.0的标准容量卡,2.0对应SD2.0标准的大容量卡。
- CSD_STRUCTURE
表示CSD的版本,具体数值含义如下图所示
- TAAC
读访问时间计算所需的一个数值。
最大访问时间Nac(max)= 100* ((TAAC * fpp) + (100 * NSAC)) , fpp是接口时钟频率,该公式是针对标准容量卡的。大容量卡的读访问时间固定不能超过100ms。
- NSAC
读访问时间计算所需的一个数值。 - TRAN_SPEED
表示每一根DATA线上的最大传输速率。
这个值通常是32h或5Ah,0_0110_010b (32h) 刚好表示最大操作频率是25MHz。0_1011_010b (5Ah) 刚好表示最大操作频率是50MHz,在使用CMD6切换或者CMD0复位后,该值会被切换到32h。 - CCC
表明SD卡支持哪些类别的命令,对应的位置1表示支持相应类别的命令。
- READ_BL_LEN
最大块读长度。
- READ_BL_PARTIAL (always = 1 in SD Memory Card)
总是支持块部分读,最小块读是1字节。 - WRITE_BLK_MISALIGN
定义一个命令要写入的数据块是否可以分布在设备的多个物理块上。0表示不允许,1表示允许。 - READ_BLK_MISALIGN
定义一个命令要读出的数据块是否可以分布在设备的多个物理块上。0表示不允许,1表示允许。 - DSR_IMP
定义是否存在DSR需要执行。0表示没有,1表示有。 - C_SIZE
卡容量 = BLOCKNR * BLOCK_LEN
BLOCKNR = (C_SIZE+1) * MULT
MULT = 2 ^ C_SIZE_MULT+2 ,(C_SIZE_MULT < 8)
BLOCK_LEN = 2 ^ READ_BL_LEN, (READ_BL_LEN < 12)
- VDD_R_CURR_MIN, VDD_W_CURR_MIN
- VDD_R_CURR_MAX, VDD_W_CURR_MAX
- C_SIZE_MULT
与前面计算容量相关。
- ERASE_BLK_EN
这1 bit决定擦除操作的单位粒度。一种是以512 byte为单位,擦除的时候擦除一个或多个512 byte大小的块,一种是以扇区(SECTOR_SIZE)为单位,扇区(SECTOR_SIZE)记录的是块数量,在这种情况下,擦除操作擦除的是一个或多个扇区(SECTOR_SIZE)的块。
ERASE_BLK_EN = 0,擦除其实地址是5,结束地址是40,SECTOR_SIZE = 31 ,那实际的擦除效果就是地址0~63的数据都将被擦除。即擦除地址所涉及的扇区都会被擦除。
ERASE_BLK_EN = 1,擦除其实地址是5,结束地址是40,那实际只有地址5~40的数据块被擦除。
- SECTOR_SIZE
记录每个擦除扇区的块数量。该值为0表示1个扇区包含一个块,该值为127时表示1个扇区有128个块。 - WP_GRP_SIZE
记录一个写保护组的扇区数量。该值为0表示1个写保护组包含一个扇区,该值为127时表示1个写保护组有128个扇区。 - WP_GRP_ENABLE
0表示没有写保护组。 - R2W_FACTOR
定义典型块写时间为块读时间的倍数关系,具体如下。
- WRITE_BL_LEN
最大块写长度,WRITE_BL_LEN和READ_BL_LEN总是相等的,具体含义如下图所示
- WRITE_BL_PARTIAL
是否支持块部分写。
WRITE_BL_PARTIAL=0表示只支持块写,块大小由WRITE_BL_LEN决定
WRITE_BL_PARTIAL=1表示支持小块写,最小可以只有1 byte。 - FILE_FORMAT_GRP
表示所选文件格式组,与下面的FILE_FORMAT共同组成完整信息 - COPY
表明内容时原始数据(COPY=0)还是拷贝数据(COPY=1),这1 bit只能写1次。 - PERM_WRITE_PROTECT
表示卡内容是不是永久写保护,0表示不保护。 - FILE_FORMAT
表示文件格式,与前面的FILE_FORMAT_GRP组成完整含义。
更详细的信息在SD Memory Card File System specification里面。 - CRC
对前面120 bits进行CRC7计算所得的校验值。
- TAAC
固定为0Eh,表示1ms。主机不使用 TAAC、NSAC、R2W_FACTOR计算超时时间,而是使用固定值,读为100ms,写为250ms。 - NSAC
固定为00h。 - TRAN_SPEED
跟CSD V1.0的含义一样。 - CCC
跟CSD V1.0的含义一样。 - READ_BL_LEN
固定为9h,表示块读大小为512 byte - READ_BL_PARTIAL
固定为0,表示只支持块完整读,不支持块部分读。 - WRITE_BLK_MISALIGN
固定为0,表示禁止跨块不对齐写。 - READ_BLK_MISALIGN
固定为0,表示禁止跨块不对齐读。 - DSR_IMP
跟CSD V1.0的含义一样。 - C_SIZE
扩展到22 bits,最大可以支持2TByte
memory capacity = (C_SIZE+1) * 512K byte - ERASE_BLK_EN
固定为1,表示擦除单位为512 bytes - SECTOR_SIZE
固定为7Fh,表示扇区大小为64 KBytes - WP_GRP_SIZE
固定为00h,大容量卡不支持该功能。 - WP_GRP_ENABLE
固定为00h,大容量卡不支持该功能。 - R2W_FACTOR
固定为2h,表示4倍。(读访问时间 * R2W_FACTOR)就是写超时时间,但主机应该使用250ms作为超时时间。 - WRITE_BL_LEN
固定为9h,表示块写大小为512 byte。 - WRITE_BL_PARTIAL
固定为0,表示只支持块完整写,不支持块部分写。 - FILE_FORMAT_GRP
固定为0,不使用。 - COPY
跟CSD V1.0的含义一样。 - PERM_WRITE_PROTECT
跟CSD V1.0的含义一样。 - TMP_WRITE_PROTECT
跟CSD V1.0的含义一样。 - FILE_FORMAT
跟CSD V1.0的含义一样。 - CRC
跟CSD V1.0的含义一样。
SCR(SD CARD Configuration Register)
OCR(Operation Conditions Register)
该寄存器记录SD支持的电压范围以及容量类别,同时在上电识别过程会标记SD卡是否已准备好(详情参考文章:SD2.0 Specification之上电初始化)
SSR(SD Status Register)
待续
CSR(Card Status Register)
待续