Chinaunix首页 | 论坛 | 博客
  • 博客访问: 765320
  • 博文数量: 370
  • 博客积分: 2334
  • 博客等级: 大尉
  • 技术积分: 3222
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-06 16:56
文章分类

全部博文(370)

文章存档

2013年(2)

2012年(368)

分类:

2012-06-05 10:14:45

原文地址:SD卡协议学习 作者:邸小兵

首先SD卡有所谓操作模式(operation mode)的概念,每种操作模式又具体对应一种或多种状态,主机通过发送命令可以使SD卡在不同的状态间转换,SD卡则接受命令,并根据自己现在所处状态做出不同的响应。

系统上电时刻或者搜寻SD卡时,SD卡控制器应该处于SD卡识别模式;SD卡在刚接入系统时刻也处于这种模式,并且处于此模式下的Idle状态。

SD卡识别模式:在这种模式下,控制器会检验SD卡的工作电压范围,识别SD卡类型,并要求它们发送各自的相对地址(Relative Card Address);这些操作在SD卡各自的CMD线上进行。所有的操作均使用默认的 SD卡识别时钟频率(identification clock rate)

SD卡复位:发送GO_IDLE_STATE(CMD0)到SD卡后,除处于非活动状态(Inactive state)之外的SD卡都会进入空闲状态(Idle state);在Idle状态,SD卡的CMD线处于输入模式,默认相对地址为0x0000,默认驱动寄存器设定为最低速度,最大驱动电流能力。

工作条件检测

在控制器和SD卡进行任何通信之前,控制器不清楚SD卡支持的工作电压范围,故而控制器首先使用默认的电压发送一条reset指令(CMD0),紧跟着的CMD8指令,用于取得SD卡支持工作电压范围数据。SD卡通过检测CMD8的参数部分来检查控制器使用的工作电压,控制器通过分析回传的CMD8参数部分来校验SD卡是否可以在所给电压下工作。如果SD卡可以在指定电压下工作,则它回送CMD8的命令响应字,其中包含check voltage, check pattern。如果SD卡不支持所给电压,则SD卡不会给出任何响应信息,并继续处于Idle状态。在PLV2.0(physical layer version2.0)下,在首次执行ACMD41之前,必须执行CMD8指令,用以初始化SDHC卡,SDHC卡根据是否接收到CMD8指令来鉴别控制器是否支持PLV2.0协议。使用低电压的控制器也必须在ACMD41命令之前发送CMD8,避免可以工作在两种电压模式下的SD卡因为没有接收到CMD8, 而默认工作在高电压环境下,被误认为是只支持高电压工作模式。

SD_SEND_OP_COND(ACMD41)命令的目的是给予SD卡控制器一个识别SD卡是否可以在所给Vdd范围下工作的机制,如果SD卡无法在指定Vdd范围内工作,则它会进入非活动状态(Inactive state)。要注意的是,ACMD41是应用相关型命令,因而,每次发出的ACMD41命令都必须紧跟在一条APP_CMD(CMD55)命令之后。在空闲态(Idle State)下使用的CMD55命令使用默认的卡相对地址(RCA)0x0000。

每次控制器发送CMD0复位SD卡后,都要重新进行系列初始化操作(CMD8,ACMD41...)。

如果ACMD41指令的OCR比特位为0,控制器可以查询各个SD卡,并决定它们共同的工作电压范围。在作为查询的ACMD41指令发送之后,SD卡并不会开始初始化过程,直到控制器重新发送一条ACMD41指令。


SD卡初始化和识别过程:

SD卡的初始化开始于接收到ACMD41指令之后,ACMD指令的HCS(Host Capacity Support)位如果设定为1的话,表明控制器支持SDHC卡,否则表示不支持。

在CMD8命令发送之后的ACMD41指令其功能有所扩展,在参数里多了HCS部分,在响应里面多了CCS(Card Capacity Status)部分。HCS参数会被不响应CMD8命令的SD卡所抛弃。控制器向不响应CMD8的卡发送ACMD41指令时,HCS位应该设置为零0。如果向SDHC卡发送HCS位为0的ACMD41命令,SDHC卡返回的响应,其busy标识位永远为0,代表忙状态。HCS标识位用来表明SD卡是否已经完成初始化,如果未完成,HCS为零,否则为1,如果HCS为0,控制器会重复发送ACMD41指令,SD卡只检查首次接收到的ACMD41指令的HCS位。

响应CMD8的SD卡发送的对于ACMD41指令响应会包含CCS部分,控制器只检查HCS标志位为1的响应所包含的CCS位。CCS=1表明其为SDHC卡,否则为标准SD卡。

