第1章 SDIO协议概述:历史、版本、速度模式

各位同学,咱们今天聊SDIO。其实它最早是SD卡协会为手机和嵌入式设备扩接口搞出来的——你想想看,一块SD卡既当存储又能接WiFi、蓝牙、GPS,物理层复用比USB便宜得多。我早年做平板电脑时,就是被这个“一根线干两件事”的理念拉进SDIO坑的。

1.1 从SD到SDIO:为什么多此一举?

SD规范最初只为存储。但2001年WiFi刚热,设备商发现:如果能把SD卡槽的引脚和协议扩展成通用IO,就能低成本接通信模组。于是SDIO 1.0诞生了,说白了就是在SD协议基础上加了CMD53(读写扩展寄存器)和特殊中断机制。

关键转折点:

  • 2001年 SDIO 1.0:定义1-bit模式,时钟最高25MHz,速度一般。
  • 2004年 SDIO 2.0:加入4-bit模式,时钟升到50MHz,带宽明显改善。
  • 2011年 SDIO 3.0:引入UHS-I(超高速一级),时钟208MHz,1.8V信号。
  • 2018年 SDIO 4.0(草案):开始推8-bit模式,目标带宽达200MB/s以上,但目前消费端落地少。

我记得2014年帮某厂家调一款SDIO WiFi模组时,读spec发现SDIO 2.0的4-bit理论最高100Mbps,但实际跑WiFi只能到70Mbps。后来换3.0 UHS-I,才勉强把802.11n的150Mbps跑满。嗯,这里要注意:协议版本决定了你能拉多高的时钟,但实际吞吐还看卡主控和天线。

1.2 速度模式:从1-bit到8-bit的进化

速度模式大体分三类——你要记住它们对应的时钟和位宽,因为后面讲WiFi时序全绕不开。

模式 位宽 最大时钟 理论带宽 信号电平
DS(默认速度) 1/4-bit 25 MHz 12.5 MB/s 3.3V
HS(高速) 4-bit 50 MHz 25 MB/s 3.3V
UHS-I SDR12/25/50 4-bit 208 MHz 104 MB/s 1.8V
UHS-I DDR50 4-bit(双沿) 50 MHz 50 MB/s 1.8V
8-bit模式 8-bit 208 MHz 208 MB/s(理论) 1.8V
我的项目避坑: 选WiFi模组时别只看“支持SDIO 3.0”,要确认它支持UHS-I还是只跑HS。曾经有一款模组标称3.0兼容,但实际只工作在50MHz,WiFi 802.11ac跑不满,白白多焊了3个上拉电阻。

为什么8-bit模式这么晚才出现?根本原因是SD卡插槽物理引脚限制——标准SD卡只有9根线(CMD、CLK、DAT0~3、VDD、VSS、VSS2)。要跑8-bit必须额外引4根DAT线,这通常需要专用卡座或定制PCB。WiFi模组为了省成本,这么多年一直用4-bit到顶。直到车载和工业领域需要更高带宽(比如WiFi 6的1.2Gbps),才开始推8-bit。

1.3 SDIO 8-bit模式的核心逻辑

8-bit模式并不是独立协议,它复用SDIO 3.0的UHS-I物理层,只是把数据线从4根扩展到8根。关键变化只有两个:

  1. 时钟208MHz双沿(SDR/DDR):数据在上升沿和下降沿都采样,等效频率翻倍。
  2. 增加DAT4~7的同步:主机发送CMD6切换位宽,从设备必须在8个时钟内反应。

我个人习惯把8-bit模式的时序画成下面这张图——你理解了这个,后面调驱动时就不会被硬件手册搞晕。

SDIO速度模式演进与8-bit定位 SDIO速度模式演进(1-bit → 8-bit) SDIO 1.0 1-bit, 25 MHz SDIO 2.0 4-bit, 50 MHz SDIO 3.0 UHS-I 4-bit DDR, 208 MHz 8-bit 模式(本课程核心) 8-bit SDR/DDR, 208 MHz 理论带宽 208 MB/s 依赖条件 • 专用8位卡座 • 1.8V IO电平 • 主机支持UHS-II 实际应用现状 目前WiFi 5/6模组大多使用4-bit UHS-I,8-bit模式主要出现在车载雷达与工业相机的SDIO接口 注意:SDIO 4.0草案中重新定义了8-bit,但商用落地还需要时间
工程师笔记: 我建议你先把4-bit UHS-I DDR50调稳,再切8-bit。因为多出来的4根线布局和过孔会引入信号完整性问题。曾经有个案子,8-bit模式一上EMC就超标,最后不得不降级到4-bit。

1.4 SDIO版本与WiFi驱动的映射关系

WiFi驱动里通常用 mmc->ios.timing 来控制模式切换。拿Linux内核举例:

/* drivers/mmc/core/sdio_ops.c */
static int sdio_set_bus_speed(struct mmc_host *host, unsigned int speed)
{
    struct mmc_ios *ios = &host->ios;
    
    switch (speed) {
    case MMC_TIMING_SD_HS:
        ios->clock = 50000000;   /* 50 MHz */
        ios->bus_width = MMC_BUS_WIDTH_4;
        break;
    case MMC_TIMING_UHS_SDR104:
        ios->clock = 208000000;  /* 208 MHz */
        ios->bus_width = MMC_BUS_WIDTH_4;
        break;
    case MMC_TIMING_UHS_DDR50:
        ios->clock = 50000000;
        ios->bus_width = MMC_BUS_WIDTH_4;
        ios->timing = MMC_TIMING_UHS_DDR50;
        break;
    /* 8-bit模式案例(非标准,需自定义) */
    case MMC_TIMING_SDIO_8BIT:
        ios->clock = 208000000;
        ios->bus_width = MMC_BUS_WIDTH_8;  /* 需要头文件定义 */
        break;
    }
}
警告: 不是所有SoC都支持8-bit SDIO!我在MT7621上吃过亏——datasheet写着支持8-bit,但实际只能跑50MHz。选型前务必找原厂要verification report。

总结一下:SDIO从1.0走到3.0,本质是时钟升高+位宽加倍。8-bit模式不是革命,而是UHS-I物理层在引脚数上的极限延伸。你只要把握住“时钟、位宽、电平”这三个变量,后面看任何SDIO WiFi芯片手册都不会懵。