分类: LINUX
2013-07-19 16:48:04
目录[] |
按照读写属性定义,有两种类型的SD存储卡:
按照操作电压定义,有两种类型的SD存储卡:
注意:双电压SD存储卡的细节,将在未来规范中定义。
按照容量定义,有两种类型的SD存储卡:
只有符合SD存储卡物理层规范V2.00或更高并且符合SD文件系统规范V2.00的主机才能访问高容量SD存储卡。其它主机初始化高容量SD存储卡时,将失败(见下图)。
注意:
本规范中定义了4种速度等级,用于指示卡的最低性能:
高容量SD存储卡的速度等级至少为 Class 2。
SD存储卡支持SD总线协议和SPI总线协议,本文档只介绍SD总线协议。
SD总线上的通信是基于命令/响应的,并且数据位流以一个起始位开始,以一个停止位结束。
卡寻址是使用一个会话地址来实现的,这个地址是在初始化阶段分配给卡的。命令、响应和数据块结构见SD存储卡功能描述。SD总线上的基本操作是命令/响应操作(见上图)。这种总线操作类型直接在命令或响应结构中发送它们的信息。另外,有些命令有一个数据令牌。
数据传输是以块进行的,分为单块传输和多块传输。数据块后总是跟着CRC位。多块传输可以更好地实现更快的写操作。当一条停止命令跟在命令线CMD上时,一次多块传输结束。数据传输可使用单数据线或多数据线,由主机配置。
数据块写操作使用一个简单的写操作忙信号(见下图)。在写操作期间,无论传输数据的数据线条数,该信号只持续在数据线DAT0上。多数据块写操作可以更好地实现更快的写操作。
(图)(多)数据块写操作命令令牌的编码方案如下:
(图)命令令牌格式
每个命令令牌前面有一个起始位(0),后面有一个结束位(1)。总长度48位。每个令牌由CRC位保护以至于能检测出传输错误,必要时并重复操作。
响应令牌有四种编码方案,每个响应只能为其中的一种,取决于它们的内容。总长度为48或136位。详见SD存储卡功能描述。
在命令线CMD上,先传输最高有效位(msb),最后传输最低有效位(lsb)。
当使用宽总线模式时,一次传输4位数据。每条数据线上都会传输起始位、结束位和CRC位。每条数据线单独计算并检查CRC位。CRC状态响应和忙指示仅由卡通过DAT0发送给主机(此时,不关心DAT1-DAT3)。
1. 常规数据(Usual data ,8位宽):常规数据先发送最低有效字节(LSB),最后发送最高有效字节(MSB)。但是,在单个字节中,先发送最高有效位(msb),最后发送最低有效位(lsb)。
(图)数据包格式——常规数据2. 宽幅数据(Wide width data ,SD寄存器):宽幅数据从最高有效位开始移位。
(图) 数据包格式——宽幅数据
主机和卡之间的所有通信都是由主机控制的。
主机发送的命令有两种:广播命令和寻址(点对点)命令。
SD存储卡系统(主机和卡)定义了两种操作模式:
下表列出了操作模式和卡状态之间的关系。
(表) 卡状态与操作模式
在卡识别模式下,主机复位所有处于卡识别模式下的卡、确认操作电压范围、识别卡并且要求卡发布它们的相对卡地址(RCA)。该操作是在卡各自的CMD线上分别完成的。在卡识别模式下,所有数据通信只使用CMD线。
在卡识别过程中,SD时钟频率必须为FOD(0~400KHz)。
CMD0 (GO_IDLE_STATE)是软件复位命令,它将所有卡置于空闲状态(Idle State),而不管卡的当前状态。注意,该命令对非激活状态下的卡没有影响。
上电后,所有的卡都处于空闲状态,包括那些之前处于非激活状态下的卡。如果是SD主机,CMD0不是必须的,如果是SPI主机,首先应该向卡发送CMD0。
上电后或执行CMD0后,所有卡的CMD线都处于输入模式,以等待下一个命令的起始位。同时所有卡都被初始化为一个默认的相对卡地址(RCA=0x0000)和一个默认的时钟频率(400KHz)。
在主机和卡通信开始时,主机不知道卡能否在它提供的电压下工作,卡也不知道它是否支持主机提供的电压。
主机必须在发送ACMD41之前发送CMD8,如果主机不发送CMD8,卡将在ACMD41时进入非激活状态。
(图) SD存储卡状态图(卡识别模式)总线被激活后,主机开始卡的初始化和识别过程(见下图)。
[] 初始化过程:CMD8(SEND_IF_COND) 是物理层规范V2.00为了支持多电压范围新添加的命令,用于初始化符合物理层规范V2.00的SD存储卡。CMD8只有当卡处于空闲状态时才有效。该命令有两个功能。
CMD8的格式如下:
(表) CMD8的格式
参数中的'voltage supplied(VHS)'应被设置为主机提供的电压所在的电压范围,在任何时候,VHS中必须只有1位被置为'1'。
CRC7和'check pattern'用于主机检查和卡之间通信的正确性,'check pattern'可以被设置为任一8位类型,推荐使用'10101010b'。
卡接收到CMD8后,检查它的操作电压范围是否与主机提供的电压所在的电压范围一致,如果一致,说明卡支持主机提供的电压,卡将返回响应R7。在响应中,卡返回在参数中设置的电压范围和检查类型。如果不一致,它不返回响应并停留在空闲状态。
必须在发送“第一ACMD41”(见ACMD41)去初始化高容量SD存储卡之前发送CMD8。卡收到CMD8后,就会知道主机支持物理层规范V2.00,从而去使能新的功能。
低电压主机也必须在发送ACMD41之前发送CMD8。如果一个双电压卡没有接收CMD8,那它只能作为一个高电压卡使用。
如果主机不发送CMD8,卡将在ACMD41时进入非激活状态。
当卡收到APP_CMD(CMD55)命令时,将导致卡将接下来的命令解释为应用特定命令(ACMD)。ACMD具有普通命令相同的结构和CMD索引,因为它是出现在APP_CMD后面,所以卡把它识别为ACMD命令。
APP_CMD的唯一作用就是:如果卡在紧随其后收到一个已经定义的应用特定命令,则它才能被解释为应用特定命令,否则被解释为普通命令。例如:一个卡定
义了ACMD13而没有定义ACMD7,如果卡在紧随APP_CMD之后收到CMD13,则它将被解释为应用特定命令ACMD13;但是如果卡在紧随
APP_CMD之后收到CMD7,而这个卡没有定义ACMD7,则它将被解释为普通CMD7。
为了使用生产厂商指定的ACMD,主机应该完成以下操作:
如果发送了一个无效的命令(既不是ACMD也不是CMD),则它将被作为SD存储卡非法命令错误进行处理。
生产厂商指定的ACMD索引是有限制条件的。下列ACMD索引被保留给SD存储卡专用应用的,任何SD存储卡生产厂商都不得使用:
ACMD6, ACMD13, ACMD17-25, ACMD38-49, ACMD51。
ACMD41(SD_SEND_OP_COND)就能完成SD卡的初始化,所以又称其为初始化命令。
ACMD41为主机提供了一种识别机制,使得主机能够识别那些与主机想要的VDD电压窗口匹配的卡,而拒绝那些不匹配的卡。主机发送一个以主机想要的
VDD电压窗口为的参数的ACMD41,即可完成此操作。在指定的VDD电压窗口内,不能完成数据传输的卡将忽略后面的总线操作并进入非激活状态。OCR
寄存器中定义了相应的VDD电压窗口。
ACMD41是一个应用特定命令,因此必须在紧随CMD55 (APP_CMD)之后发送。在空闲状态下,CMD55所使用的RCA必须是卡的默认RCA=0x0000。
ACMD41的格式如下:
(表) ACMD41的格式
CMD8的接收扩展了ACMD41的功能:参数中的HCS和响应中的CCS。
参数中的HCS为主机容量支持(Host Capacity
Support)位,HCS=1,表示主机支持高容量SD存储卡;HCS=0,表示主机不支持高容量SD存储卡。不响应CMD8的卡将忽略HCS。如果卡
没有返回CMD8的响应,主机应将HCS设为0。标准容量SD存储卡也会忽略HCS。如果HCS设为0,高容量SD存储卡将不会返回到就绪状态(保持
busy位为0)。
接下来的ACMD41的参数必须与“第一ACMD41”的参数相同。
卡只在“第一ACMD41”时,检查VDD电压窗口和HCS位。当重复ACMD41时,主机不能发送其它命令除了CMD0。
ACMD41的响应类型为R3,即OCR寄存器。卡通过OCR中的busy(OCR[31])位通知主机,ACMD41的初始化是否完成。busy=0表示卡还在初始化,busy=1表示初始化完成,并返回到就绪状态。主机重复发送ACMD41直到busy为1。
如果卡响应了CMD8,则ACMD41的响应中会包含CCS(Card Capacity Status)的信息。当卡返回到就绪态(busy=1)时,CSS是有效的。CSS=1表示卡是高容量SD存储卡,CSS=0表示卡是标准容量SD存储卡。
在卡识别模式结束前,主机时钟频率必须在FOD范围内(0~400KHz),因为有些卡在卡识别模式时,有工作频率限制。在数据传输模式,为了提高
系统性能,主机可以将时钟频率设为FPP(FPP最大值取决于TRAN_SPEED域(CSD[103:96]))。主机可以发送
SEND_CSD(CMD9)获得CSD寄存器。
CMD7用于选择一个卡,并将它置于传输状态(Transfer
State)。在任一时刻,只能有一个卡处于传输状态。如果一个之前选择的卡正处于传输状态,那么它将释放与主机的连接并返回到待机状态(Stand-
by State)。当默认RCA(0x0000)作为CMD7的参数被发送后,所有的卡都将返回到待机状态。
在数据传输模式下,主机和被选择的卡之间的所有通信都是点对点的(使用寻址命令)。所有寻址命令都需要在CMD信号线上得到响应。
各种数据传输模式间的关系总结如下:
可以使用ACMD6来选择/取消选择宽总线(4位总线宽度)操作模式。上电后或执行CMD0后,默认的总线宽度是1位。
必须满足以下两个条件,才能改变总线宽度:
一个上锁的卡将响应ACMD6为一个非法命令。
对于2GB卡,最大数据块长度(READ_BL_LEN=WRITE_BL_LEN)应该被设为1024B。但是为了兼容最大数据块长度为512B的卡(小于或等于2GB的卡),数据块长度最大只能为512B。
当没有数据传输时,数据总线被上拉为高电平。一个传输的数据块包括起始位(1或4位低电平),和随后的数据流。数据流包含有效载荷数据(和错误纠正 位,如果使用了卡外ECC)。数据流以结束位(1或4位高电平)结束。数据传输和时钟信号同步。面向数据块传输的有效载荷数据由1或4位CRC校验和保 护。关闭电源将中断从SD存储卡的读操作。在主机发出写或擦除操作外的任何情况下,甚至卡突然被关闭或移除,SD存储卡都将确保数据不被损坏。如果发生了 BLOCK_LEN_ERROR或ADDRESS_ERROR,则读命令被拒绝,将没有数据传输。
[] 数据块读
数据块读是面向块的数据传输。数据传输的基本单位是数据块,最大长度为512B。起始和结束地址都被包含在512B物理数据块边界内的较小数据块也能被传输。
数据块长度可以由CMD16设置为最大512B,不管READ_BL_LEN。
一个CRC被添加到每个数据块的末尾,以确保数据传输的完整性。CMD17(READ_SINGLE_BLOCK)启动一个数据块读操作,传输完成后,卡
返回到传输状态。CMD18(READ_MULTIPLE_BLOCK)开始一次多个连续的数据块读操作。数据块被连续的传输,直到主机发送一个
CMD12(STOP_TRANSMISSION)
。由于串行的命令传输(CMD线),停止传输命令有一个执行延迟。数据传输在停止传输命令的最后一位被发送后停止。
如果主机传输部分数据块,而累计的数据块长度不能与物理块对齐同时不允许块错位,卡将在第一个未对齐的块开始时检测出一个块错位错误,设置状态寄存器中的ADDRESS_ERROR错误位,终止传输并在数据状态等待一个停止命令。
下表定义了当一个部分数据块访问被使能时的卡行为。
如果未对齐的块是命令的第一个数据块(即命令的响应中报告了ADDRESS_ERROR),那么没有数据被传输并且卡保持在传输状态。
数据传输格式和数据读格式类似。为了面向数据块写的数据传输,CRC检查位被添加到每个数据块的末尾。在写操作之前,卡先对每个接收到的数据块进行1或4位CRC奇偶校验检查。该机制可以阻止错误数据的写操作。
如果发生了BLOCK_LEN_ERROR或ADDRESS_ERROR,则写命令被拒绝,将没有数据传输。
在数据块写(CMD24 -
27,42,56(w))期间,主机把一个或多个数据块从主机发送到卡中,同时在每个数据块的末尾加上1或4位CRC。如果一个卡支持数据块写,那么它的
数据块长度应该由CMD16设为512B,不管WRITE_BL_LEN被设为1KB还是2KB。
(下表) 定义了当一个部分数据块访问被失能(WRITE_BL_PARTIAL = 0).时的卡行为。
如果WRITE_BL_PARTIAL=1,那么较小数据块(高达1B分辨率)也能被传输。如果CRC校验错误,卡通过数据线指示该错误;卡接收到的数据被丢弃而不被写入,所有后续传输的数据块(在多数据块写模式下)将被忽略。
为了使写操作更快,应该使用多数据块写命令去代替连续的单数据块写命令。
如果主机传输部分数据块,而累计的数据长度不能与物理块对齐同时不允许块错位(没设置CSD中的WRITE_BLK_MISALIGN位),卡将检测出块
错位错误并且在第一个未对齐的块开始前终止编程。卡将设置状态寄存器中的ADDRESS_ERROR错误位,并且忽略后续的数据传输,在接收数据状态等待
一个停止命令。
注意:如果未对齐的块是命令的第一个数据块(即在命令的响应中报告了ADDRESS_ERROR),那么卡保持在传输状态并且没有数据被编程。
如果主机尝试覆盖一个写保护区,写操作也会被终止。此时,卡会设置WP_VIOLATION位。
CSD寄存器的编程不需要提前设置数据块长度。传输的数据也是由CRC保护的。如果CSD寄存器的一部分被存储在ROM中,那么这个不能更改的部分应该和接收缓冲器中的对应部分匹配。如果不匹配,那么卡将报告一个错误并且不改变任何寄存器内容。
有些卡可能需要长的不可预计的时间去写一个数据块。接收一个数据块并完成CRC检查后,卡将开始写操作,如果它的写缓冲区满并且不能再从一个新的
WRITE_BLOCK命令接受新的数据,它将保持数据线DAT0为低。主机可以在任何时候使用SEND_STATUS命令(CMD13)查询卡的状态,
卡将它的状态作为响应返回给主机。READY_FOR_DATA状态位指示卡是否可以接受新的数据或写操作是否还在进行。主机可以使用CMD7取消选择当
前卡,而去选择另一个卡,此时卡将转入断开状态并且释放数据线而不打断写操作。当重新选择该卡时,如果编程仍在进行并且写缓冲区不可用,它将拉低数据线恢
复繁忙指示。实际上,主机使用交叉存取(inter-leaving)过程可以对几个卡同时进行写操作。此处,交叉存取是指当该卡繁忙时,可以去访问其他
不繁忙的卡。该过程可以通过命令线CMD和数据线上的适当操作(取消选择繁忙卡,去选择其它卡)来完成。
设置预擦除数据块数目(ACMD23)将使得后面的多块写操作更快。主机将使用该命令定义在接下来的写操作中将要发送的数据块的数目。如果主机在定
义的所有数据块被发送到卡之前结束写操作(使用停止传输命令),则剩下的写数据块的内容要么被擦除,要么还是原来的数据。如果主机想要发送的数据块数目多
于ACMD23中定义的,随着数据的接收,块被一个接一个地擦除。多块写操作后,预擦除数据块数目被复位到默认值(=1)。
推荐在CMD25之前使用ACMD23,有些卡在多块写操作时会更快。注意,如果主机想要使用预擦除功能,主机必须只能在写命令之前发送ACMD23。否则,当执行其它命令时,预擦除数目会被自动清除。
如果在多块写操作中发生了错误,为管理数据缓冲器使用管道机制的系统,有时候不能确定哪个块是最后一个已被完整地写到flash中的块。卡将以已写好的数据块数目作为ACMD22的响应返回给主机。
为了提高数据吞吐量,同时擦除多个写数据块是有意义的。这些写数据块的识别是由ERASE_WR_BLK_START (CMD32)和ERASE_WR_BLK_END (CMD33)完成的。
主机必须按照下列命令序列进行擦除:ERASE_WR_BLK_START,,ERASE_WR_BLK_END 和ERASE (CMD38)。
如果没有按照上述序列接收到擦除(CMD38)或地址设置(CMD32,33)命令,卡将设置状态寄存器中的ERASE_SEQ_ERROR位并且复位整个序列。
如果接收到一个序列之外的命令(除了SEND_STATUS),卡将设置状态寄存器中的ERASE_RESET状态位,复位擦除序列并执行该命令。
如果擦除范围包含了写保护扇区,它们将被跳过并只擦除非保护扇区。卡将设置状态寄存器中的WP_ERASE_SKIP状态位。
地址设置命令中的地址域是一个以字节为单位的写数据块地址。卡将忽略低于WRITE_BL_LEN的所有LSB字节。
如上所述为数据块写,卡将数据线DAT0保持为低,指示擦除正在进行。实际擦除时间可能相当长,主机可以发送CMD7取消选择此卡。
擦除后的数据是'0'还是'1',取决于卡制造商。SCR寄存器位DATA_STAT_AFTER_ERASE (位55) 定义了擦除后的数据是'0'还是'1'。
SD存储卡支持如下三种写保护方式:
卡的数据可以被保护不被覆盖或擦除。在CSD中永久地或临时地设置写保护位,生产厂商或内容提供商可以永久地对整个卡施行写保护。对于支持在CSD
中设置WP_GRP_ENABLE位从而提供一组扇区写保护的卡,部分数据可以被保护,写保护可以通过程序改变。写保护的基本单位是CSD参数
WP_GRP_SIZE个扇区。SET_WRITE_PROT和CLR_WRITE_PROT命令控制指定组的保护,SEND_WRITE_PROT命令
与单数据块读命令类似,卡送出一个包含32个写保护位(代表从指定地址开始的32个写保护组)的数据块,跟着一个16位的CRC码。写保护命令的地址域是
一个以字节为单位的组地址。
卡将截断所有组大小以下的地址。
在卡的侧面有一个机械的滑动开关,允许用户设置或清除卡的写保护。当滑动开关置于小窗口打开的位置时,卡处于写保护状态,当滑动开关置于小窗口关闭 的位置时,可以更改卡中内容。在卡的插槽上的对应部位也有一个开关向主机指示卡是否处于写保护状态。卡的内部电路不知道写保护开关的位置。
密码保护功能允许主机使用密码对卡实行上锁或解锁。密码和密码长度分别存储在一个128位的PWD寄存器和一个8位的PWD_LEN寄存器中。这些寄存器是不可挥发的,即掉电后它们的内容不丢失。
已上锁的卡能够响应和执行相应的命令,即允许SDIO卡主机模块执行复位、初始化、选择和查询状态等操作,但不允许访问卡中的数据。如果之前设置了密码(即PWD_LEN的数值不为0),上电后卡自动被上锁。
与CSD寄存器写命令类似,上锁/解锁命令仅在传输状态下有效。这意味着,命令中没有地址参数,并且在使用该命令之前必须先选择卡。
卡上锁/解锁命令具有单数据块写命令的结构和总线操作类型。传输的数据块包含命令所需要的所有信息(密码设置模式,PWD内容,卡上锁/解锁等等)。命令
数据块结构描述如下表。注意:当发送CMD42时,符合SD物理层规范V2.00的主机应将保留位(Bit[7:4])设为0。
命令数据块长度应由主机在发送卡上锁/解锁命令之前定义。数据块长度应大于或等于上锁/解锁命令所需的数据结构长度。在下面的解释中,对于上锁/解锁命令,改变数据块长度(CMD16)不是强制要求的。
以下几个段落定义了设置/清除密码、上锁/解锁和强制擦除的命令序列。
注意:密码长度域(PWD_LEN)指示当前是否设置了密码。当该域为0时,表示没有设置密码。当该域非零时,表示设置了密码,卡在上电后自动上锁。在供电过程中,也可以通过设置LOCK_UNLOCK位(设置密码时)或发送一个额外的上锁命令,立即锁住卡。
[] 清除密码
注意:设置密码和卡上锁可以在同一个序列中进行,此时,当发送新密码命令时,主机应完成前述设置密码所需的所有步骤,包括设置LOCK位。
如果之前设置过密码(PWD_LEN不为0),则卡在上电复位后将自动上锁。
试图对已经上锁的卡或没有密码的卡执行上锁操作将会导致失败,并设置状态寄存器中的LOCK_UNLOCK_FAILED错误位。
注意:解锁只能在供电过程中进行,只要PWD域没被清除,下次上电后卡会被自动上锁。
试图对已经解锁的卡执行解锁操作会导致操作失败,并设置卡状态寄存器中的LOCK_UNLOCK_FAILED错误位。
数据块长度应大于或等于CMD42所需的数据结构长度;否则CMD42的结果是未定义的,并且卡可能会进入无法预料的上锁状态。下表阐明了 CMD42的行为。不需要考虑CMD42参数中的保留位(位7-4)。如果CMD42需要密码,则需要在数据结构中正确地设置旧密码和新密码;否则卡将指 示一个错误。如果密码长度为0或者超过128位,卡也会指示一个错误。如果在执行CMD42时发生了错误,则LOCK_UNLOCK_FAILED (卡状态位24)被置1。LOCK_UNLOCK_FAILED可以在CMD42或之后CMD13的响应中查看。CMD42响应中的 CARD_IS_LOCKED (卡状态位25)应与表中的“Current Card State”一致。在CMD42执行后,如果卡状态中的CARD_IS_LOCKED从0变为1,则卡被上锁;如果卡状态中的 CARD_IS_LOCKED从1变为0,则卡被解锁。CARD_IS_LOCKED可以在之后CMD13的响应中查看。
应用说明: 如果想要替换密码,主机必须考虑下列情况。当PWD_LEN和PWD存在时,卡假设旧密码和新密码都被设置在数据结构中。当PWD_LEN和PWD被清除时,卡假设只有新密码被设置在数据结构中。此时,主机不能在数据结构中设置旧密码,否则,将设置一个无法预料的密码。 [] 强制擦除如果用户忘记了密码(PWD的内容),可以擦除卡中所有的数据内容包括PWD的内容。该操作被称为强制擦除。
试图对已经解锁的卡执行擦除操作会导致操作失败,并设置卡状态寄存器中的LOCK_UNLOCK_FAILED错误位。
[] 对已上锁卡的强制擦除下表阐明了强制擦除和写保护之间的关系。强制擦除不擦除安全区。在执行擦除过程中,卡将保持上锁状态,并在所有用户区擦除完成后,变为解锁状态。相 似地,在执行擦除过程中,卡将保持临时和组写保护,并在所有用户区擦除完成后,清除写保护。如果发生了一个擦除错误,并且错误扇区的数据被损坏,卡可以继 续强制擦除。
[] ACMD6与上锁/解锁状态之间的关系ACMD6用于设置总线宽度。当卡被上锁时,ACMD6被拒绝,并且只有当卡被解锁后,才能改变总线宽度。下表列出了ACMD6与上锁/解锁状态之间的关系。
应用说明: 如果卡是在上电后(1位总线模式下)被上锁,SD模式主机应在1位总线模式下发送CMD42。如果卡是在4位宽总线模式下被上锁,SD模式主机应在4位宽总线模式下发送CMD42。 [] 已上锁的卡能接受的命令已上锁的卡可以接受的命令如下,并且返回的响应中设置了CARD_IS_LOCKED。
1) Basic class (0) 2) Lock card class (7) 3) CMD16 4) ACMD41 5) ACMD42所有其他命令,包括安全命令,将被响应为非法命令。
应用说明: 上电后,主机可以通过CMD7和CMD13响应中的CARD_IS_LOCKED位来确认卡的上锁/解锁状态。 [] 两种支持上锁/解锁功能的卡有两种支持上锁/解锁功能的卡。Type 1 是SD存储卡的早期版本,Type 2 是在物理层规范V1.10及更高版本中定义的。下表列出了这两种卡之间的差异。支持上锁/解锁并遵循V1.01的SD存储卡,既可以作为Type 1 也可以作为Type 2 。支持上锁/解锁并遵循V1.10及更高版本的SD存储卡,只能作为Type 2 。
应用说明: 主机只需考虑以下几点,就可以不检查它们之间的差异而使用这两种卡。 (1) 如果CMD42返回一个错误(见Table 4-5),则主机不能设置CMD42的参数 (For *1) (2) 如果永久写保护被设为1,主机不能发送强制擦除命令。否则Type 1 卡将不能再被使用,即使用户记得密码。 (For *2) (3) 强制擦除后,如果临时写保护未被清除,主机应清除它。 (For *3)定义了四种命令来控制SD存储卡:
SD存储卡的所有命令和响应都是在CMD线上传输的。命令总是从命令字的最高有效位(msb)开始传输。
所有命令都有一个固定的48位的编码长度,并且需要一定的传输时间(与时钟频率有关)。
(表)命令格式一个命令总是以一个起始位(0)开始,后跟一个传输方向位(主机=1)。接下来6位指示命令索引,该数值被解释为一个二进制编号 (0~63)。有些命令需要一个32位的参数(比如,地址)。上表中,数值'x'表示是一个随命令而变化的变量。所有命令都由CRC7保护。每个命令以一 个结束位(1)结束。
SD存储卡系统的命令集被分成若干类(见下表)。每个类支持一组卡功能。
CCC (CSD[95:84],12位,Card Command Classes) 的设置决定了卡支持的命令类。如果相应的CCC位为1,则卡支持相应的命令类。
所有的SD存储卡必须支持Class 0, 2, 4, 5, 7 和 8 ,因为它们是强制的。因此CCC中Class 0, 2, 4, 5, 7 和
8 对应的位必须为1。其他类都是可选的,有些具有特定功能的卡可能需要支持这些类。比如,复合卡必须支持CMD5。
stuff bit:填充位,为了保证固定长的命令和响应帧,没有任何意义。
[] 基本命令 (class 0) [] 面向块的读命令 (class 2) [] 面向块的写命令 (class 4) [] 擦除命令 (class 5) [] 卡锁命令 (class 7) [] 应用特定命令 (class 8) [] SD存储卡使用/保留的应用特定命令(class 8) [] 面向块的写保护命令 (class 6) [] I/O模式命令 (class 9) [] 转换功能命令 (class 10)
所有的响应都是在命令线CMD上传输的。响应的传输总是从对应响应字的位串的最左面开始,响应字的长度与响应的类型相关。
一个响应总是以一个起始位(始终为0)开始,后随着一个传输方向位(卡=0)。下列表中标示为X的数值表示一个可变的部分。除了R3响应类型,所有的响应都有CRC保护。每一个命令码字都以一个结束位(始终为1)结束。
SD存储卡有5种响应类型,它们的格式定义如下:
码长48位。位45:40指示要响应的命令的索引,它的数值介于0至63之间。卡的状态被编码成32位。注意,如果在向卡发送数据时,每一个数据块发送完成后,数据线上可能会出现繁忙信号,因此,在每一个数据块发送完成后,主机应检查卡是否繁忙。
(表) 响应R1与R1格式相同,可以有选择地在数据线上发送一个繁忙信号。收到这些命令后,依据收到命令之前的状态,卡可能变为繁忙。主机应当在响应中检查卡是否繁忙。
码长136位。CID寄存器的内容将作为CMD2和CMD10的响应发出。CSD寄存器的内容将作为CMD9的响应发出。卡只送出CID和CSD的位[127…1],位0被响应的结束位所取代。
(表) 响应R2码长48位。OCR寄存器的内容将作为ACMD41的响应发出。
(表) 响应R3码长48位。位45:40指示要响应的命令的索引,在这种情况下是’000011’(与状态位中的位5表示CMD3)。参数域的高16位是用来存放卡发出的RCA数据。
(表) 响应R6码长48位。卡支持的电压信息将作为CMD8的响应发出。位19:16指示卡支持的电压范围。如果卡接受所提供的电压,则返回R7。在响应的参数域中,卡返回供电电压范围和检查类型。
(表) 响应R7
SD存储卡有如下两种状态字:
卡状态(Card Status):一条已执行命令的错误和状态信息,包含在响应中
SD状态(SD Status):512位的扩展状态字,用于支持SD存储卡的特殊功能和将来的应用特定功能。
响应格式R1包含了一个32位的卡状态字,这个状态字用于向主机发送卡的状态信息(这些信息可能存储在一个本地的状态寄存器中)。除非特别说明,卡返回的状态始终是与之前主机发出的命令相关的。
卡状态信息描述如下表。表中Type和Clear Condition的缩写定义如下:
Type:
Clear Condition:
SD状态包含与SD存储卡特有功能和将来可能使用到的应用特定功能相关的状态位,SD状态的长度是一个512位的数据块。SD状态作为
ACMD13(CMD55后跟CMD13)的响应,通过数据线发送给主机。只有卡处于传输状态时(卡已被选择)才能发送ACMD13命令。
SD状态信息描述如下表。表中Type和Clear Condition使用与上面的卡状态相同的缩写。
标准容量卡和高容量卡设置该域的方式不同。
对于标准容量卡,保护区容量计算如下:
保护区容量 = SIZE_OF_PROTECTED_AREA * MULT * BLOCK_LEN SIZE_OF_PROTECTED_AREA的单位是MULT * BLOCK_LEN。对于高容量卡,保护区容量计算如下:
保护区容量 = SIZE_OF_PROTECTED_AREA SIZE_OF_PROTECTED_AREA的单位是字节。 SPEED_CLASS这8位指示速度等级,数值可以通过PW/2(PW是写的性能)计算出来。
(表)速度等级
Class 0:这类卡没有指定性能,包含SD存储卡规范2.0版本之前的所有旧卡
Class 2:性能在2MB/s或以上
Class 4:性能在4MB/s或以上
Class 6:性能在6MB/s或以上
这8位指示以1MB/s为单位的移动性能(Pm)。如果卡不用RU(Recording Unit)移动数据,应该认为Pm是无穷大。设置这个域为FFh表示无穷大。
(表) 移动性能这4位指示AU(Allocation Unit)长度,数值是×16K字节。
(表) AU长度AU长度最大值取决于卡的容量,如下表。卡可以在RU长度和AU长度最大值之间设置任意的AU长度。
(表) AU长度最大值这16位指示NERASE,当NERASE个AU被擦除时,ERASE_TIMEOUT定义了超时时间。主机应在一次擦除操作中确定合适的AU数目,这样主机可以指示擦除操作的进度。如果该域为0,则不支持擦除超时的计算。
(表) 擦除长度这6位指示TERASE,当由ERASE_SIZE指定的多个AU被擦除时,这个数值指示从偏移量(offset)算起的擦除超时。 ERASE_TIMEOUT的范围可以被定义到最多63秒,卡生产商可以根据具体实现选择任一ERASE_SIZE和ERASE_TIMEOUT的组合。 一旦ERASE_TIMEOUT被确定了,ERASE_SIZE也随之被确定了下来。如果ERASE_SIZE被设置为0,则该域将被设置为0。
(表) 擦除超时这2位指示TOFFSET,数值定义如下表。当ERASE_SIZE和ERASE_TIMEOUT同为0时这个数值没有意义。
(表) 擦出偏移
X个AU的擦除超时Erase Timeout,可以通过下式计算出来:
Erase Timeout = TERASE / NERASE·X + TOEESET
擦除超时是由下面几步决定的:
(1) 按照上式计算出Erase Timeout;
(2) 如果 (1) 的结果小于1s,则Erase Timeout设为1s;
(3) 每部分擦除一个AU,(2) 的结果都要加上250ms。
注:部分擦除AU是指擦除的起始地址或结束地址不是AU的边界地址。
在卡接口中,定义了6个寄存器:OCR,CID,CSD,RCA,DSR和SCR。这些寄存器只能被相应的命令访问。当RCA和DSR作为存储实际配置参数的配置寄存器时,OCR,CID,CSD和SCR寄存器存储卡/内容特定信息。
寄存器中的保留位是为了以后的扩展,访问时,将返回0。
32位操作条件寄存器(OCR)存储了卡的VDD电压窗口。
位7是为双电压卡新定义的,默认为0。如果一个双电压卡没有接收到CMD8,该位仍为0,否则,该位被设为1。
另外,该寄存器包含两个状态信息位。
位31:卡电源启动状态位,如果卡电源启动过程已完成,则该位被设为1。
位30:卡容量状态位,如果卡是高容量SD存储卡,则该位被设为1。该位为0,指示卡是标准容量存储卡。卡电源启动状态位被置1后,该位才有效。主机通过读该状态位来识别标准容量和高容量SD存储卡。
(表) OCR寄存器定义
支持的电压范围被编码如上表。如果相应位为0,则不支持该电压范围。
当卡繁忙时,位31被设为0。
卡识别(CID)寄存器宽128位,包含了卡识别期间所使用到的卡识别信息。每个单独的R/W卡都有一个唯一的识别号。
(表) CID寄存器定义
一个8位的二进制数,用于识别卡制造商。为了确保CID寄存器的唯一性,MID号是由SD-3C,LLC控制,定义,并分配给SD存储卡制造商。
OID
一个2字符的ASCII字符串,用于识别卡OEM(原始设备制造商)。为了确保CID寄存器的唯一性,MID号是由SD-3C,LLC控制,定义,并分配给SD存储卡制造商。
注意:SD-3C,LLC是由松下,SanDisk和东芝合作成立的一家有限责任公司,负责向想要制造和出售SD存储卡ROM卡和OTP卡的公司发放许可证。
一个5字符的ASCII字符串,用于识别产品名称。
PRV
产品修订由两位BCD码组成,表示一个“n.m”修订号。“n”是高四位,“m”是低四位。
例如:产品修订“6.2”对应的二进制数值为:0110 0010b。
32位二进制序列号。
MDT
生产日期由三位十六进制数组成,高8位表示年(y),低4位表示月(m)。
“m”域[11:8] 是月份编码,1 = January。
“y”域[19:12] 是年份编码,0 = 2000。
例如:生产日期“April 2001”的二进制数值为:00000001 0100b。
CRC7校验和,由CID内容计算得出。
卡特定数据(Card-Specific Data,CSD)寄存器提供了访问卡内容的有关信息。CSD定义了数据格式,错误纠正类型,数据访问时间最大值,DSR寄存器是否可用等等。该寄存器中 的可编程部分(由W或E标识)可以被CMD27更改。CSD各域的类型编码如下:R=可读,W(1)=只能写一次,W=可以写多次。
根据物理层规范版本和卡容量,CSD寄存器中结构是不同的。
CSD寄存器中的CSD_STRUCTURE域指示CSD寄存器的结构版本。
下表列出了相关的CSD结构的版本号。
(表) CSD寄存器结构版本
可写的16位相对卡地址寄存器包含在卡识别期间由卡发布的卡地址。在卡识别过程后,当主机和卡通信时,该地址被主机用来对卡进行寻址。RCA寄存器的默认值是0x0000。CMD7使用被保留的数值0x0000将所有的卡置于待机状态。
16位驱动级寄存器(driver stage register)。它可以被可选地用来为扩展的操作条件(取决于像总线长度,传输速率或卡数目等参数)提高总线性能。CSD寄存器中包含关于DSR寄存器使用的信息。DSR寄存器的默认值是0x404。
除了CSD寄存器,还有另外一个配置寄存器,SD卡配置寄存器(SD CARD Configuration Register)。该寄存器提供了SD存储卡特殊功能的相关信息,这些特殊功能是已在给定的卡中配置好的。64位的SCR寄存器是由SD存储卡制造商设置的。
下表描述了SCR寄存器的内容
定义擦出后的数据状态(0或1),由卡供应商确定。
SD_SECURITY一个正规的SD存储卡都支持安全协议。对于ROM(只读)和OTP(一次可编程)类型的SD存储卡,安全特性是可选的。如果是标准容量SD存储卡,该域为2(V1.01);如果是高容量SD存储卡,该域为3(V2.00)。
SD_BUS_WIDTHS 描述卡支持的数据总线宽度。