控制器随后发送ALL_SEND_CID(CMD2)命令,查询各个卡的CID(unique card identification)值,还没有被识别的SD卡(处于Ready状态)会发送CID值作为响应,发送完CID值之后,SD卡进入识别状态(Identification state),然后控制器发送CMD3(SEND_RELATIVE_ADDR)命令,要求各个SD卡发送一个新的相对地址(RCA),RCA在之后的数据传输模式中用于寻址。RCA发送完之后。SD卡进入Stand-by状态,在这个状态,如果控制器想要给SD卡分配一个新的RCA,它可以发送另一条CMD3命令给SD卡。最后发布的RCA为SD卡的真实RCA。


数据传输模式

在SD卡识别模式结束之前,控制器使用的时钟频率均为Fod。在数据传输模式,控制器可能会使用Fpp频率。控制器发送一条SSEND_CSD(CMD9)命令来获取SD卡CSD寄存器(Card Specific Data)里面的描述值,譬如,块长度,卡容量信息等。广播命令SET_DSR(CMD4)为各个已识别的SD卡配置驱动阶段(??)。它会向SD卡的DSR寄存器写入相关的信息。控制器的时钟频率也在这个时刻从Fod转到Fpp。SET_DSR命令是可选的。

CMD7命令用来选择某个SD卡,使其进入Transfer状态,在指定时间段内,只有一个卡能处于Transfer状态。当某个先前被选中的处于Transfer状态的SD卡接收到CMD7之后,会释放与控制器的连接,并进入Stand-by状态。当CMD7使用保留地址0x0000时,所有的SD卡都会进入Stand-by状态。

数据传输模式下各个状态的转换关系总结如下:

所有的数据读命令都可以被停止命令(CMD12)在任意时刻终止。数据传输会终止,SD卡返回Transfer状态。读命令有:块读操作(CMD17)、多块读操作(CMD18)、发送写保护(CMD30)、发送scr(ACMD51)以及读模式下的普通命令(CMD56)

所有的数据写命令都可以被停止命令(CMD12)在任意时刻终止。写命令也会在取消选择命令(CMD7)之前停止。写命令有:块写操作(CMD24,CMD25)、编程命令(CMD27)、锁定/解锁命令(CMD42)以及写模式下的普通命令(CMD56)

数据传输一旦完成,SD卡会退出数据写状态,进入Programming状态(传输成功)或者Transfer状态(传输失败)

