SD卡bus协议详解——SDIO协议入门与实践(二)

前面一章介绍了sd卡,但sdio控制器如何让sd卡是工作起来,如何从sd nand里读取想要的数据,本文将简单从头梳理下sd卡总线协议。另外,tf卡和sd卡这里不做区分,统一用sd卡代替(一般我们也叫tf卡为小卡,sd卡为大卡)。

SD卡认识——SDIO协议入门与实践(一)
SD卡bus协议详解——SDIO协议入门与实践(二)

sd卡协议内容很多,更新到目前pcie接口支持了,该部分并不介绍,另外UHS-II协议不涉及,spi接口协议也不涉及,这里并不是要把协议一一的介绍,协议很多地方我也没有详细阅读;所以这是帮助软件人员入门,以及快速查阅使用的。

1 命令

所有的命令和响应都通过SD存储卡的CMD行发送。命令传输总是以与命令码字对应的位字符串的左位开始。

1.1 命令格式

在这里插入图片描述
SD命令组成如下:

  • 起始位和停止位:命令的主体包含在起始位与终止位之间,它们都包含一个数据位,起始位为0,终止位为1.
  • 传输标志:用于区分传输方向,该位为1时表示命令,方向为主机传输到SD卡,该位为0时表示响应,方向为SD卡传输到主机。(1写0读)
  • 命令主体内容包括命令,地址信息/参数和CRC校验三个部分。
    1. 命令索引:它固定占用6Bit,所以总共有64个命令(代号CMD0-CMD63) ,每个命令都有特定的用途,部分命令不适用于SD卡操作,只是专门用于MMC卡或者SD I/O卡,命令是为特定的操作或特定类型的SD卡保留的。例如,CMD8是一个用于确定卡是否支持高容量(SDHC或SDXC)的命令
    2. 命令参数:每个命令由32bit参数用于命令附加内容,例如,广播命令没有地址信息,这32bit用于指定参数,而寻址命令这32bit用于指定目标SD卡的地址
    3. CRC7校验:长度为7bit的校验位用于验证命令传输内容正确性,如果发生外部干扰导致传输数据个别位状态改变将导致校准失败,也意味着命令传输失败,SD卡不执行命令。

后面会对SD卡初始化以及读写常用的具体命令说明

1.2 命令类型

协议定义了四种类型的命令来控制SD卡:

  • 无响应广播命令(bc),发送到所有卡,不返回任务响应
  • 带响应广播命令(bcr),发送到所有卡,同时接受来自所有卡响应
  • 寻址命令(ac),发送到选定卡,DAT线无数据传输
  • 寻址数据传输命令(adtc),发送到选定卡,DAT线有数据传输

另外,SD卡主机模块系统旨在为各种应用程序类型提供一个标准接口。在此环境中,需要有特定的客户/应用程序功能。为实现这些功能,在标准中定义了两种类型的通用命令;特定应用命令(ACMD)常规命令(GEN_CMD)要使用SD卡制造商特定的ACMD命令,如ACMD6,需要在发送该命令之前无发送CMD55命令 ,告知SD卡接下来的命令为特定应用命令。CMD55命令只对紧接的第一个命令有效,SD卡如果检测到CMD55之后的第一条命令为ACMD则执行其特定应用功能,如果检测发现不是ACMD命令,则执行标准命令。

1.3 命令分类

SD存储卡系统的命令集分为几个类。每个类都支持一组板卡的功能。
根据板卡支持的命令确定了CCC的设置。与受支持的命令号对应的CCC位被设置为1。CCC中包含强制命令的类总是设置为1。具有特定功能的卡可能需要支持一些可选的命令。例如,sdio卡应支持CMD5,sd卡需支持CMD6

类0、2、4、5、7和8是强制性的,并应由所有SD存储卡支持。其他的类都是可选的。支持的卡命令类(CCC)被编码为每个卡的卡特定数据(CSD)寄存器中的一个参数,为主机提供关于如何访问卡的信息。

替代文本 替代文本

1.4 响应

所有响应都通过CMD线由SD卡向主机发出,部分命令要求SD卡作出响应,这些响应多用于反馈SD卡的状态。

