Abbreviation

Abbr Desc
SD Secure Digital
MMC Multi Media Card
eMMC embedded Multi Media Card
CMD Command
CLK Clock
DAT Data
CRC Cyclic Redundancy Code
CID Card Identification Register
CSD Card-Specific Data Register
DSR Drive State Register
OCR Operation Condition Register
RCA Relative Card Address
SCR SD Configuration Register
UHS Ultra High Speed
SDR Single Data Rate
DDR Double Data Rate
SDSC Standard Capacity
SDHC High Capacity
SDXC Extended Capacity
SDUC Ultra Capacity
ac Addressed (point-to-point) commands
bc Broadcast commands
bcr Broadcast commands with response
adtc Addressed (point-to-point) data transfer commands

Classification

SD card

  • 按速度分类

    • 速度等级是最早的标准,用一个圆圈里的数字表示。有四个等级:

      • C2(最低写入速度为2MB/s)
      • C4(4MB/s)
      • C6(6MB/s
      • C10(10MB/s)。现在大多数的SD卡都是C10的,因为它是很多设备的最低要求。
    • UHS速度等级是更高级的标准,用一个U字母里的数字表示。这个等级主要针对需要高速写入的视频录制设备,比如4K摄像机。一般来说,如果你要录制4K视频,你至少需要一个U3的SD卡。有两个等级:

      • U1(最低写入速度为10MB/s)
      • U3(30MB/s)
    • 视频速度等级是最新的标准,用一个V字母里的数字表示。这个等级主要针对需要超高清视频录制的设备,比如8K摄像机。一般来说,如果你要录制8K视频,你至少需要一个V60的SD卡。有六个等级:

      • V6(最低写入速度为6MB/s)
      • V10(10MB/s)
      • V30(30MB/s)
      • V60(60MB/s)
      • V90(90MB/s)
      • V120(120MB/s)
  • 按容量分类

    SD卡有四种不同的规格和格式:

    • SDSDSC:标准容量,最大存储容量只有2GB。
    • SDHC:高容量,存储容量从4GB到32GB不等。
    • SDXC:扩展容量,存储容量从64GB到2TB不等。
    • SDUC:超级容量,存储容量从2TB到128TB不等。
  • 按电压分类

    按信号电压分类,信号电压是指SD卡和设备之间传输数据时的电压水平,1.8V的信号电压可以提供更快的上升/下降时间和更低的电磁干扰。SD卡有两种不同的信号电压:

    • 3.3V
    • 1.8V

    NOTE:该电压只是信号电压,对于卡的VDD供电仍为3.3V。

  • 按尺寸分类

    按尺寸分类,不同的尺寸适用于不同的设备,比如手机和相机。SD卡有三种不同的尺寸

    • standardSD:标准的SD卡
    • miniSD:迷你的miniSD卡
    • microSD:微型的microSD卡
  • 按接口分

    SD目前有2种通信接口,分别为:

    • UHS-I
    • UHS-II

    按总线接口分一共有4种,分别为:

    • SD
    • SPI
    • UHS-II
    • PCIe

SD卡在不同模式下的速度:

summary of bus speed mode

Bus protocol

Command & Response & Data

SD总线的通信是基于命令和数据流的。由一个起始位开始,由一个停止位终止。

  • 命令(Command):命令就是一个标记,用于发起一个操作。由主机发送到单个卡(寻址命令)或者所有卡(广播命令)。命令在CMD线上是连续传输的。
  • 响应(Response):响应是一个标记,从寻址的卡或者所有卡(同步)发送给主机,作为向前接收到的命令的回答。响应也是在CMD线上连续传输的。
  • 数据(Data):数据可以从主机到卡,也可以从卡到主机。通过数据线传输。

no response and no data operations

Command

command token format

command0 example

NOTE:Command和Response通过检查CRC7来保证其有效性,而Data是使用CRC16来校验数据

Response

response token format

Response一共分为以下6种:

  • R1:返回卡的状态信息
    R1
  • R1b:相较于与R1响应增加了Busy信号

    Note:Busy信号在DAT0信号线上传输,Busy: 0, Idle: 1

  • R2:返回CIDCSD寄存器的值。CID寄存器值,作为CMD2CMD10响应;或CSD寄存器值,作为CMD9响应。注意只传输[127:1]位,第0位被结束位替代。
    R2
  • R3:返回OCR寄存器的值,此为ACMD41响应
    R3
  • R6:返回卡已发布的RCA地址
    R6
  • R7:返回卡接口状态,其中还包含UHS-IIPCIe相关的响应
    R7

Data

数据在DAT线传输如下所示

Data Packet Format for Usual Data

Data Packet Format for Wide Width Data

一般对于UHS-I的卡来说,DAT采样分为SDR模式和DDR模式。

值得注意的是,对于DDR模式下的卡,其数据是双沿采样的,因此在相同频率下可以提供两倍于SDR模式的速度。

DDR50 Mode with Usual Data

DDR50 Mode with Wide Width Data

Registers

SD中定义了6个寄存器:OCRCIDCSDRCADSRSCR,这些寄存器都可以通过相对应的命令进行访问。

NOTE:卡寄存器读取,字节序是大端,位序是小端

OCR

Operation Condition Register

用于确认卡的操作条件,包括了电压范围、卡容量大小(访问单位)和卡的上电状态。

访问命令:ACMD41

OCR

  • bit 7:双电压卡定义,接收到CMD8后会设置该位为1
  • bit 15~23:卡的VDD支持的电压范围(UHS-IIVDD1)
  • bit 30:指示在卡容量的状态位,0为SDSC
  • bit 31:如果板卡通电过程已完成,则设置该位为1

Note:

握手阶段使用ACMD41读取bit31,检查SD卡状态

CID

Card Identification Register

用于确认卡ID信息。

访问命令:CMD2

CID

  • MID:厂商的识别号,一个用于识别卡厂商的8-bit二进制数。由SD-3C,LLC控制、定义和分配给SD卡厂商,以保证唯一性。
  • OID:卡OEM和/或卡内容识别号(当ROM或FLASH卡被用作发布媒介时)的2字符的ASCII字符串。由SD-3C,LLC控制、定义和分配给SD卡厂家,以保证唯一性。
  • PNM:产品名,5字符的ASCII字符串。
  • PRV:产品版本由两个二进制编码的十进制(BCD)数字。
  • PSN:序列号,32位二进制数。
  • MDT:出厂日期。
  • CRCCRC7,这是对CID内容计算的校验和。

CSD

Card-Specific Data Register

访问命令:CMD9

CSD

CSD Version 1.0
CSD Version 2.0
CSD Version 2.0
CSD Version 3.0

获取卡容量

Memory capacity=BLOCKNRBLOCK_LENBLOCKNR=(C_SIZE+1)MULTMULT=2C_SIZE_MULT+2,C_SIZE_MULT<8BLOCK_LEN=2READ_BL_LEN,READ_BL_LEN<12\begin{aligned} Memory\ capacity &= BLOCKNR * BLOCK\_LEN\\ BLOCKNR &= (C\_SIZE + 1) * MULT\\ MULT &= 2^{C\_SIZE\_MULT + 2}, C\_SIZE\_MULT < 8\\ BLOCK\_LEN &= 2^{READ\_BL\_LEN}, READ\_BL\_LEN < 12 \end{aligned}

RCA

Relative Card Address Register

可写的 16 位卡相对地址寄存器,在卡的初始化期间,由卡向外发布的卡地址。这个地址用于卡初始化进程之后,主机同卡之间的交互寻址。

默认的RCA寄存器值是0x0000,这个是保留值,可以用来通过CMD7设置所有卡到Stand-by State

CMD3

DSR

Driver Stage Register

16位驱动阶段寄存器,是可选的,可以用来在扩展操作条件中,提高总线性能(受总线长度,传输速率和卡数目的影响)。CSD寄存器中有DSR寄存器是否使用的标志。DSR默认值是0x404

SCR

SD Configuration Register

  • SD_SPEC: SD卡物理层规范的版本
  • SD_BUS_WIDTHS: SD卡总线宽度

CMD3

SCR

Physical

常见的多卡连接主机拓扑,如下图所示:

SD Memory Card System Bus Topology

其中标准SD卡的接口一般定义如下:

Card Shape and Interface

Card Pad Assignment

Card Detect

一般使用DAT3引脚作为卡检测的输出引脚,该引脚在SD卡内部做了50KΩ50K\Omega的上拉电阻,所以当卡插入并上电后,该引脚电平会被拉高,主机可以检测该引脚电平来确定卡的插入状态。

同时主机可以通过使用ACMD42命令SET_CLR_CARD_DETECT取消卡选择来将该DAT3拉低。

ACMD42

NOTEDAT3引脚还具有模式选择的功能,当主机在上电时主动将其拉低时,SD卡将进入SPI模式

Write Protect

写保护有SD接口上有个专门的WP引脚开关,拨动开关后可以开启“写保护”功能,值得注意的是写保护开关只是简单的电平开关,本身是没有硬件保护的实现,因此该写保护依赖于主机的实现。其电平对应的卡状态如下:

  • 高电平为可写状态
  • 低电平为保护状态

State machine

Card States and Operation Modes

Inactive mode

  • ACMD41: SD_SEND_OP_COND,初始化设置工作电压范围时,不兼容卡自动进入Inactive State

  • CMD15: GO_INACTIVE_STATE,主机选定需要停用的卡进入Inactive State

  • 只能依靠上电复位(所有线电平拉低)退出此状态

Card Identification Mode

在卡识别模式下,主机重置所有处于卡识别模式的卡,获取卡操作电压范围,识别卡,并获取其相对卡地址(RCA)。此操作将在每个卡自己的CMD线上分别执行。卡识别模式下仅使用CMD线进行数据通信。在卡识别过程中,卡应以识别时钟速率fOD{0,[100kHz,400kHz]}f_{OD} \in \{0, [100kHz,400kHz]\}的SD时钟频率运行。

NOTE:时钟频率为0表示时钟已停止

SD card identification state diagram

Card reset

  • 上电:在卡上电完成后,所有卡都会进入Idle State

  • 软复位命令:GO_IDLE_STATECMD0),可以将任意卡设置为Idle StateInactive State的卡除外)。

    CMD0

