1. SDIO 协议概述与 4-bit 模式介绍

1.1 从 SD 卡到 SDIO:一次协议演进

SDIO 协议脱胎于 SD 卡规范。说白了,它把 SD 卡的存储通路改造成了通用 I/O 总线。你可以插 Wi-Fi 模块、蓝牙模块、GPS 模块、摄像头模块,甚至是指纹识别模块。SDIO 不仅传数据,还能传中断、传时钟、传控制信号。我当初第一次接触 SDIO 是在一个平板项目里,芯片要外挂一个 Broadcom 的 Wi-Fi 芯片。当时我心想:「不就是 SD 卡协议吗,随便调一调就能跑。」结果启动时老是识别失败,折腾了一周才发现是初始化时序里的 clock 频率没降下来。嗯,这个坑后面会细讲。

1.2 物理层与信号线:到底哪些线在干活?

SDIO 总线上只有 9 根线。但在 4-bit 模式下,实际用到的有 6~7 根。我习惯把它们分成三类:

类别信号名功能简述
时钟CLK主设备给从设备的同步时钟,频率从 0~52 MHz(UHS 模式下更高)
命令CMD双向命令/响应线,所有主机发指令、从机回响应都走这一根线
数据DAT0~DAT34 根数据线,1-bit 模式只用 DAT0,4-bit 模式四线全用
电源与地VDD, VSS供电和地,通常 3.3V / 1.8V 两种电压域
检测CD(可选)卡检测,物理接触后才开始总线通信
我的一点经验: CD 引脚在很多 SoC 上可以不接。但你得用软件轮询的方式去做上电检测,否则启动时总线一直空闲,白白浪费几十毫秒。

1.3 命令线与数据线的交互时序

为什么 CMD 是双向的?因为 同一根线上分时传输主机命令和从机响应。主机先发 48-bit 的命令包,然后切换到接收模式,等从机回一个 48-bit 或 136-bit 的响应。数据线 DAT0~DAT3 在传输时是并行工作的,每一线上都有自己的 CRC16 校验。
我记得在调试一个蓝牙模块的时候,发现数据线 DAT1 上的 CRC 错误总是比别的线多。查到后来是 PCB 走线里 DAT1 绕了一个大弯,跟 CLK 跨了层。重新布局后错误直接归零。所以,等长走线对 4-bit 模式尤其重要。

1.4 4-bit 模式的优势:不只是快了一倍

很多人觉得 4-bit 模式就是把 1-bit 的吞吐量乘以 4。其实不然。我来算笔账:

  • 1-bit 模式:每个时钟周期传 1 bit,加上命令与响应的开销,实际有效吞吐大约在 2~3 MB/s(52 MHz 时)
  • 4-bit 模式:每个时钟周期传 4 bit,同样频率下有效吞吐能到 10~12 MB/s (实际提升 4~5 倍,因为协议开销被摊薄了)
  • 更大的优势在于 中断与数据并行:4-bit 模式允许在 DAT1 上独立传输中断信号,而数据线继续传数据。你在做启动优化时,可以利用这个特性提前响应中断,减少轮询等待。
适用场景:
✅ Wi-Fi / 蓝牙 combo 模块(典型如 AP6212、RTL8821)
✅ 高清摄像头流,30fps 以上需要持续 > 8 MB/s 的带宽
✅ 快速启动场景,比如车载后视摄像头需要在 2 秒内出图
❌ 低速外设(如慢速 UART、GPIO 模拟)用 1-bit 模式更省电

1.5 4-bit 模式启动流程概览

我不会在本章展开全部启动细节,但先给一张总图,让你心里有个谱。这张图是我自己做项目时手绘的,后来整理成了标准时序。

SDIO 4-bit 模式启动核心流程 上电与初始化时钟 CMD0 软复位 CMD8 / CMD5 电压协商 ACMD41 发送 OCR ACMD6 设为 4-bit 模式 ⚠️ 关键起步 初始化时钟必须 ≤ 400 kHz 否则卡可能不识别 我就是在这吃过亏 💡 4-bit 模式前提 需先完成正常识别 再用 ACMD6 切换 它不比 1-bit 快瞬间

1.6 几个容易忽略的细节

曾经踩过的坑:
1. 初始化时钟频率忘了降下来——我在一个项目里直接用 52 MHz 去发 CMD0,结果卡根本不理你,卡在 ACMD41 循环里出不来。后来在逻辑分析仪上看到卡根本没回响应。
2. 电压协商失败——CMD8 发出去后,如果卡不支持 1.8V 或 3.3V,要准备好切换到默认电压。有的 SoC 驱动里没有 fallback,会一直重试直到超时。
3. DAT3 线电阻不对——4-bit 模式对 DAT3 的上拉电阻有要求。生产时贴错了电阻,导致卡识别后一开 4-bit 就掉线。

1.7 小结

SDIO 4-bit 模式的核心思想很直白:用更多的并行线换取吞吐。但它的代价是布线约束更严、初始化流程多了几个步骤、协议错误更敏感。我个人的建议是:

  • 设计前期就把 CLK、CMD、DAT0~DAT3 的等长走线规划好(误差 < 100 mil 通常够用)
  • 驱动里先老老实实走一遍 1-bit 初始化,确认卡在正常状态后再切 4-bit
  • 多用逻辑分析仪抓启动阶段的 CMD/响应时序,别凭感觉猜