SDIO总共有7个响应类型(代号R1-R7),其中SD卡没有R4、R5类型响应(sdio卡使用)。特定的命令对应有特定的响应类型,比如当主机发送CMD3命令时,可以得到响应R6。

根据响应内容大小可以分为短响应和长响应。短响应是48bit长度,只有R2类型是长响应,其长度136bit.各个类型响应具体情况见具体内容。除了R3类型之外,其他响应的使用CRC7校验来校验,对于R2类型是使用CID和CSD寄存器内部CRC7。

响应始终以起始位开始(始终为0),接着是指示传输方向的位(SD卡到主机: 0)。以“x”表示的传输内容。除R3型外,所有响应均受CRC保护。每个命令码字都以结束位终止(始终为1)。

1.4.1 R1 (normal response command)

长度为48位。
位45:40表示要响应的命令的索引,该值被解释为一个二进制编码号(在0到63之间)。
板卡的状态以32位的形式进行编码。
注意,如果涉及到卡的数据传输,那么在每个数据块传输后,数据线上可能会出现忙信号。
数据块传输后,主机应检查是否有忙状态。

替代文本

1.4.2 R1b

R1b与R1相同,在数据线上传输一个可选的忙状态信号。
卡在接收这些命令之前的状态可能会进入busy状态。主机应在响应时检查是否繁忙。

1.4.3 R2(CID,CSD寄存器)

长度为136位。
CID寄存器的内容作为对命令CMD2和CMD10的响应被发送。
CSD寄存器的内容作为响应被发送到CMD9。
只有CID和CSD的位[127…1]被传输,这些寄存器的保留位[0]被响应的结束位所取代。

替代文本

1.4.4 R3 (OCR寄存器)

代码长度为48位。OCR寄存器的内容作为响应被发送到ACMD41。

替代文本

1.4.5 R6(已发布的RCA响应)

代码长度为48位。
位45:40表示要响应的命令的索引——在这种情况下,它将是“000011”(连同状态位中的位5,它意味着= CMD3)。
参数字段的16个MSB位用于已发布的RCA号。

替代文本

1.4.6 R7(卡接口条件)

代码长度为48位。
板卡支持电压信息由CMD8的响应发送。第19- 16位表示板卡所支持的电压范围。接受提供电压的卡返回R7响应。
在响应中,卡回波参数中设置的电压范围和检查模式。

替代文本

NOTE:
上面的定义适用于标准的sdio接口的sd卡(包括tf卡),目前最新的协议是支持pcie接口的,下图就是最新的R7,这里只是贴出来简单提下。
在这里插入图片描述

1.5 SD卡物理结构

SD卡从物理结构看包括 5 个部分,分别为存储单元、存储单元接口、电源检测、卡及接口控制器和对外接口,具体见下图。
• 存储单元是存储数据部件,存储单元通过存储单元接口与卡控制单元进行数据传输
• 存储单元接口是接口控制器与存储单元的数据交互通道
• 电源检测单元保证 SD NAND工作在合适的电压下,如出现掉电或上电状态时,它会使控制单元和存储单元接口复位
• 卡及接口控制单元控制 SDNAND的运行状态,它包括 8 个寄存器
• 对外接口单元控制 SD NAND引脚的输入输出,一般包含SDIO接口和SPI接口

替代文本
引脚编号sd模式spi模式
nametypenotenametypenote
1CD/DAT3IO/PP卡检测/数据线3CSI片选
2CMDPP命令/回应DII数据输入
3Vss1S接地1Vss1S接地1
4VddS电源VddS电源
5CLKI时钟SCKI时钟
6Vss2S接地2Vss2S接地2
7DAT0IO/PP数据线0DOO/PP数据输出
8DAT1IO/PP数据线1Rsv
9DAT2IO/PP数据线2Rsv

1.6 寄存器

SD卡总共有8个寄存器,用于设定或表示SD卡信息。
这些寄存器只能通过对应的命令访问,SDIO定义64个命令,每个命令都有特殊意义,可以实现某一特定功能,SD卡接收到命令后,根据命令要求对SD卡内部寄存器进行修改,程序控制中只需要发送组合命令就可以实现SD卡的控制以及读写操作。

