分类: 嵌入式
2010-01-13 03:16:00
直到主机知道所有CSD寄存器的内容,fpp时钟速率必须保持在fOD,因为一些卡有操作频率限制。主机发送SEND_CSD(CMD9)获取卡定义数据(Card Specific Data,CSD寄存器),如块大小、卡存储容量、最大时钟速率等。
CMD7用来选择一个卡并将它置于传输状态(Transfer state),在任何时间只能有一个卡处于传输状态。如果已有一个卡处于传输状态,它和主机的连接将释放,并返回到Stand-by状态。当CMD7以保留相对地址“0x0000”发送时,所有卡将返回到Stand-by状态。这可以用来识别新的卡而不重置其他已注册的卡。在这种状态下已有一个RCA地址的卡不响应识别命令(ACMD41,CMD2,CMD3)。
注意:当卡接收到一个带有不匹配RCA的CMD7时,卡将取消选中。在公用CMD线时,选中一个卡时将自动不选中其他卡。因此,在SD卡系统中,主机具有如下功能:
l 初始化完成后,在公用CMD线时,不选中卡是自动完成的。
l 如果使用单独的CMD线,需要关注不选中卡的操作
在主机和选择的SD卡之间的所有数据通信是点对点的方式。所有寻址命令都需要响应。
不同数据传输模式的关系如图4-8所示,使用如下步骤:
l 所有读数据命令可以在任何时候通过停止命令(stop command,CMD12)中止。数据传输将中止,卡回到传输状态(Transfer State)。读命令有:块读命令(CMD17),多块读命令(CMD18),发送读保护(CMD30),发送scr(ACMD51),以及读模式的通用命令(CMD56)。
l 所有写数据命令可以在任何时候通过停止命令(stop command,CMD12)中止。在不选中卡命令CMD7前写命令必须停止。写命令有:块写命令 (CMD24 and CMD25), 写CID (CMD26), 写CSD(CMD27), lock/unlock 命令(CMD42) 以及写模式通用命令(CMD56)。
l 一旦数据传输完成,卡将退出数据写状态并进入Programming State(传输成功)或Transfer State(传输失败)。
l 如果一个快写操作停止,而且最后一块块长度和CRC是有效的,那么数据可以被操作(programmed)。
l 卡可能提供块写缓冲。这意味着在前一块数据被操作时,下一块数据可以传送给卡。如果所有卡写缓冲已满,只要卡在Programming State,DAT0将保持低电平(BUSY)。
l 写CSD、CID、写保护和擦除时没有缓冲。这表明在卡因这些命令而处于忙时,不再接收其他数据传输命令。在卡忙时DAT0保持低电平,并处于Programming State。实际上如果CMD和DAT0线分离,而且主机占有的忙DAT0线和其他DAT0线分开,那么在卡忙时,主机可以访问其他卡。
l 在卡被编程(programming)时,禁止参数设置命令。参数设置命令包括:设置块长度(CMD16),擦除块开始(CMD32)和擦除块结束(CMD33)。
l 卡在操作时不允许读命令。
l 使用CMD7指令把另一个卡从Stand-by状态转移到Transfer状态不会中止擦除和编程(programming)操作。卡将切换到Disconnect状态并释放DAT线。
l 使用CMD7指令可以不选中处于Disconnect状态的卡。卡将进入Programming状态,重新激活忙指示。
l 使用CMD0或CMD15重置卡将中止所有挂起和活动的编程(programming)操作。这可能会破坏卡上的数据内容,需要主机保证避免这样的操作。
4.1 宽总线选择/不选择
宽总线(4位总线宽度)操作模式通过ACMD6选择和不选择。在上电后或GO_IDLE(CMD0)命令后默认的总线宽度是1位。ACMD6命令只在“tran state”有效,即只有在卡选中后(CMD7)总线宽度才能修改。
4.2 读数据格式DAT总线在没有数据传输时处于高电平。一个传输数据块包含一个起始位(LOW),接着连续的数据流。数据流包含有效数据(如果使用了ECC了还包括错误纠正位)。数据流以一个结束位(HIGH)结束。数据传输和时钟信号同步。
以块传输的有效数据包含CRC校验和。产生多项式是标准 CCITT多项式。
采用了缩短的BCH码,d=4,有效数据长度最长为2048字节。CRC校验和对每个DAT线单独计算并附加在每个数据块后。在宽总线模式操作(DAT0-DAT3)中,16位的CRC校验对每个DAT分别计算。
数据块读
传输的基本单位是数据块,最大尺寸在CSD中定义(READ_BL_LEN)。开始和结束地址完全包含在一个物理数据快(如READ_BL_LEN定义)中的较小的块也可以传递。CRC附加在每个数据块的尾部用来保证数据传输的完整性。CMD17(READ_SINGLE_BLOCK)开始一个块读操作,然后传输完成后进入Transfer状态。CMD18(READ_MULTIPLE_BLOCK)开始连续的块传输,直到停止命令。停止命令有一个执行延迟。在停止命令最后一位发送完以后数据传输停止。
如果主机使用累计长度不是块对齐的部分块,在第一个不对齐块的开始,卡会发现一个块未对齐错误,在状态寄存器中设置ADDRESS_ERR错误,中止传输并等待(在Data状态)停止命令。
4.3 数据写格式数据写传输格式类似于读格式。对于以块为单位的写数据传输,CRC检验位附加到每个数据块。卡的每根数据线在接收到数据并在写操作前,执行CRC校验。
数据块写
数据块写(CMD24-27,42,56(W)),一个或多个数据块从主机发送给卡,主机在每个数据块后附加CRC校验。数据块长度WRITE_BL_LEN(512B)。如果CRC校验失败,卡将在DAT数据线上指示错误。传输的数据将被抛弃,而且后续传输的数据块(在多数据块写模式)也都会被忽略。
多数据块写命令比连续的单数据块写命令速度快。不允许部分块写(小于512B)。
当主机试图在写保护区域写数据时写操作将中止。在这种情况下,卡在状态寄存器设置WP_VIOLATION位,并忽略所有后续数据传输,并在Receive-data状态下等待停止命令。
对CID和CSD寄存器进行编程操作不需要实现设置块长度,传输的数据也是CRC保护的。如果CSD或CID寄存器一部分存储于ROM中,那么不可改变部分必须和接收缓冲中的相应部分内容保持一致。如果匹配失败,卡将报告一个错误,而且不改变任何寄存器内容。
接收到一个数据块并完成CRC校验后,卡将开始写,如果写缓冲满而且不能从一个新的WRITE_BLOCK命令接收新数据时, DAT0线保持为低电平。任何时候主机都可以通过SEND_STATUS(CMD13)命令获取卡的状态。状态位READY_FOR_DATA指示卡是否可以接收新数据或写操作还在进行中。主机通过CMD7(选中另一个卡)不选中卡,这个操作可以把卡的状态编程Disconnect并释放DAT线而不中断写操作。当不选中卡时,如果编程还在进行而且写缓冲不可用时,将通过下拉DAT为低电平来重新激活忙信号。实际上,主机通过interleaving可以实现多个卡同时写操作,interleaving过程可以通过在卡忙时访问其他卡实现。
预擦除设置优先于多数据块写操作
设置多个写数据块的预擦除(ACMD23)可以使得接下来的多个数据块写操作比没有预先执行ACMD23的相同操作更快。主机可以通过该命令设置多少个数据块将在接下来的写操作中发送。如果在所有数据块发送给卡时中止了写操作(使用停止传输命令),残余写数据块的内容(指要写入新内容的数据块?)将变得不确定(可能已擦除或还是原来的数据)。如果主机发送了超过ACMD23中定义的数据块数目的数据,卡将逐个擦除数据块(在收到新数据时)。多数据块写操作完成后值将重新设置为默认值1。
建议在CMD25命令前使用该命令以加速写操作。如果需要预擦除主机在写命令前发送ACMD23。如果不发送ACMD23命令,设置的预擦除数将在其他指令执行时自动清除。
发送写数据块数目
系统使用管道机制进行数据缓冲管理,有时候在多数据块写操作过程中发生错误,使得无法确定哪一个数据块是最后成功写入的数据块。卡可以把正常写入的数据块数(the number of well-written blocks)作为对命令ACMD22的响应。
擦除
同时擦除多个写数据块可以提高数据吞吐量。通过ERASE_WR_BLK_START(CMD32)和ERASE_WR_BLK_END(CMD33)实现写数据块的识别。
主机必须严格按照下列的命令操作顺序:ERASE_WR_BLK_START,RASE_WR_BLK_END,and ERASE (CMD38)。
如果不按顺序接收到擦除指令(CMD38)或地址设置指令(CMD32,33),卡将在状态寄存器中设置ERASE_SEQ_ERROR位,并重置整个顺序(sequence)。
如果接收到一个不顺序的命令(除了SEND_STATUS),卡将在状态寄存器设置ERASE_RESET状态位,重置擦除顺序和执行最后的命令。
如果擦除范围包括写保护扇区,将不被擦除,擦除命令只擦除无保护的扇区。状态寄存器的WP_ERASE_SKIP位将设置。
地址设置命令中的地址是以字节为单位的块写地址。卡将忽略所有小于WRITE_BLK_LEN(CSD)LSB(最低有效位)。
如上所述的块写操作,卡通过保持DAT0为低电平指示擦除操作正在进行中。实际的擦除操作时间可能会很长,主机可以通过CMD7不选中卡或执行卡断开操作。
卡上擦除操作后的数据为“0”或“1”,由卡制造商确定。SCR寄存器的DATA_STAT_AFTER_ERASE(bit55)定义了是“0”或“1”。
4.4 写保护管理写保护方法如下:
l 机械写保护开关(由主机负责)
l 卡内部写保护(由卡负责)
l 密码保护锁操作
4.4.1 机械写保护开关 4.4.2 卡内部写保护 4.4.3 密码保护锁操作5 时钟控制
SD卡主机可以使用SD卡总线时钟信号设置卡进入节能模式或控制总线上的数据流。主机可以降低时钟频率或直接关闭。
SD卡主机必须遵循下列约束:
l 总线频率可以在任何时候改变(满足最大和最小值的约束)。
l ACMD41(SD_APP_OP_COND)是一个例外。发送ACMD41命令后,主机将执行下面步骤1和步骤2直到卡进入就绪状态:
1) 持续发送100KHZ-400KHZ之间的时钟频率。
2) 如果主机要停止时钟,通过ACMD41命令以小于50ms的间隔设置busy位。
6 CRC