SDIO协议读写SD卡之数据传输模式介绍
前言
在上一篇文章中,我们介绍了SD卡两种工作模式之一的卡识别模式。今天,我们来介绍一下数据传输模式的一些特点以及两种模式是如何实现转换的。由于本人能力有限,所以文章中难免会有错误和不足之处,还望各位读者可以及时提出来,谢谢!
数据传输模式下的状态机流程图
数据传输模式的状态机如下图所示(来源于SD协议官方文档):
如何实现两种模式的切换
在上一篇文章中,我们说过SD卡在什么情况下会进入卡识别模式,当SD卡重新上下电或者主机向SD卡发送CMD0命令时,SD卡便会进入卡识别模式。那么怎样从卡识别模式进入数据传输模式呢?请听我娓娓道来。。。
由上面的状态机可知,当主机完成SD卡的卡识别模式下的工作之后,主机成功向SD卡发送CMD3命令,并且SD卡成功向主机返回其RCA地址之后,便进入了数据传输模式。CMD3命令的官方说明如下:由上图该命令的描述可知,该命令是一个有响应的广播命令,该命令的作用是让总线上所有的SD卡返回其RCA地址。
那么主机此时是处于什么状态呢?答案是:当主机识别到SDIO总线上的所有设备之后,才会进入数据传输模式。由于我们此处讨论的是总线上仅挂载了一个SD卡的情况,所以在经过了卡识别模式之后,主机便进入了数据传输模式。由上图的状态机可知,当主机进入数据传输状态之后,便进入了待机状态,等待其它命令的到来。
选择数据线宽度
在对SD卡进行读写的时候,可以选择数据线的宽度,包括1-Bit和4-Bits。顾名思义,1-Bit便意味着一个时钟信号下只能发送1-Bit数据,而4-Bits便意味着在一次时钟信号下可以同时发送4-Bits数据。示意图如下所示:
在实际应用中,当SD卡处于传输状态时,主机通过向SD卡发送ACMD6命令,便可以对总线宽度进行配置。该命令的官方说明如下:
通过上面描述,当该命令的参数为00时,则使用1-Bit的数据宽度,当参数为10时,则使用4-Bits的数据宽度。
主机与SD卡之间的连接
主机在进行读写或者擦除SD卡之前,需要先与对应的SD卡进行连接,有上面的状态机我们也可以很清楚的看到,只有当从待机状态发送CMD7命令后,才能够进入传输状态,我们前面说过,只有在传输状态下,才能进行数据的传输过程。
该命令的说明如下:主机通过该命令发送RCA地址,寻找总线上对应的SD卡,从而与之进行连接。
配置数据块的大小
由于对SD卡的读写操作都是以块为单位进行的,所以对数据块的大小进行设置是必要的操作,否则就保持默认大小即可。
在程序中,利用CMD16命令可以实现数据块大小的配置,该命令的说明如下:
但是在实际应用中,数据块的大小与SD卡的容量是相关的。对于SDHC和SDXC卡而言,数据块的大小是固定的,为512Bytes,只有对于SDSC卡而言,才可以通过CMD16命令进行配置。
主机读取SD卡中的数据的过程
在实际应用中,主机可以选择读取SD卡中的单块数据或者多块数据,使用对应的命令便可以完成上述操作。
其中,读取单块数据的命令是CMD17,即READ_SINGLE_BLOCK命令,该命令的官方说明如下:而读取多块数据的命令是CMD18,即READ_MULTIPLE_BLOCK命令,该命令的官方说明如下:
如果选择以多块的方式读取SD卡中的数据,可以利用CMD23命令(SDSC不支持)对数据块的数量进行配置,该命令的说明如下:
或者也可以对SD卡进行连续的读取,但是需要利用CMD12命令在需要的时候终止数据的读取过程。该命令的说明如下:
主机向SD卡中写入数据的过程
与上述主机读取SD卡数据的过程类似,主机同样可以选择向SD卡中写入单块数据或者多块数据。
其中,写入单个数据块的命令是CMD24,即WRITE_BLOCK命令,该命令的说明如下:
而写入多块数据的命令是CMD25,即WRITE_MULTIPLE_BLOCK命令,该命令的说明如下:
同样,如果选择以多块的方式向SD卡中写入数据,也可以利用CMD23命令(SDSC不支持)对数据块的数量进行配置。另外,同样可以通过CMD12命令终止数据的写入过程。值得注意的是,再写入多块数据之前,官方还建议先进行预擦除操作,这样做的目的可以提高写入多块数据的速度。预擦除的命令是ACMD23,该命令的说明如下:
擦除SD卡的过程
擦除SD卡的过程可以分为三个步骤:
1、发送擦除的起始地址(以块为单位);
CMD32命令的说明如下:
2、发送擦除的结束地址(以块为单位);
CMD33命令的说明如下:
3、发送开始擦除命令;
CMD38命令的说明如下:当主机按照上述的步骤发送对应的命令之后,就将开始SD卡的擦除工作。注意:一定要按照上面的步骤,否则会产生相应的错误。并且上面三个命令之间不能插入除了CMD13命令SEND_STATUS之外的其它任何命令,否则也会出错。
如果擦除的区域包括受保护的存储区域,也不会对受保护的区域产生影响,但是SD状态寄存器对应的寄存器位将会被置1。
总结
本文中,我们主要介绍了SD卡的读写操作和擦除操作的大概工作流程,其中的一些细节并未列出。如有疏漏或错误之处,还望读者多多包涵。