名称bit宽度描述
CID128卡识别号(Card identification number):用来识别的卡的个体号码(唯一的)
RCA16相对地址(Relative card address):卡的本地系统地址,初始化时,动态地由卡建议,主机核准
DSR16驱动级寄存器(Driver Stage Register):配置卡的输出驱动
CSD128卡的特定数据(Card Specific Data):卡的操作条件信息
SCR64SD配置寄存器(CD Configuration Register):SD卡特殊特性信息
OCR32操作条件寄存器(Operation conditiongs register)
SSR512SD状态(SD Status):SD卡专有特征的信息
CSR32卡状态(Card Status):卡状态信息

对寄存器简单罗列下,不做详细说明,有需要可以参看sd卡spec第5章以及第4.10章节卡状态

1.6.1 OCR Registers

替代文本

由于后续更新卡驱动,后续我这里贴的图都是最新的协议(这里支持UHS-I支持电压切换1.8V,以及更大卡容量SDUC状态等)

1.6.2 CID register

卡标识(CID)寄存器为128位宽。它包含在卡识别阶段使用的卡识别信息。每张读写(RW)卡都应具有唯一的识别号。CID寄存器的结构将在以下各段中定义。

1.6.3 CSD Register

这里列举Version2.0的CSD寄存器,1.0和3.0可以参考sd卡spec
在这里插入图片描述

1.6.4 RCA register

可写的16位相对卡地址寄存器携带在卡识别期间由卡发布的卡地址。此地址用于卡识别过程后的寻址主机卡通信。RCA寄存器的默认值为0x0000。保留值0x0000,以将所有板卡设置为CMD7的备用状态。在UHS-II模式下,使用节点ID作为RCA。

1.6.5 DSR register (Optional)

16位驱动器级寄存器在spec中有详细的描述。它可以选择用于提高延长操作条件下的总线性能(取决于诸如总线长度、传输速率或板卡的数量等参数)。CSD寄存器携带着有关DSR寄存器使用情况的信息。DSR寄存器的默认值为0x404。

1.6.6 SCR register

除了CSD寄存器之外,还有另一个名为SD CARD配置寄存器(SCR)的配置寄存器。SCR提供了关于SD存储卡配置到给定的卡的特殊功能的信息。SCR寄存器的大小为64位。此寄存器应由SD存储卡制造商在工厂内设置。下表描述了SCR寄存器的内容

1.6.7 CSR register

响应格式R1应包含一个名为卡状态的32位字段,作为对CMD13的响应,参数为b[15]=‘0’。此字段旨在将板卡的状态信息(可以存储在本地状态寄存器中)传输到主机。如果没有另行指定,则状态条目总是与以前发出的命令相关。表4-42定义了状态的不同条目。未使用的预留位应设置为0。表中的类型和清除条件字段缩写如下:

1.6.8 SSR register

SD状态包含与SD存储卡专有功能相关的状态位,并可能用于未来特定于应用程序的使用。SD状态的大小是一个512位的数据块。该寄存器的内容通过DAT总线与一个16位CRC一起传输到主机。SD状态通过DAT总线发送到主机,作为对ACMD13(CMD55和CMD13)的响应。ACMD13只能以“tran_state”发送到卡(选择卡)。

NOTE:
CSR和SSR参考4.10.1 Card Status、4.10.2 SD Status

2 SD存储卡的功能说明

主机与卡之间的所有通信都由主机(主)控制。主机发送两种类型的命令:

  • 广播和寻址(点对点)命令。
    广播命令广播命令适用于所有板卡。其中一些命令需要进行响应。
  • 寻址(点对点)命令寻址命令
    寻址命令被发送到寻址卡,并引起该卡的响应。

为SD卡系统(主机和存储卡)定义了两种操作模式:

  • 卡识别模式
    重置后,主机将处于卡识别模式,并在总线上寻找新的卡。重置后,卡将处于此模式,直到接收到SEND_RCA命令(CMD3)。
  • 数据传输模式
  • 卡将在其RCA首次发布后进入数据传输模式。主机在识别总线上所有卡后进入数据传输模式。

下图显示了操作模式和SD卡状态之间的关系。SD存储卡状态图中的每个状态都与一种操作模式相关联:
在这里插入图片描述

2.1 卡识别模式

在这里插入图片描述

