SD标准提供了很大的灵活性,除了作为存储卡外,还提供了SD卡槽的标准来扩展设备的功能。本篇文章就先来介绍一下SD总线的规范。对于SD/MMC协议的发展历史和概念介绍,可以参考我的这篇文章:SD、SDIO和MMC接口基础和规范介绍

1 SD总线协议

SD总线上的通信以命令/数据的比特流为基础,起始位表示数据的传输的开始,终止位表示数据传输的结束。

  • 命令(Command):命令是开启一个操作的标志。命令可以从主机发送到单个卡(寻址命令),也可以发送到所有已连接的卡(广播命令),命令通过CMD线以串行方式传输
  • 响应(Response):响应是卡收到命令后,需要发送到主机的命令的应答,响应通过CMD线以串行方式传输
  • 数据:数据的传输是双向的,通过Data线传输。

在这里插入图片描述
SD卡寻址是利用初始化阶段分配给卡的会话地址来实现的,SD存储卡的数据输入/输出是以块进行的,数据块后面跟着CRC位用于校验。主机可对数据传输进行配置,采用单线或多线传输数据。
在这里插入图片描述
在进行块写入操作时,DAT0数据线表示忙信号,而不管用于传输数据的数据线数量。
在这里插入图片描述
其中,命令字段的组成如下:
在这里插入图片描述
每个命令以起始位(0)开始,以终止位(1)结束,总长度为48位,且每个命令都通过CRC(16位CCITT多项式)来检测传输错误。根据内容的不同,响应字段有四种编码方式,长度是48或136位。
在这里插入图片描述
在CMD线上,最高有效位(MSB)首先传输,最低有效位(LSB)最后传输。当使用宽总线选项时,数据以每次传输4位的方式传送。对于每个DAT线,都会传输起始位、结束位以及CRC位。CRC位会分别对每个DAT线进行计算和检查。CRC状态响应和繁忙指示将仅通过DAT0由SD卡发送给主机。

SD卡有两种数据包格式:
(1)通用数据(8位):先发LSB,最后发MSB。但是若只有一个字节,则是先发MSB,最后发LSB。
在这里插入图片描述

(2)长数据(SD存储寄存器):从MSB开始传送。
在这里插入图片描述

2 SD内存卡功能描述

  • 主机和SD卡之间的所有通信都由主机端控制。主机发送两种类型的命令

    • 广播命令:广播命令发送给所有SD卡,其中一些命令需要响应
    • 寻址(点对点)命令:寻址命令发送给寻址的卡片,并引发该卡片的响应。
  • SD卡识别模式:主机在复位后以及在总线上寻找新SD卡时将进入SD卡识别模式,卡片在复位后将一直处于此模式,直到接收到SENDRCA命令(CMD3)

  • 数据传输模式:SD卡在其RCA(Relative Card Address,相对卡片地址)首次分配后将进入数据传输模式,主机在识别总线上的所有卡片后将进入数据传输模式。

下表显示了操作模式和卡片状态之间的依赖关系:
在这里插入图片描述

3 SD卡识别模式

在SD卡识别模式下,主机会对所有处于此模式的SD卡进行复位,验证操作电压范围,识别SD卡并要求它们分配相对卡片地址(RCA)。这个操作会针对每张SD卡分别在其独立的CMD线上执行。在SD卡识别模式中,所有数据通信仅使用CMD线。在SD卡识别以SD时钟频率进行操作。

3.1 复位(Card Reset)

命令GOIDLESTATE(CMD0)是软件复位命令,它会将每张SD卡都置于空闲状态。

3.2 操作条件验证(Operating Condition Validation)

主机通过使用特定电压发出复位命令(CMD0),并假定SD卡支持该电压。为了验证电压,SD物理层规范版本2.00中定义了用于验证SD存储卡接口的操作条件命令:SENDIFCOND(CMD8)。SD卡通过分析CMD8的参数来检查操作条件的有效性,而主机则通过分析CMD8的响应来检查有效性。提供的电压由参数中的VHS字段表示。SD卡片将VHS中指定的电压视为当前提供的电压。VHS字段只能有1 bit设置为1。用于主机检查主机和SD卡之间通信的有效性的方法包括CRC和校验模式。如果SD卡无法在提供的电压下运行,它不会响应,并保持在空闲状态。在初始化高容量SD存储卡之前,发出CMD8命令是强制性的。

SDSENDOPCOND(ACMD41)用于识别和拒绝与主机所需的VDD范围不匹配的SD卡,它们将不再参与总线操作,并进入非活动状态。注意,ACMD41是特定于应用程序的命令,因此在ACMD41之前必须先发送APPCMD(CMD55)表示接下来要发送应用程序命令。

在这里插入图片描述

3.3 SD卡初始化和识别(Card Initialization and Identification)

SD卡的初始化过程从SDSENDOPCOND (ACMD41)开始,通过设置其操作条件和OCR中的HCS (Host Capacity Support,主机容量支持)位。HCS位设置为1表示主机支持高容量SD存储卡,反之不支持。
在这里插入图片描述

3.4 数据传输模式(Data Transfer Mode)