Idle State的卡CMD线处于输入模式,等待下一个命令的起始位。

在卡的初始化过程中会使用以下默认配置:

  • 相对卡地址:RCA=0x0000,复位前的RCAUHS-II
  • 时钟频率:100KHz~400KHz
  • 驱动程序强度:最高驱动电流能力(3.3V),B型驱动器指定(1.8V

Condition validation

Send Interface Condition Command

使用SEND_IF_CONDCMD8)获取SD卡操作条件。卡会通过分析CMD8的参数来检测操作条件的正确性。而主机会通过分析CMD8的响应来检查正确性。支持的电压是由参数里的VHS区指定的。卡会假设VHS里面指定的电压是当前支持的电压。每一次命令VHS里面只有1位能被设置为1。主机会通过CRC和检查模式来确认通信的有效性。

  • 如果卡能够在支持电压下操作,响应会传回命令参数里设置的支持的电压和检测模式。
  • 如果卡不能在支持电压下操作,就不会发送响应,并保持在Idle State

CMD8

format of cmd8

NoteCMD8V2.0中定义的新命令,此版本之前的SD卡不支持该命令,因此使用此命令区分V2.0之前的卡。

强制要求:在发送第一个ACMD41之前要先发送CMD8,以便初始化SDHCSDXCSDUC卡。SD卡如果收到CMD8,就会知道主机支持V2.0或更高版本,就可以启用新功能。同样强制的,低电主机在发送ACMD41之前,也要发送CMD8。如果双电压卡没有收到CMD8,那么卡就会作为高电压卡来工作,并且如果低电主机不发送CMD8的话,卡在收到ACMD41命令(设置电压范围为低电压)后会进入Inactive State