在卡识别模式下,主机重置所有处于卡识别模式的卡,验证操作电压范围,识别卡,并要求它们发布相对卡地址(RCA)。此操作将在每个卡自己的CMD线上分别执行。卡识别模式下的所有数据通信仅使用命令行(CMD)。
另外在卡识别过程中,卡应按识别时钟速率运行(小于等于400KHz)

2.1.1 上电

设备应在检测VDD min1 ms内接受第一个命令。在接收到第一个命令之前,设备最多使用74个时钟进行准备。
在这里插入图片描述

之前很多的sdio接口的控制器,对这里并未处理,都是由软件来保证sd卡在接收到74个clock之后在开始初始化,现在很多的控制器硬件已经对这里进行处理,开启power up后会等若干(可配置)个clock后才开始发送第一条命令。

2.1.2 卡重置

CMDtypeArgumentrespabbreviationcommand description
CMD0bcstaff bit[31:0]-GO_IDLE_STATEResets all cards to idle state

在SD模式下,上电完成后,既可以发送第一条命令,命令GO_IDLE_STATE(CMD0)可以将每个卡设置为空闲状态,而不管当前卡的状态如何。但是如果卡处于非活动状态,则不受此命令的影响。

在主机上电后,所有的卡都处于空闲状态,包括以前处于非活动状态的卡。

上电或CMD0后,所有板卡的CMD线都处于输入模式,等待下一个命令的开始位。这些卡的初始化使用了一个默认的相对卡地址(RCA=0x0000)和一个默认的驱动程序强度与400 KHz时钟频率。在3.3V信令的情况下,如果支持并选择了最高驱动电流能力,则由驱动器级寄存器(DSR)指定默认驱动器强度。

对于1.8V信号,默认驱动器强度由B型驱动器指定。
在UHS-II模式下,CMD0不会将RCA清除为0x0000,并保留其设备ID,这将由枚举来确定(普通sd卡不用关心)

2.1.3 运行条件检查

CMDtypeArgumentrespabbreviationcommand description
CMD8bcr[31:12]reserved bits
[11:8]supply voltage(VHS)
[7:0]check pattern
[11:8] supply voltage(VHS)
R7SEND_IF_CONDSends SD Memory Card interface condition, which includes host supply voltage information and asks the card whether card supports voltage. Reserved bits shall be set to ‘0’.

在这里插入图片描述
(暂时不用关心pcie的bit)

在主机与卡之间的通信开始时,主机可能不知道卡支持的电压,而卡可能不知道它是否支持当前提供的电压。主机发出重置命令(CMD0),并假设SD卡支持。为了验证电压,在物理层规范版本2.00开始义了新命令(CMD8)。SEND_IF_COND(CMD8)用于检查SD卡接口的运行状态。SD卡通过分析CMD8的参数来检查操作条件的有效性,主机通过分析CMD8的响应来检查其有效性。

供电电压由参数中的VHS域表示。该卡假定VHS中规定的电压作为电流供应电压。在任何给定时间,仅将1位VHS设置为1(支持2.7-3.6V电压)。主机同时使用CRC和检查模式来验证主机与SD卡之间通信的有效性。

如果卡可以在供电电压上操作,返回响应电源电压和命令参数中设置的检查模式;如果卡不能在提供的电压下工作,则返回无响应并保持空闲状态。
另外必须在第一个ACMD41之前发出CMD8来初始化SD卡

CMDtypeArgumentrespabbreviationcommand description
ACMD41bcr[31]reserved bit
[30]HCS(OCR[30])
[29]reserved for eSD
[28]XPC
[27:25]reserved bits
[24]S18R
[23:0] VDD Voltage Window(OCR[23:0])
R3SD_SEND_OP_CONDSends host capacity support information (HCS) and asks the accessed card to send its operating condition register (OCR) content in the response on the CMD line. HCS is effective when card receives SEND_IF_COND command. Sends request to switch to 1.8V signaling (S18R). Reserved bit shall be set to ‘0’. CCS bit is assigned to OCR[30]. XPC controls the maximum power in the default speed mode of SDXC and SDUC card. XPC=0 means 0.36W (100mA at 3.6V on VDD1) (max.) but speed class is not supported. XPC=1 means 0.54W (150mA at 3.6V on VDD1) (max.) and speed class is supported.
  • Argument of ACMD41
    在这里插入图片描述
  • Response of ACMD41 (R3)
    在这里插入图片描述

