SDIO协议读写SD卡之卡识别模式介绍

时间:2024-04-10 21:11:36

前言

SD卡的工作模式分为两类,分别为卡识别模式数据传输模式,在SD卡上电或者主机发出复位命令之后的默认工作模式为卡识别模式。本文主要对卡识别模式进行介绍。

命令简介

在利用SDIO协议进行SD卡驱动开发中,与SPI协议驱动串行Flash类似,也是利用各种不同的命令实现对SD卡的控制。此处进行一个大致的阐述。

命令数量

在SDIO协议中,一共有64个命令,且每个命令的长度均为48-Bits。另外,命令的格式都是固定的,都以0作为起始位,以1作为结束位,唯一不同的便是中间部分的内容,包括传输方向、参数、地址、CRC等内容。

命令的传输路径

由上一篇文章《SDIO协议读写SD卡之SD卡简介》可知,命令都是主机通过命令线传输至SD卡的。并且,当SD卡和主机工作在本文所述的卡识别模式下时,也仅仅会使用命令线进行通讯,在这个阶段不会使用到数据线。

命令的分类

无响应广播命令bc、有响应广播命令bcr、无响应寻址命令ac和有响应寻址命令acr。顾名思义,广播命令便是整个总线上都可以接收到的命令,而寻址命令就是主机发送给指定SD卡的命令。至于响应,便是主机发送某些命令时,SD卡会向主机反馈一些信息,这就被称为响应。而响应也可以被分为短响应长响应,具体的讲解在后续涉及的地方进行详述。

卡识别模式下的状态机

首先,我们通过下面的状态机流程图,对卡识别模式下的流程进行一个大概但是全面的了解,毕竟之后的SD卡驱动程序均是基于此流程图进行开发的。我们也将通过下面的状态机,对后续的内容进行展开。
SDIO协议读写SD卡之卡识别模式介绍

上图中,红色标记表示的是命令黄色标记表示的是状态,而亮青色表示的是进入SPI模式的方式,本文暂时不进行展开。下面对卡识别模式下使用的命令的作用进行介绍,但是详细的内容,请读者参考SDIO协议官方文档,也可以理解得更加深刻。

CMD0命令

CMD0命令也称为GO_IDLE_STATE,即软件复位命令。由上图中的描述可知,在SDIO协议中,无论SD卡当前处于什么状态,只要主机向SD卡发送CMD0命令之后,那么总线上所有的SD卡便会返回工作最开始的待机状态。CMD0的官方描述如下:
SDIO协议读写SD卡之卡识别模式介绍

CMD8命令

CMD8命令也称为SEND_IF_COND,该命令最主要的作用是判断SD卡是否可以在当前的电压下进行正常工作。在实际应用中,按照下表向该命令的VHS参数中写入相应的值,便可以进行上述测试。
SDIO协议读写SD卡之卡识别模式介绍
比如,如果当前芯片提供的电源为3V,那么,向CMD8命令的VHS写入0001b即可进行测试。通过R7响应内容便可以判断SD卡是否支持当前电压,如果SD卡不支持当前的电压,那么将不会做出响应,且SD卡将保持在空闲状态

ACMD41命令

当SD卡的协议为V2.00以及之后的版本中,必须在发送CMD8之后,才能发送ACMD41命令。且为了区别ACMD41CMD41命令,在需要发送ACMD41命令之前,需要先发送CMD55命令。
ACMD41命令的主要作用是初始化SD卡,主要是配置SD卡的容量大小性能等,然后通过R3响应,判断对SD卡的配置是否正确。要实现SD卡的初始化,按照下面的状态机进行编程即可。
SDIO协议读写SD卡之卡识别模式介绍

CMD11命令

由上图可知,只有当ACMD41命令的参数S18A以及R3响应的S18R均为0时,才允许主机向SD卡发送CMD11命令。该命令的主要作用是可以切换SD卡的工作电压范围,将其工作电压切换为1.8V。由于暂时没有这个需求,故此处仅作简单的介绍。

CMD2命令

不满足上述发送CMD11命令的任一条件时,主机便需要直接发送CMD2命令。该命令的作用是获取SD卡的CID信息,类似于Flash的ID信息。该信息是存储在SD卡的CID寄存器中。当主机发送该命令之后,SD卡便会通过R2响应,将该信息反馈给主机。

CMD3命令

CMD3命令是由卡识别模式切换为数据传输模式必经之路。该命令的作用是获取SD卡的相对地址RCA,因为主机是通过这个地址对总线上的SD卡进行寻址的,所以该命令是必须的。而SD卡通过该命令的响应返回其自身的相对地址,当主机接收到RCA地址之后,便会进入待机状态,从而进入数据传输模式。如果主机想为SD卡重新分配一个RCA地址,那么只需要再发送一次CMD3命令,SD卡便会返回一个新的RCA地址。

总结

状态机编程是开发SD卡驱动的基础,只有深刻理解了其各个状态的含义及行为之后,才有可能正确实现SD卡的读写操作。
本文主要对SD卡工作在卡识别模式下时的工作流程以及相关的命令进行了阐述,如果需要在实际应用中实现,还需要读者自己去深刻体会。更多的内容将在后面的文章中进行介绍,本文如有不足或者疏漏之处,还请各位读者不吝指正,我会在以后的文章中进行完善和规避,谢谢!