SD卡寄存器及对应的CMD命令描述

发布于:2023-01-04 ⋅ 阅读:(904) ⋅ 点赞:(0)

目录

1.SD卡寄存器

1.1操作条件寄存器——OCR

1.2卡识别寄存器——CID

1.3特定数据寄存器——CSD

1.4相对地址寄存器——RCA

1.5驱动阶段寄存器——DSR

1.6SD配置寄存器——SCR

1.7SD状态寄存器——SSR

1.8卡状态寄存器——CSR

1.9.SD卡存储器

2.SD卡对应的CMD命令

3.SD卡对应的ACMD命令子集:


1.SD卡寄存器

      SDIO接口中定义了8个寄存器:OCR,CID,CSD,RCA,DSR,SCR,SSR(仅sdio卡支持),CSR(仅sdio卡支持)。这些寄存器只能通过对应的命令访问。
      其中OCR,CID,CSD,SCR寄存器保存了卡/内容的特定信息,RCA和DSR寄存器是配置寄存器,存储当前的配置参数。为了使能扩展功能,寄存器的保留位卡应该返回 0。

1.1操作条件寄存器——OCR

      32位的操作条件寄存器(OCR)存储了卡的VDD电压描述和2个状态信息位。包含了Vdd支持电压,并且包含了card的状态信息,用以表示该card是否power up,以及表示card是否为大容量和标准容量。

       bit 7是新定义的,用于双电压卡默认设置为0。如果双电压卡没有收到CMD 8,则该位为0,如果收到CMD 8,则该位为1。
      bit 31-卡上电状态位,这个状态位在卡的上电流程完成后设置。
      bit 30-卡容量状态位,如果是SDHC或SDXC,设置为1,如果是SDSC,设置为0。卡容量状态位只有在上电流程完成,且bit 31设置为1之后才有效。主机应该读取这个状态位来判断卡的种类。

1.2卡识别寄存器——CID

1.3特定数据寄存器——CSD

      特定数据寄存器——CSD(card specific data register),通过发送CMD9命令来读取CSD。

      CSD分为V1.0和V2.0两个版本,其中V2.0只适用于高容量SD卡,本文也是以V2.0为参考。
插入的区域名字是固定值,并且主机不一定要求涉及这些区域。这些区域的固定值使主机保持对CSD V1.0的兼容。单元类型区域中,R=可读,W(1) =写一次,W=反复写。

CSD_STRUCTURE
      记录了 CSD 的版本号,CSD version 1.0 为标准容量卡所用,CSD version 2.0 为大容量或超大容量卡所用。


最大数据传速速率(TRAN_SPEED)
      对于标准SD卡,这个区域值应该总是00110010b(32h),这个等于25Mhz, 是强制的SD卡最大操作频率。对于高速卡来说,这个值应该是01011010b(5Ah),这个值代表50Mhz,当时序通过CMD 6和CMD 0命令回到默认的时候,这个值会重新设置为032h。

·卡命令类(CCC)
      表示卡支持的命令类,class0~11。一个CCC 中的一位值为1表明支持对应的命令分类。


·读数据块最大长度(READ_BL_LEN)
      其值固定为9h,代表READ_BL_LEN=512byte。

·READ_BL_PARTIAL
      这个值固定为0,表明不允许部分块读操作,只能按块进行访问。

·WRITE_BLK_MISALIGN
      这个值固定为0,表明高容量卡中,写操作不允许越过物理块边界

·READ_BLK_MISALIGN
      这个值固定为0,表明高容量卡中,读操作不允许越过物理块边界

·DSR _IMP
      定义是否可配置驱动阶段在卡上整合了。如果设置了,驱动阶段寄存器(DSR) 就应该使用,0一不实现DSR,1一实现DSR。

·C_SIZE
      这个值有22bit,可以支持最大到2Tbyte(和通过32Bit块地址指定的最大存储空间一致) 这个参数是用来计算sd卡的用户数据区域容量的(不包括保护区域)。公式如下:
                               memory capacity = (C_SIZE+1) * 512K byte。
      鉴于V 2.0支持的最大容量是32GB,超过6bit的部分都设置为0.

·ERASE_BLK_EN
      这个值固定为1,代表着主机可以擦除1个或者多个512字节单位。

·SECTOR_SIZE
     这个值固定是7Fh,这个代表64字节。这个值同擦除操作没关系。V2.0的卡通过AU尺寸来表明存储边界,不用这个值。

·WP_GRP_SIZE
      这个值固定是0,高容量SD卡不支持写保护组。

