前面的文章提到过SD卡主要分为两个操作模式,一是初始化和识别操作模式,另一种就是这篇文章需要分析的数据传输模式啦。
数据传输模式:
数据传输模式主要有六种状态,分别是Stand-by状态、Transfer状态、Sending-data状态、Receive-data状态、Programming状态、Disconnect状态。这六种状态通过不同的Command就可以切换到某种状态,换句话说,这六种状态贯穿了整个数据传输模式。
要理解数据传输模式的流程,老衲认为除了理解这六种状态,还需要对Commands有一定的了解,越熟悉越好,当然,这并不是叫你去背Commands。好了,我们来看看数据传输模式的流程框图:
![](https://i-blog.csdnimg.cn/blog_migrate/c6aa2a2e5dde63dd001db186d556019b.png)
老衲我第一次看到这图的时候,简直看晕了,有木有!!太恶心了吧,谁定义的协议,敢不敢再复杂一点?没办法,做IT的就是苦逼,只能慢慢一点点啃,在理解流程之前,我们必须讲协议里的英文翻译一遍,然后结合流程图理解到底是怎么一回事,最后结合代码来看,这才能真正明白数据传输的过程是怎么一回事,下面是对英文协议里数据传输模式的翻译:
数据传输模式(翻译):
在SD卡识别模式结束之前,控制器使用的时钟频率均为Fod。在数据传输模式,控制器可能会使用Fpp频率。控制器发送一条SSEND_CSD(CMD9)命令来获取SD卡CSD寄存器(Card Specific Data)里面的描述值,譬如,块长度,卡容量信息等。广播命令SET_DSR(CMD4)配置所有识别卡的驱动段。对应于应用总线LayOut(长度),卡的数量和数据传输频率,这个命令设置DSR寄存器。时钟频率在那个点上也应该从Fod切换Fpp。SET_DSR命令对Host和卡都是可选的。
CMD7 用来选择一个卡并将它置于传输状态(Transfer state),在任何时间只能有一个卡处于传输状态。 如果已有一个卡处于传输状态, 它和主机的连接将释放,并返回到 Stand-by状态。当 CMD7 以保留相对地址“0x0000”发送时,所有卡将返回到 Stand-by 状态。这可以用来识别新的卡而不重置其他已注册的卡。 在这种状态下已有一个 RCA 地址的卡不响应识别命令(ACMD41,CMD2,CMD3)。
数据传输模式下各个状态的转换关系总结如下:
·所有的数据读命令都可以被停止命令(CMD12)在任意时刻终止。数据传输会终止,SD卡返回Transfer状态。读命令有:块读操作(CMD17)、多块读操作(CMD18)、发送写保护(CMD30)、发送scr(ACMD51)以及读模式下的普通命令(CMD56)。
·所有的数据写命令都可以被停止命令(CMD12)在任意时刻终止。写命令也会在取消选择命令(CMD7)之前停止。写命令有:块写操作(CMD24,CMD25)、编程命令(CMD27)、锁定/解锁命令(CMD42)以及写模式下的普通命令(CMD56)。
·数据传输一旦完成,SD卡会退出数据写状态,进入Programming状态(传输成功)或者Transfer状态(传输失败)如果块写操作被叫停,但是写操作包含的最终块其长度和CRC校验是正确的话,数据会被编程到SD卡(从缓存写入到Flash)。
·卡可能提供块写缓冲。 这意味着在前一块数据被操作时,下一块数据可以传送给卡。如果所有卡写缓冲已满, 只要卡在 Programming State, DAT0 将保持低电平(BUSY)。
·写CSD、CID、写保护和擦除时没有缓冲。这表明在卡因这些命令而处于忙时,不再接收其他数据传输命令。 在卡忙时 DAT0 保持低电平, 并处于 Programming State。实际上如果 CMD 和 DAT0 线分离,而且主机占有的忙 DAT0 线和其他 DAT0 线分开,那么在卡忙时,主机可以访问其他卡。
·在卡被编程(programming)时,禁止参数设置命令。参数设置命令包括:设置块长度(CMD16),擦除块开始(CMD32)和擦除块结束(CMD33)。卡在操作时不允许读命令。
·使用 CMD7 指令把另一个卡从 Stand-by 状态转移到 Transfer 状态不会中止擦除和编程(programming)操作。卡将切换到 Disconnect 状态并释放 DAT 线。
·使用 CMD7 指令可以不选中处于 Disconnect 状态的卡。卡将进入 Programming 状态,重新激活忙指示。
·使用 CMD0 或 CMD15 重置卡将中止所有挂起和活动的编程(programming)操作。这可能会破坏卡上的数据内容,需要主机保证避免这样的操作。CMD34-37 CMD50,CMD57保留。
看起来是挺晕的对吧,确实挺晕的,最好的办法就是结合代码去分析读写过程了,这个嘛,后面有机会再详细分析。