SD_SEND_OP_COND(ACMD41)旨在为SD存储卡主机提供一种机制来识别和拒绝与主机所需的VDD范围不匹配的存储卡。这是通过主机发送所需的VDD电压窗口作为此命令的操作数来完成的(见第5.1节)。不能在指定范围内执行数据传输的卡,应放弃进一步的总线操作,进入非活动状态。OCR登记册中的级别应相应定义(见第5.1节)。请注意,ACMD41是应用程序特定的命令;因此,APP_CMD(CMD55)应始终放在ACMD41之前。在idle_状态下,CMD55所使用的RCA应为该卡的默认RCA = 0x0000。

CMDtypeArgumentrespabbreviationcommand description
CMD55ac[31:16] RCA
[15:0] stuff bits
R1APP_CMDIndicates to the card that the next command is an application specific command rather than a standard command

总结:

如果板卡响应CMD8,则ACMD41的响应包括中国化学会字段信息。当卡返回就绪时,中国化学会有效(繁忙位设置为1)。CCS=0表示该卡为SDSC。CCS=1表示板卡为SDHC或SDXC。

总线激活后,主机启动卡初始化和识别过程。初始化过程从SD_SEND_OP_COND(ACMD41)开始,通过设置其操作条件和OCR中的HCS位来实现。HCS(主机容量支持)位设置为1,表示主机支持SDHC或SDXC卡。HCS(主机容量支持)位设置为0,表示主机既不支持SDHC卡,也不支持SDXC卡。

2.1.4 卡片初始化和识别流程

主机对系统中的所有新板卡执行相同的初始化序列。不兼容的板卡被发送到非活动状态。然后,主机向每张卡发出“ALL_SEND_CID(CMD2)”命令,以获取其唯一的卡标识(CID)号。未知的卡(即处于就绪状态)将其CID号作为响应发送(在CMD行上)。在CID被卡片发送后,它进入了识别状态。此后,主机发出CMD3(SEND_RELATIVE_ADDR),要求卡发布一个新的相对卡地址(RCA),该地址比CID短,用于在未来的数据传输模式中对卡进行地址处理。一旦收到RCA,板卡状态将变为备用状态。此时,如果主机想要分配另一个RCA号码,它可以通过向卡发送另一个CMD3命令来要求卡发布一个新的号码。最后发布的RCA是该卡的实际RCA号。主机重复识别过程,即对系统中的每个卡使用CMD2和CMD3的循环。SDXC的初始化与SDHC相同。SDXC卡的用户区域容量由C_SIZE指定,且应大于或等于32GB。

如果卡是UHS-I就需要控制器发送CMD11,来查看卡是否支持1.8V电压,以及进行后续电压切换的工作,电压切换需要接电压转换芯片,配合控制器来切换电压(st就做了该电压转化芯片),虽然我们控制器支持电压切换,但是芯片没有做电压转换的模块,所以,我这里只是加到编程模型里了,并未实际测试,所以该命令暂不关心。

主机对系统中SD卡执行相同的初始化序列。
不兼容的板卡被发送到非活动状态。然后,主机向每张卡发出“ALL_SEND_CID(CMD2)”命令,以获取其唯一的卡标识(CID)号。未知的卡(即处于就绪状态)将其CID号作为响应发送(在CMD行上)。在CID被卡片发送后,它进入了识别状态。

CMDtypeArgumentrespabbreviationcommand description
CMD2bcr[31:0] stuff bitsR2ALL_SEND_CIDAsks any card to send the CID numbers on the CMD line (any card that is connected to the host will respond)

此后,主机发出CMD3(SEND_RELATIVE_ADDR),请求SD卡返回一个新的相对卡地址(RCA),该RCA用于在未来的数据传输模式中对卡进行地址处理。一旦收到正确RCA,SD卡状态将变为可用状态。另外,如果主机想要分配另一个RCA号码给SD卡,可以通过向卡发送CMD3命令来要求卡返回一个新的号码。最后一次返回的RCA是该卡的实际RCA号。在接收到CMD3并正确返回RCA后,SD卡进入stand-by状态

