SD UHS-I 4bit 初始化命令及参数实例

本文内容产生于集创赛期间,笔者参与了 ISP 图像视频处理赛题,需要对 Micro SD Card 上的内容进行高速读取。

然而,在网上并未找到“高速的、支持 SDIO 4线模式,SDR104 时序”的 IP 核,故最终下定决心,自己使用 Verilog 手搓一个简单版的。

恰好手上有个高速读卡器,以及卡片若干,故使用逻辑分析仪进行抓取、参考。下文整理了卡初始化过程以及数据传输过程中的一些命令,时序等实例,用作记录,顺便分享。

卡初始化过程命令

根据 SD 协会标准(见参考部分),卡片初始化基本流程如下:

初始化过程的关键步骤包括重置卡、检查电压、电压切换、读取卡的 CID 和 CSD 信息(CMD9,未列出)、选择卡以及设置高速模式。根据卡的规格和协议,后续的配置可以包括切换到更高速度模式,如SDR104(最高速度250MHz),并为数据传输做准备。

数据抓取

使用 DSLogic 逻辑分析仪抓取,采样频率 500MHz。

接线示意图如下,仅做示意:

特别说明:后来笔者发现,实际上使用这个转接卡套,不能激发高速模式(高速模式的 IO 电平需 1.8V),正确的做法是把小卡插入这个读卡器背面的 Micro SD 专用卡槽(没拍照,所以还用这个图)。

命令解析方面,上位机软件内部带有解码器,可以自动解码并标识出命令及参数,笔者也人工校对了一部分,基本上自动解析是正确的。

解码示意图如下:

这里给个采样提示:后期在数据传输过程中,sdclk 为 250MHz,可能会存在命令与参数识别不准确的情况(采样率不够,部分比特位不准确),但可以人工根据协议标准进行还原。

金士顿 Canvas Go Plus 64GB

表格内顺序即为初始化过程的时序顺序。

命令 参数 CRC 说明
CMD0 0x0000_0000 0x4a 重置卡
CMD8 0x0000_01aa 0x43 电源电压检查
CMD55 0x0000_0000 0x32 指示下一条为 APPLICAATION 命令
ACMD41 0x51fc_0000 0x1a [30] HCS=1, 主机支持高容量卡;
[28] XPC=1, 在 SDXC 默认速度等级使用 150mA;
[24] S18R=1, 请求卡切换到 1.8V
注意,需要一直循环进行 CMD55+ACMD41 的请求,直到 R3 参数的 bit 31 拉高。
CMD11 0x0000_0000 0x3b 卡电压切换
注1:得到 R1 响应后,sdclk 至少停止 5ms,在此期间 Host 完成电压切换。
注2:如果一开始就是 1.8V 下操作,Response 的 S18A 将为 0,表示电平不变。
CMD2 0x0000_0000 0x26 询问卡的 CID 信息
CMD3 0x0001_0000 0x3f 请求新的 RCA 地址; 此命令执行后,卡进入数据传输状态;
注:不知为啥参数用了个 1。本来全 0 好像就行了。
CMD9 0x{rca}_0000 请求指定的卡返回它的 specific data (CSD)
CMD7 0x{rca}_0000 卡选择命令,选中指定 RCA 的卡
注:执行此命令前,时钟由 200K 拉高到 25Mhz。
CMD55 0x{rca}_0000 指示下一条为 APPLICAATION 命令
ACMD6 0x0000_0002 0x65 设置总线宽度为 4bit
CMD55 0x{rca}_0000 指示下一条为 APPLICAATION 命令
ACMD51 0x0000_0000 0x63 读取卡配置寄存器 SCR
CMD17 0x0000_0000 0x2a Read Single Block。读取地址为 0x0。(应该是测试)
CMD6 0x00ff_ffff 0x71 Check 模式。检查卡支持的功能。
注:CMD6 命令,卡返回的信息在 DAT 数据线上。
CMD6 0x00ff_3fef 0x56 Check 模式。检查是否支持 800mA 以及一个 "Vendor Specific" 功能。(e)
注:从分析来看,两条 CMD6 命令之间的执行间隔比较大
CMD6 0x80ff_3fef 0x4d Switch 模式。切换 800mA 以及 "Vendor Specific"。
注1:此条完成后,时钟切换到 250MHz。
注2:按手册,切换 SDR104 应该是使用 0x80ff_3ff3
CMD19 0x0000_0000 时序调整测试命令(方便主机调整采样时刻)

闪迪 Ultra 红灰卡 64GB

经逻辑分析仪实际测试,与上表完全一致。

实际上,主控在读卡的过程中,会使用指令来获取厂商信息,以便确定具体使用的命令和参数。可能是此卡的参数恰好和上一张通用,因此命令一致。

数据传输过程命令

下面是收集到的一些常用命令。

命令 参数 CRC 说明
CMD23 [31:0] block count 块计数器设置,用于替代 CMD12 进行多块读写控制。其后面应当紧随 CMD18。
查找了一些资料,嗯,看起来是达到指定的块后自动停止。
CMD12 0x0000_0000 用于停止多块数据传输。在命令停止位后的两个 clk 周期后数据停止传输
CMD17 [31:0] data address 单块读取。
对于标准容量 SD 存储卡,该命令读取由 CMD16 命令选择的大小的块。
对于 SDHC 和 SDXC 卡,块长度固定为 512 字节。
CMD18 [31:0] data address Read Multiple Block。连续将数据块从卡传输到主机,直到被 CMD12 命令中断。
块长度的指定与 CMD17 命令的情况相同。

参考

  1. SD Association 的 v3.01 版本协议
  2. sdhci_set_transfer_mode函数解析
  3. SD卡相关寄存器简介