如果块写操作被叫停,但是写操作包含的最终块其长度和CRC校验是正确的话,数据会被编程到SD卡(从缓存写入到Flash?

SD卡可能会提供缓存模式,意思是前次写入块在编程到Flash的时刻,控制器可以接着发送下一块的数据

当写缓存为满时刻,并且SD卡处于Programming状态,DAT0会保持为低电平(BUSY),表明其为忙状态

写CSD,写保护,擦除这些操作没有缓存的功能,当SD卡正在处理这些命令的时候,其余的数据传输命令会被忽略。当SD卡为忙,并且处于Programming状态的时候,DAT0也会被SD卡拉低,

在SD卡处于Programming状态时候,不允许控制器发送设置参数命令。设置参数命令有:设置块长度(CMD16)、擦除块开始(CMD32)以及擦除块结束(CMD33)

在SD卡编程时刻,读命令也是不允许的

当把另一个卡从Stand-by状态转换为Transfer状态的时候,正处于erase和Programming状态的卡其操作不会终止,它会自动进入Disconnect状态,释放数据线。

处于Disconnect状态的卡可以通过发送CMD7命令使其脱离此状态,并进入Programming状态,并重新激活忙标识符

复位SD卡(使用CMD0或者CMD15)会终止任何等待中或正在进行的Programming操作。这可能会损毁SD卡的数据

CMD34-37 CMD50,CMD57保留


宽总线选择/取消选择

宽总线(4bit)模式可以通过ACMD6选择/取消选择,默认工作模式为1bit模式。

为了改变总线宽度,以下两个条件须满足:1. SD卡处于Transfer 状态 2.SD卡未被锁定

2Gbyte SD卡:

为使用2Gbyte的SD卡,Maximum Block Length(READ_BL_LEN=WRITE_BL_LEN)参数须设置为1024byte。但是,由CMD6设置的Block Length须为512byte,从而可与最大仅可使用512byte Block Length的SD卡相兼容

读数据

DAT线上没有数据传输时,由外部上拉电阻保持为高电平。传输数据块由一个起始比特(1或者4个比特的低电平),以及紧跟着的连续数据流组成。数据流包含有效载荷数据(以及错误校验比特,如果有使用到ECC)。数据流以数据结束标识符结束(1或者4比特的高电平)。数据传输和时钟信号是同步的。有效载荷数据后紧跟着1比特或者4比特的CRC校验码

读命令在出现BLOCK_LEN_ERROR 或者ADDRESS_ERROR的情况下可以被否决,这种情况下,不会发生数据传输过程

块读操作

块传输下,基本的数据传输单位是块,它最大为512byte,小一些的块传输也是可以的,如果它指向的内容其地址范围处于以512字节为边界的某块内(譬如 地址范围为200~300的传输是可以的,但是地址范围为500~600因为地址横跨了两个块,则不可行

由CMD16设置的Block Length参数最大可为512byte,而与READ_BL_LEN的大小无关

块数据的结尾都附加有CRC校验码,用以保证传输数据的完整性。CMD17(READ_SINGLE_BLOCK)发起单次的块传输,传输结束后,SD卡返回Transfer状态,CMD18(READ_MULTIPLE_BLOCK)开始多个连续块的数据传输。块传输会一直持续下去,除非收到一条STOP_TRANSMISSION命令(CMD12)。停止传输命令会有执行上的延迟,因为它是串行传输的,数据传输会在stop命令的停止位之后结束

If the host uses partial blocks whose accumulated length is not block aligned and block misalignment is
not allowed, the card shall detect a block misalignment at the beginning of the first misaligned block, set
the ADDRESS_ERROR error bit in the status register, abort transmission and wait in the Data State for
a stop command.
If the misaligned block is the first data block of the command (i.e. ADDRESS_ERROR was reported in
the actual response to the command), then no data is transferred and the card remains in the TRAN
state.


上面一段讲的是misalignment,理解不够,直接贴英文了

写数据

数据写传输类似读传输,块数据传输的话,在每块数据后面附加有CRC校验码

当出现BLOCK_LEN_ERROR 或者ADDRESS_ERROR时,写命令会被拒绝,并不会发生实际的数据传输

写数据块

写数据块命令(CMD24-27, 42, 56(w))会将一块或多块数据写入SD卡,支持块写入操作的SD卡要求由命令CMD16设定的块长度(Block Lenghth)为512byte,而不管WRITE_BL_LEN是1K还是2K

下表给出了部分写入禁止(WRITE_BL_PARTIAL=0)情况下SD卡的写入行为


如果WRITE_BL_PARTIAL=1,则更小块数据的写入--精度可以为1byte---是可以进行的。如果CRC校验失败,SD卡会在DAT线上给出相应的指示,已传输数据会被丢弃,并且这其后所传输的数据块(在多块写入模式下)也会被忽略

编程CSD寄存器并不需要先前设定好的块长度。传输数据同样附加有CRC校验,如果CSD的某部分存储在ROM里面,这个不可改变的部分同样会映射到数据缓存的相应部分(但是这部分数据不会写入),如果这个匹配条件不满足,SD卡会回报一个错误信息,并且此次写入无效

某些SD卡会需要比较长并且不可预期的写入时间。如果SD卡的缓存为满,则其在接收完块数据并完成CRC校验后,SD卡会开始数据的写入,并拉低DAT0。任何时刻,控制器可以通过命令SEND_STATUS(CMD13)主动查询SD卡的状态,SD卡对应的响应其标志位READY_FOR_DATA表明其是否可以接收新数据。

多块写操作之前的预擦除指令

使用预擦除命令(ACMD23)设定多个写入块的预擦除会让随后的多块写入更快完成。控制器一般会使用这个值(擦除多少块)来决定随后的多块数据写入的块数。如果控制器在写入多块数据之前使用stop名林终止数据传输,那么,余下的数据块里面的值是未知的,可能是旧的值,也可能是擦除后的空白值(全1)。如果控制器传输的数据块数多于预擦除指定的块数,,SD卡会以一次擦除一块的操作方式来擦除数据(当收到新数据的时候)。ACMD32所定义的擦除块数会在多块数据写入完成后复位为默认值(1)

建议在每次使用CMD25之前使用此命令。注意ACMD23必须在刚好要使用写入命令之前使用,否则,如果中间穿插了别的命令,可能或把ACMD23所设定的值自动清除

发送可写入块数

在使用流水线机制的系统里面,控制器可能在某些情况下不清楚哪个数据块是最后的可正确写入的块。如果在多块写入中间出现写入错误,SD卡会返回一个ACMD22命令,其间包含了可正确写入块的数值

擦除

同时擦除多块数据在提高数据传输速率方面是很有帮助的,标识这些写入块可以通过命令ERASE_WR_BLK_START(CMD32) ERASE_WR_BLK_END(CMD33)完成

控制器必须使用如下的命令序列来完成所需的操作:ERASE_WR_BLK_START ERASE_WR_BLK_END , ERASE

如果这三个命令的某一个没有按照此顺序来执行,SD卡会置位其ERASE_SEQ_ERROR位,并复位整个执行序列

If an out of sequence command (except SEND_STATUS) is received, the card shall set the
ERASE_RESET status bit in the status register, reset the erase sequence and execute the last
command. ---这段话啥子意思嘛...

如果擦除区域包含了写保护扇区,则这些区域不会被擦除,仅其余部分被擦除。WP_ERASE_SKIP标志位也会置1

在地址设定命令里面包含的地址以字节为单位,SD卡会自动忽略小于WRITE_BL_LEN大小的低位地址信号

如同块写入,在擦除过程中,SD卡也会拉低DAT0。

阅读(1510) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~