CMDtypeArgumentrespabbreviationcommand description
CMD2bcr[31:0] stuff bitsR6SEND_RELATIVE_ADDRAsk the card to publish a new relative address (RCA)

2.2 数据传输模式

在这里插入图片描述

2.2.1 stand-by状态操作

stand-by状态下,可以进行的操作 有CMD4、9、10、3和CMD7,其中CMD7(正确RCA)会使卡的状态由standby跳转到transfer 状态。另外的命令则是不会使卡跳转出stand-by状态。
在卡识别模式结束之前,控制器随路时钟频率要保持在fOD,因为一些卡在卡识别模式期间可能有工作频率限制。而在在数据传输模式下,主机可以在fPP频率范围内操作板卡(具体参考spec6.7章)。

主机发出SEND_CSD(CMD9)以获取卡特定数据(CSD寄存器),例如块长度、卡存储容量等。

CMDtypeArgumentrespabbreviationcommand description
CMD9bcr[31:16] RCA
[15:0] stuff bits
R2SEND_CSDAddressed card sends its card-specific data (CSD) on the CMD line.

广播命令SET_DSR(CMD4)配置所有已识别的板卡的驱动程序阶段。它根据应用程序总线的布局(长度)、总线上的卡的数量和数据传输的频率来编写它们的DSR寄存器。SET_DSR命令是可选操作,一般情况下,控制器不需要设置。

CMDtypeArgumentrespabbreviationcommand description
CMD4bc[31:16] DSR
[15:0] stuff bits
-SET_DSRPrograms the DSR of all cards

CMD10在在获取CID信息上,可以看做是带参数(RCA)的CMD2,也是用来获取SD卡的CID。只是也就是说CMD2是广播命令,CMD10是单播的命令,一般情况下,一个控制器直接一张SD卡,CMD2获取到正确CID信息就不需要在发送CMD10了。

CMDtypeArgumentrespabbreviationcommand description
CMD10ac[31:16] DSR
[15:0] stuff bits
R2SEND_CIDAddressed card sends its card identification (CID) on CMD the line.

2.2.2 Transter状态

CMD7用于选择一张卡并将其置入传输状态。在固定的时间内,只有一张卡可以处于传输状态。如果先前选择的板卡处于传输状态,则它与主机的连接将被释放,并且它将移动回stand-by状态。当CMD7发出保留相对卡地址“0x0000”时,所有卡都返回备用状态。也就是说带有"正确"RCA的CMD7会将卡状态从stand-by切换到transter,接收到“错误”和RCA=0x0000的CMD7时,卡将从transter切换到stand-by状态。

CMDtypeArgumentrespabbreviationcommand description
CMD7ac[31:16] RCA
[15:0] stuff bits
R1b (only from the selected card)SELECT/DESELECT_CARDCommand toggles a card between the stand-by and transfer states or between the programming and disconnect states. In both cases, the card is selected by its own relative address and gets deselected by any other address; address 0 deselects all. In the case that the RCA equals 0, then the host may do one of the following:
Use other RCA number to perform card de-selection.
Re-send CMD3 to change its RCA number to other than 0 and then use CMD7 with RCA=0 for card deselection.