Send Operation Condition Command

Card Initialization and Identification Flow

ACMD41是用来提供给主机一种机制来识别和拒绝那些不匹配它期望的电压范围的卡。主机通过发送ACMD41命令来查询每张卡信息,并确定出通用的电压范围(OCR寄存器定义了其电压范围)。之后,主机重新发送ACMD41并选择该通用工作电压参数,这样可以让不兼容的卡进入Inactive State,并以此开始卡的初始化流程。

ACMD41
ACMD41 Argument
ACMD41 Response

Note

  1. Idle State下用于 CMD55ACMD41前使用)的RCA值为默认的0x0000
  2. 在初始化过程中,主机不能够改变卡的工作电压,实际的电压切换流程得再之后的CMD11命令流程中完成。

Bus Signal Voltage Switch

Voltage Switch Sequence

Signal Voltage Switch Sequence

当卡发出CMD11: VOLTAGE_SWITCH的响应后,会立即将CMD线和DAT线拉低(主机若没有检测到该低电平,将停止电压切换),主机停止时钟供应,此时卡开始进行电压切换,等待至少5ms后,主机重新开始输出1.8V时钟,并在输出时钟的至少1ms后检查DAT线确认电压是否切换成功。卡检测到1.8V的时钟后,将CMD线拉高并停止三态,若检测到CMD电压成功切换,此时卡再将DAT线拉高,最后主机检查DAT线为高确认卡电压切换成功。