在SD卡识别模式结束之前,主机应保持在fOD频率,因为在此间,一些SD卡可能存在操作频率限制。在数据传输模式下,主机可以在fpp频率范围内操作SD卡。主机发出SENDCSD(CMD9)以获取SD卡的特定数据(从Card Specific Data,即CSD寄存器中获取),例如块长度、存储容量等。广播命令SETDSR(CMD4)配置所有已识别SD卡,对它们进行驱动阶段的设置,包括DSR(Device Select Register,设备选择)寄存器、总线上所接SD卡的数量和数据传输频率。此时时钟率也将从fOD切换到fpp。SETDSR命令是可选的,即可以不发。

CMD7用于选择一张SD卡并将其置于传输状态。同一时间内只有一张SD卡可以处于传输状态。如果有SD卡正在处于传输状态,则它与主机的连接将被释放,并返回到空闲状态。当使用保留的相关地址0x0000发出CMD7时,所有SD卡都将返回到空闲状态。
在这里插入图片描述
各种数据传输模式之间的关系总结如下:

  • 所有数据读取命令可以通过停止命令(CMD12)随时中止。数据传输将终止,并且SD卡将返回到传输状态。读取命令包括:块读取(CMD17)、多块读取(CMD18)、发送写保护(CMD30)、发送SCR(ACMD51)和读模式下的通用命令(CMD56)

  • 所有数据写入命令可以通过停止命令(CMD12)随时中止。在通过CMD7取消选定SD卡之前,应先停止写入命令。写入命令包括:块写入(CMD24和CMD25)、CSD编程(CMD27)、锁定/解锁命令(CMD42)和写模式下的通用命令(CMD56)

  • 一旦数据传输完成,卡将退出数据写入状态,进入编程状态(传输成功)或传输状态(传输失败)

  • 如果块写入操作被停止并且最后一个块的块长度和CRC是有效的,则这个块会被写入

  • SD卡可以对块写入进行缓冲处理,这意味着下一个块可以在上一个块被编程的同时发送到SD卡中

    • 如果所有的写入缓冲区都已满,并且SD卡处于编程状态,DAT0将保持低电平(BUSY)
  • 写入CSD、写保护和擦除操作不能缓冲。这意味着当SD卡忙于处理其中任何一个命令时,不会接受其他数据传输命令

    • 只要卡处于忙状态和编程状态,DAT0线路将保持低电平。实际上,如果卡的CMDDAT0线路是分开的,并且主机将忙的DAT0线与其他卡的DAT0线断开连接,主机可以在卡处于忙状态时访问其他卡
  • 在SD卡编程过程中不允许设置参数命令

    • 参数设置命令有:设置块长度(CMD16)、擦除块起始(CMD32)和擦除块结束(CMD33)
  • 在SD卡编程过程中不允许使用读取命令

  • 从空闲状态切换到传输状态(使用CMD7)不会终止擦除和编程操作,SD卡将断开连接并释放DAT线。

  • 在断开状态下,可以使用CMD7重新选定SD卡。在这种情况下,SD卡将设置为到编程状态并指示总线忙

  • 重置卡(使用CMD0CMD15)将终止任何未决或正在活动的编程操作。这可能会破坏卡上的数据内容,但这是主机需要考虑的,要防止发生这种情况。

  • CMD34-37CMD50CMD57是专为SD命令系统扩展而保留的。这些命令的状态转换在每个命令系统规范中有定义。

3.5 命令(Commands)

3.5.1 命令格式

所有命令的固定代码长度为48位,需要1.92µs(25MHz)或0.96µs(50MHz)的传输时间。
在这里插入图片描述

3.5.2 详细命令描述

在这里插入图片描述

3.6 响应(Responses)

所有的响应都通过命令行CMD来发送,响应传输始终以与响应码字相对应的位字符串的左侧一位开始,响应码的长度取决于响应类型。SD存储卡有五种类型的响应,SDIO卡则额外支持两种响应类型(R4和R5)。

3.6.1 R1(normal response command):

响应码的长度为48位,其中第45位到第40位表示要响应的命令的索引,卡的状况用32位进行表示。
在这里插入图片描述

3.6.2 R1b

R1bR1相同,只是可以额外在数据线上发送一个可选的忙信号。在接收这些命令之前处于忙状态中的卡在接收这些命令之后可能仍然处于忙状态,主机应在响应中进行忙检查。

3.6.3 R2(CID, CSD register)

响应码长度为136位。CID寄存器的内容作为对CMD2CMD10命令的响应进行发送。CSD寄存器的内容作为CMD9的响应进行发送。仅传输CIDCSD的位[127:1],这些寄存器的Bit 0表示响应的结束。
在这里插入图片描述

3.6.4 R3(OCR register)

响应码长度为48位,OCR寄存器的内容作为对ACMD41的响应进行发送。
在这里插入图片描述

3.6.5 R6(Published RCA response)

响应码长度为48位。其中第[45:40]位指示要响应的命令的索引,在这种情况下,该值为000011(与Status Bit中的第5位共同使用可以表示CMD3)。Argument field的高16位用于新发布的RCA(Relative Card Address)号。
在这里插入图片描述

3.6.6 R7(Card interface condition)

响应码长度为48位。卡支持的电压信息作为CMD8的响应发送。[19:16]位表示卡所支持的电压范围。接受了所提供电压的SD卡将返回R7响应。在响应中,SD将回传设置的电压范围和校验模式。
在这里插入图片描述
其中Voltage accepted字段如下:
在这里插入图片描述

4 总结

本文大致地介绍了一下SD总线协议,主要是为了理解SD卡初始化和使用的过程。具体的一些指令和操作流程就没有详细说明了,大家可以参考文档:SD物理层规范文档

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