各种数据传输模式之间的关系总结如下。

  • 所有数据读取命令都可以通过停止命令(CMD12)随时中止。数据传输将终止,并且数据卡将返回到传输状态。读命令包括:单块读(CMD17)、多块读(CMD18)、发送写保护(CMD30)、发送scr(ACMD51)和读模式下的通用命令(CMD56)。
  • 所有数据写入命令可以通过停止命令12(CMD)随时中止。在通过CMD7取消选择板卡之前,应停止写入命令。写命令包括:单块写(CMD24和CMD25)、编辑CSD(CMD27)、锁定/解锁命令(CMD42)和写模式下的通用命令(CMD56)。
  • 一旦数据传输完成,板卡将退出数据写入状态,并跳转到到编辑状态(传输成功)或传输状态(传输失败)。
  • 如果一个块写入操作停止,并且最后一个块的块长度和CRC有效,则将对数据进行编程。
  • SD卡可以为块写提供缓冲功能。这意味着在前一个块被编程写入NAND时,下一个块可以被发送到卡。如果所有写缓冲区已满,只要卡处于编程状态(参见SD存储卡状态图 ),DAT0线将保持在低电平(BUSY)。
  • 写CSD、写保护和擦除没有缓冲选项。这意味着当卡忙于服务这些命令中的任何一个时,将不会接受其他数据传输命令。只要卡繁忙且处于编程状态,DAT0将保持较低。实际上,如果卡的CMD和DAT0行保持分开,主机保持繁忙的DAT0行与其他DAT0行(其他卡)断开,主机可以在卡繁忙时访问其他卡。
  • 当板卡正在编程时,不允许使用参数设置命令。
  • 参数设置命令。参数设置命令包括:设置块长度(CMD16)、擦除块开始(CMD32)和擦除块结束(CMD33)。当板卡正在编程时,不允许执行
  • 当板卡正在编程时,不允许读取命令。
  • 将另一张板卡从备用状态移动到传输状态(使用CMD7)将不会终止擦除和编程操作。板卡将切换到断开状态,并将释放DAT线路。
  • 在断开状态下使用CMD7重新选择卡。在这种情况下,板卡将移动到编程状态,并重新激活繁忙的指示。
  • 重置板卡(使用CMD0或CMD15)将终止任何挂起或活动的编程操作。这可能会破坏板卡上的数据内容。防止这种责任是这种情况发生。
  • CMD34-37、CMD50和CMD57被预留,用于SD命令系统的扩展。这些命令的状态转换都在每个命令系统规范中进行了定义。

2.2.3 总线宽配置

CMDtypeArgumentrespabbreviationcommand description
ACMD6ac[31:2] stuff bits
[1:0]bus width
R1SET_BUS_WIDTHDefines the data bus width (‘00’=1bit or ‘10’=4 bits bus) to be used for data transfer. The allowed data bus widths are given in SCR register.

可以使用ACMD6选择/取消选择宽总线(4位总线宽度)操作模式。
上电或GO_IDLE(CMD0)后,SD卡为1位总线宽度。为了改变总线宽度,应满足两个条件:
1. 板卡处于“tran状态”。
2. 卡未被锁定。
一个被锁定的卡将响应ACMD6作为非法命令。

2.2.4 数据读写

当没有传输数据时,数据线保持高电平。
SD卡的读取操作可能会因关闭电源而中断,但是SD卡会保证数据在所有条件下都不会被销毁,除非主机发出的写入或擦除操作。
SD卡传输以块为单位,block大小可以通过CMD16配置

CMDtypeArgumentrespabbreviationcommand description
CMD16ac[31:0] block lengthR1SET_BLOCKLENIn the case of a Standard Capacity SD Memory Card, this command sets the block length (in bytes) for all following block commands (read, write, lock). Default block length is fixed to 512 Bytes. Set length is valid for memory access commands only if partial block read operation are allowed in CSD. In the case of a High Capacity SD Memory Card, block length set by CMD16 command does not affect the memory read and write commands. Always 512 Bytes fixed block length is used. This command is effective for LOCK_UNLOCK command. In both cases, if block length is set larger than 512Bytes, the card sets the BLOCK_LEN_ERROR bit.

NOTE:
这里仅是罗列写基础操作,更具体操作细节的可以参考spec。

2.2.4.1 数据读取

SD卡读取是面向块的数据传输。数据传输的基本单位是一个块,其最大大小总是512字节。可以传输起始和结束地址完全包含在512字节边界内的较小块。

CMDtypeArgumentrespabbreviationcommand description
CMD17adtc[31:0] dataaddressR1READ_SINGLE_BLOCKIn the case of a Standard Capacity SD Memory Card, this command, this command reads a block of the size selected by the SET_BLOCKLEN command. 1 In the case of a High Capacity Card, block length is fixed 512 Bytes regardless of the SET_BLOCKLEN command.
CMD18adtc[31:0] data addressR1READ_MULTIPLE_BLOCKContinuously transfers data blocks from card to host until interrupted by a STOP_TRANSMISSION command. Block length is specified the same as READ_SINGLE_BLOCK command.