·WP_GRP_ENABLE
      这个值固定为0,高容量卡不支持写保护组。

·R2W_FACTOR
      这个值固定是2h, 代表4倍。写超时可以通过读访问时间和R2W_FACTOR的乘积计算。但是,对于写超时,主机不应该用这个参数,而是应该用固定的250ms。

·WRITE_BL_LEN
      这个值固定是9h,代表WRITE_BL_LEN=512Byte。

·WRITE_BL_PARTIAL
      这个值固定是0,表明部分块写不支持,值支持块整数倍的写操作。

·FILE_FORMAT_GRP
      这个值固定是0,主机不应该使用这个值。

·COPY
      定义是否内容是原始的(0) ,或者是拷贝的(1)。拷贝位对于销售到终端用户的OTP和MTP设备来说是设置为1的,这表明卡的内容是拷贝的。拷贝位是一次性编程位。

·PERM_WRITE_PROTECT
      永久保护整个卡内容,不允许写和擦除(所有相关命令都无效)。默认值是0,非永久写保护。

·TMP_WRITE_PROTECT
      临时保护卡的内容,不允许写和擦除(所有相关命令都临时无效)。这个值可以设置和复位,默认值是0,非写保护。

·FILE_FORMAT
      这个值固定为0,主机不应该使用这个值

1.4相对地址寄存器——RCA

      相对地址寄存器——RCA(relative card address register)
      可写的16位卡相对地址寄存器,在卡的初始化期间,由卡向外发布的卡地址。这个地址用于卡初始化进程之后,主机同卡之间的交互寻址。
      默认的RCA寄存器值是0x0000,这个值保留着,用来通过CMD 7设置所有卡到standby状态。RCA地址默认值为0x0000,在卡识别过程中,接收到CMD 3命令后,由SD卡给自己动态分配的暂时的16bit非零值。每次接收CMD 3后,重新分配地址。

1.5驱动阶段寄存器——DSR


       驱动阶段寄存器——DSR(driver stage register)
      16位驱动阶段寄存器,是可选的,可以用来在扩展操作条件中,提高总线性能(受总线长度,传输速率和卡数目的影响)。CSD寄存器中有DSR寄存器是否使用的标志。DSR默认值是0x404。

1.6SD配置寄存器——SCR


      64bit的SD配置寄存器作为CSD寄存器的补充,提供了SD卡的特殊功能的信息。

·DATA_STAT_AFTER_ERASE
      定义了擦除之后的数据状态,可能是0或者1,由厂家定义。

·SD BUS WIDTHS
      描述了卡支持的所有DAT总线宽度,如表所示。SD卡最少应该支持1bit和4bit的宽度,所以SD卡的bit 0和bit 2必须有一个为1。


1.7SD状态寄存器——SSR

      SD状态寄存器——SSR(SD status register)
      SD卡专有特征的信息。包含了sd存储卡的专有属性并为以后的功能扩展保留了足够空间。SD 状态大小是一个512 Bit的数据块。寄存器通过DAT线发送给host的内容有16bit CRC。SD 状态作为ACMD13(CMD55 跟随CMD13)的响应通过Dat 总线发送给Host。ACMD13 只能在‘Trans_State’状态发送给卡(卡被选中)。SD 状态结构描述如下。没有使用的保留Bit 应该设成0。

1.8卡状态寄存器——CSR

      卡状态寄存器——CSR(card status register),卡状态信息。CSR(卡状态)寄存器总共 32bits,代表了执行一个命令的错误和状态信息,其信息包含在 R1 格式的应答中返回给主机。

1.9.SD卡存储器

       SD卡属于连续存储介质(NAND型Flash),它是由许多小的区块组成,每个区块都可以存储一定数量的数据,因此SD卡的读写是以“数据块”为单位进行传输的。
       n块(Block):是文件系统上的概念,指最小读写单位,块的长度是字节的整数倍,一般为512字节,有的SD卡的数据块为1024或2048等等,要修改SD卡中一个字节,必须重写整个数据块。
       n扇区:扇区是擦除单位,表示擦除操作要擦除的块的数目,通常:1扇区=128块=64KByte。注意:文件系统中,V 2.0的卡通过AU尺寸来表明存储边界,不使用扇区。
       nAU(分配单元),也称为簇,是文件系统为每一个单元地址划分的空间大小,类似于一栋大楼将它换分为若干房间,并分配相应的门牌号,其中房间的大小就是所说的分配单元大小。
       存储文件时,系统将文件按照分配单元的大小分为若干部分,比如分配单元为4096Byte,一个4096Byte的文件刚好放进一个分配单元中,如果是4097Byte的文件则需占用两个分配单元。擦除时也是同样道理,一次最小擦除一个分配单元。因此分配单元越小,越节约空间,但是浪费读取时间;分配单元越大,越节约读取时间,但是浪费空间。
       卡的容量决定最大的AU大小,默认分为:2048Byte、4096Byte,8192Byte, 16KB,32KB和64KB,最大为一个扇区即64KB,一般默认设置为4096Byte,格式化时分配单元设置。
 