CMD11

NOTE

  1. 电压切换的电压只针对于CLKCMDDAT等信号的电压,对于卡供电的VDD则仍旧为3.3V。
  2. 只有USH-I的卡才支持电压切换功能

电压切换功能依赖于外部PCB的电路实现,下面是一款NXP Semiconductors的一款电压转换芯片NVT4857UK的参考电压切换应用框图:

NVT4857UK

Identification State & Stand-by State

  • CMD2: ALL_SEND_CID,获取卡CID命令。处于Ready State的卡会回复CID作为该命令的响应,回复完成后卡将进入Identification State

    CMD2

  • CMD3: SEND_RELATIVE_ADDR,通知卡发布一个新的相对地址(RCA),此地址用作数据传输模式下的卡地址。一旦收到RCA,卡就会变为Stand-by State。这时,如果主机想要分配另一个RCA ,它可以再发送一个CMD3,通知卡重新发布一个RCA 。最后一个产生的RCA才是有效的。

    CMD3

主机会重复识别进程,为系统中的每个卡循环发送CMD2CMD3

Data Transfer Mode

Data Transfer Mode

CMD7: SELECT/DESELECT_CARD,命令在Stand-by StateTransfer State之间,或Programming StateDisconnect State之间进行状态切换。在这两种情况下,卡检查RCA地址,若地址相匹配,则该卡被选中,不匹配则被取消选中。

CMD7

NOTE:使用Address 0可以取消所有卡的选中。
当RCA等于0的情况下,主机可以执行以下操作之一:

  • 使用其他RCA号执行卡取消选择。
  • 重新发送CMD3,将其RCA号更改为0以外,然后使用CMD7RCA=0进行卡取消选择。

Card Lock/Unlock Operation

如果卡被锁了,使用CMD42: LOCK_UNLOCK进行解锁操作(1-bit width, mandatory from version 2.00)

CMD42

解锁操作需要输入对应的密码,

  • 密码正确,则该卡锁定的状态位将清零
  • 密码错误,则将在状态寄存器中配置LOCK_UNLOCK_FAILED错误位

NOTE:解锁效果只持续到此次上电阶段。只要PWD没有被清除,该卡将在下一次通电时自动锁定。永久解锁该卡的唯一方法是通过清除密码。

Wide Bus Selection/Deselection

可以使用ACMD6: SET_BUS_WIDTH,配置数据总线宽度。卡上电或软复位命令CMD0为将配置总线宽度为1bit。

ACMD6

