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 命令的情况相同。 |
参考
- SD Association 的 v3.01 版本协议
- sdhci_set_transfer_mode函数解析
- SD卡相关寄存器简介