数据写传输格式类似于读格式。对于以块为单位的写数据传输,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”。