使用ACMD6,应该满足以下两个条件:

  • 卡处于Transfer State
  • 卡未被锁定(锁定的卡会认为ACMD6 是无效命令

NOTE:若卡被锁,那么主机发送的ACMD6命令会被卡拒绝。同时主机若需要发送CMD42的数据时,则需要根据当前线宽模式发送数据。
ACMD6 and Lock/Unlock State

Switch Function

CMD6: SWITCH_FUNC,用于切换或扩展存储卡功能。

CMD6

CMD6有两种模式:

  • Mode 0:Check Function,用于查询SD卡所支持的Function
  • Mode 1:Set Function,用于切换卡的Function

目前已定义了四个功能组:

  • Access mode:SD总线接口速度模式的选择
  • Command system:命令系统的拓展。
  • Driver Strength:在UHS-I模式下选择合适的输出驱动强度,取决于主机环境
  • Power Limit:选择限制最大功率,取决于主机的电源供应能力和散热能力。因为考虑到UHS-II板卡上的两个电源电压,修改原描述Current Limit。

CMD6

Tuning

  • 在TX方向发送时,时钟和数据方向一致,因此不需要关心延时

    NOTE:由于板级走线或IO时序约束原因,也存在TX方向的延时的方案

  • 在RX方向接收时,时钟和数据方向相反,DAT数据有往返的时延(Round-trip delay),因此需要在接收的采样时钟上增加延时,调整数据采样点

Delayed internal clock method

CMD19Send Tuning Block,使用一个已知的预定义数据块(Tuning Block)来调整采样点,以调整所需的主机。采样点的调整能力对于HOST-SDR-VD是强制性的,而对于HOST-SDR-FD则是可选的。该命令为每个特定的主机和卡提供了系统的最佳时间,并补偿了时序中的静态延迟,包括工艺、电压和不同的PCB负载和偏差。

CMD19

Tuning Block

Tuning Block on Data

调优过程中,要求在150ms的时间内完成40CMD19的执行序列,在此期间不能有其它命令发送

NOTE:总线时钟可以随时改变,但是改变的范围限定在由标准规定的当前传输阶段的最大时钟范围内。

Erase operation

使用多块擦除命令可以提高数据的吞吐量。使用CMD32命令ERASE_WR_BLK_STARTCMD33命令ERASE_WR_BLK_END,可以配置擦除的起始块和结束块,使用CMD38命令ERASE执行实际的擦除指令。擦除完后实际颗粒数据是0还是1,取决于SCR寄存器的DAT_STAT_AFTER_ERASE(只读)位域。

CMD32
CMD33
CMD38

NOTE:如果擦除范围包含了保护区内容,则保护区内容不会动,只擦除非保护区的部分,且此时状态寄存器的WP_ERASE_SKIP位被置起

预擦除功能:

使用ACMD23命令SET_WR_BLK_ERASE_COUNT,可以在写之前配置可以提高多块写的速度,这是因为主机通常会使用这个命令来定义下一个要写的数据块的数目。如果主机要发送比ACMD23配置的更多的数据量,则卡会收到一个块擦除一个块然后再写下这个块

ACMD23

Read operation

数据读取一般有两种方式:

  • 对于V2.0以下的低容量卡SDSC,采用按字节读取的方式
  • 对于V2.0及以上的高容量卡,采用按块读取的方式

Block read:是以Block为单位的数据传输,块长度由CMD16命令SET_BLOCKLEN设置(此长度不管CSD寄存器定义的READ_BL_LEN(只读)的值是多少),其最大传输大小为512Bytes(若块大小配置大于512Bytes,则卡状态寄存器BLOCK_LEN_ERROR位将置起),有单块和多块传输。
CMD16

NOTE:由于DDR模式是双沿采样,因此在此模式下块长度需要配置为偶数

Multiple blocks read operation

  • CMD17: READ_SINGLE_BLOCK,代表读取一个块的内容,传输结束后,回到Transfer state

    CMD17

  • CMD18: READ_MULTIPLE_BLOCK,代表读取多个连续的块。块会一直连续传输直到CMD12STOP_TRANSMISSION)命令发出。因为连续数据传输,停止命令会有些执行延迟。数据传输会在停止命令的结束位发送之后停止。

    CMD18
    CMD12

    NOTECMD23命令SET_BLOCK_COUNT,可以配置CMD18所读取的长度
    CMD23

如果主机使用部分块的累计长度不能对齐,而该卡又不允许不对齐,则卡应该在第一个不对齐的块开始传输的时候就检测到这个问题,然后设置ADDRESS_ERROR错误位到卡状态寄存器,并停止传输,此时卡回到Transfer State等待主机发送停止命令。

Read Command Blocklen

Write operation

multiple block write operation

单块写和多块写:

  • CMD24WRITE_BLOCK,写单块数据

    CMD24

  • CMD25WRITE_MULTIPLE_BLOCK,写多块数据

    CMD25

当部分块访问关闭,即CSD寄存器的WRITE_BL_PARTIAL(只读)为0时,卡只能按512Bytes的块写:

Write Command Blocklen

而当WRITE_BL_PARTIAL为1时,此时1~512Bytes均可以使用。

同样地,对于不支持不对齐写操作的卡,在检测到错误后,卡会停止写入数据,回到Transfer State,并设置ADDRESS_ERROR错误位到状态寄存器。

References

[1] SD Card Association. SD Specifications Part 1 Physical Layer Specification Version 3.01[S]. 2010,2,18.
[2] SD Card Association. SD Specifications Part 1 Physical Layer Specification Version 9.00[S]. 2022,8,22.
[3] NXP Semiconductors. NVT4857UK SD 3.0-SDR104 compliant integrated auto-direction control[S]. 2023,7,19.