2.SD卡对应的CMD命令

CMD_0:当前指令位,进入空闲状态,该指令无灰度

CMD_1:读OCR寄存器,获取OCR寄存器里面的必要信息

CMD_2:发送CMD2,验证SD卡是否接入,长反馈(CID),广播获取卡的CID信息

CMD_3:发送CMD3,读取SD卡是否接入RCA (地址),短反馈 ,  广播获取SD卡所分配的相对地址

CMD_4:可选项:  SDIO不支持DSR   

CMD_6:选择服务: 在第1部分v1.10中添加了部分强制服务

CMD_7发送CMD7,使能SD卡,如果参数值为0 , 即使取消所有选中SD卡
根据获取指定的RCA,选中SD卡,如果在选中一个卡的状态下,又选中其他的卡,那么之前的卡会自动取消选中,
如果发送地址0,则表示取消选中全部卡


CMD_8: 发送CMD8指令过去,CRC校验值与发送的值相同,说明当前SD卡支持SD2.0协议。

CMD_9:发送CMD9,读取CSD寄存器获取卡的相关信息, 获取SD相关的存储信息,如块大小,容量等

CMD_10:发送CMD10 ,  读取CID信息

CMD_12:发送CMD12,强制停止所有传输. 停止多块传输操作

CMD_13:cmd13获取卡的状态,其实本质就是读 Card_Status 寄存器 

CMD_16:设置SD卡的块大小,在CSD寄存器有对应的操作描述,

CMD17:设置SD卡按照单个区块进行操作, 使SD卡进入传输状态,读取单个块。这个命令需要附带对应的地址参数
也就是需要读取的那个地址,按照整块读取出来。

CMD18:设置SD卡按照多块进行操作 , 使SD卡进入传输状态,读取多个块,直到收到CMD12为止,当前操作
会一直按照地址顺序读下去,直到接收到停止命令。

CMD_24:使SD卡进入传输状态,写入单个块。

CMD_25:使SD卡进入传输状态,写入多个块 
其实CMD24-25 和 CMD 17-18作为相对应的方向操作,一个进行读,一个进行写。都有对应的单块和多块分别。

CMD_27:写CSD寄存器/修改CSD寄存器里的数据,(不建议)

CMD_28:设置写保护块的地址

CMD_29:擦除写保护块的地址

CMD_32::设置擦除块的起始地址,作为连续擦除机制使用

CMD_33:设置擦除块的终止地址,作为连续擦除机制使用 

CMD_38:擦除所选择的块

CMD_55    ( 说明指令 ):特殊指令前命令,在发送ACMD类指令前,需要发送此命令 



3.SD卡对应的ACMD命令子集:


要注意一下ACMD和CMD之间的区别,ACMD是特殊命令,但是发送方法和SDICARGSDICCON的命令发送一样,但是每次发送ACMD命令之前,一定要发送一条CMD55说明命令,发送CMD55之后说明下一条命令属于特殊命令集ACMD。

ACMD_6:设置SD卡的总线位宽,这个需要读取SCR确定

ACMD_13:SD卡状态

ACMD23:设置需要预擦除的数据块个数,提高SD卡多数据块写入速度

ACMD_41:获取SD电压值,作为测试当前SD卡的支持的协议,所需的电压值是否正常。

ACMD_51 :获取SD卡的SCR寄存器的值


下面SD卡状态为连续状态:

CMD55+ACMD51:SD卡发送CMD55+ACMD6配置为4bit数据传输模式(根据SCR读出来的值确定),MMC卡发送CMD6来设置位宽

CMD7 + CMD16:发送CMD7,使能SD卡,使其进入传输状态),接着发送CMD16设置块大小(根据前面读取的CSD信息确定)。

CMD17/CMD18:发送CMD17/CMD18,命令的参数需要根据初始化时所判断的卡类型填写,按字节或按块.循环读取数据,

CMD32-CMD33:连续擦除对应连续地址块的内存


网站公告

今日签到

点亮在社区的每一天
去签到