转自:http://hi.baidu.com/narshben/blog/item/cfcb983e52e36c3271cf6cb2.html
数据传输模式:
在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保留
![](https://i-blog.csdnimg.cn/blog_migrate/29d70ca6fdf707aeaa95f409e2e55797.jpeg)