CMD17(READ_SINGLE_BLOCK)启动一个块读取,在完成传输后,板卡返回到传输状态。
CMD18(READ_MULTIPLE_BLOCK)开始了几个连续的数据块的传输。块将持续传输,直到发出STOP_TRANSMISSION命令(CMD12)。

2.2.4.2 数据写入

写入数据传输格式类似于数据读取格式。对于面向块的写数据国产,CRC检查位被添加到每个数据块中。

CMDtypeArgumentrespabbreviationcommand description
CMD24adtc[31:0] data addressR1WRITE_BLOCKIn the case of a Standard Capacity SD Memory Card, this command writes a block of the size selected by the SET_BLOCKLEN command. In the case of a High Capacity Card, block length is fixed 512 Bytes regardless of the SET_BLOCKLEN command.
CMD25adtc[31:0] data addressR1WRITE_MULTIPLE_BLOCKContinuously writes blocks of data until a STOP_TRANSMISSION follows. Block length is specified the same as WRITE_BLOCK command.
CMD27adtc[31:0]stuff bitsR1PROGRAM_CSDProgramming of the programmable bits of the CSD.
2.2.4.3 擦除
1. ERASE

为了提高数据吞吐量,我们希望同时擦除许多写入块。这些写块的识别可以通过ERASE_WR_BLK_START(CMD32)、ERASE_WR_BLK_END(CMD33)命令来完成。
主机应遵循以下命令顺序: ERASE_WR_BLK_START、ERASE_WR_BLK_END和ERASE(CMD38)。

CMDtypeArgumentrespabbreviationcommand description
CMD32ac[31:0] data addressR1ERASE_WR_BLK_STARTSets the address of the first write block to be erased.
CMD33adtc[31:0] data addressR1ERASE_WR_BLK_ENDSets the address of the last write block of the continuous range to be erased.
CMD38adtc[31:0] stuff bitsR1bERASEErases all previously selected write blocks.
2. DISCARD

为了提高数据吞吐量,需要同时丢弃许多写块。这些写块的识别可以通过ERASE_WR_BLK_START(CMD32)、ERASE_WR_BLK_END(CMD33)命令来完成。主机应遵循以下命令顺序: ERASE_WR_BLK_START、ERASE_WR_BLK_END和丢弃(CMD38)和CMD38参数应设置为00000001h。

支持丢弃的主机应在SD_STATUS寄存器中检查DISCARD_SUPPORT位(b313)。

如果板卡不支持丢弃,则主机不得发出丢弃命令。如果卡不支持丢弃,则卡应执行擦除。

3.  Full User Area Logical Erase (FULE)

FULE操作类似于默认的擦除操作,只是板卡应该在逻辑上完全擦除整个用户区域。我们希望在逻辑上删除完整的用户区域。完整用户区域的识别通过ERASE_WR_BLK_START(CMD32)参数等于0和ERASE_WR_BLK_END(CMD33)参数等于用户区域的结束,命令完成。主机应遵循以下命令顺序:
ERASE_WR_BLK_START、ERASE_WR_BLK_END和FULE(CMD38)和CMD38参数应设置为00000002h

支持FULE的主机应在SD_STATUS寄存器中检查FULE_SUPPORT位(b312)。如果板卡不支持FULE,则主机不得发出FULE命令。

如果该卡不支持FULE,则该卡应执行擦除

2.4.5 写保护

SD存储卡支持三种写保护方法如下:

  • 机械写保护开关(tf卡没有)
  • 卡内部写保护(可选)
  • 密码保护卡锁定操作。

2.4.6 卡锁/解锁操作

卡锁定/解锁命令具有常规单块写入命令的结构和总线事务类型。传输的数据块包括命令所需的所有信息(密码设置模式、PWD本身、卡锁/解锁等)。
在这里插入图片描述

CMDtypeArgumentrespabbreviationcommand description
CMD42adtc[31:0] ReservedR1LOCK_UNLOCKUsed to set/reset the password or bits (Set all 0) lock/unlock the card. The size of the data block is set by the SET_BLOCK_LEN command. Reserved bits in the argument and in Lock Card Data Structure shall be set to 0.

这块内容感兴趣,可以自行查看spec来学习了解下。包括内容:
1、设置密码 2、重置密码 3、锁定卡 4、解锁卡等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值