1. SDIO协议基础:从物理层到传输模式

各位同学好,我是你们的嵌入式系统讲师。今天咱们来聊聊SDIO协议的基础知识。说实话,我最早接触SDIO是在做一款物联网网关的时候,当时需要外接WiFi模块,结果发现SPI速度跟不上,I2C又太复杂,最后选了SDIO接口——嗯,这一用就是好多年。

1.1 SDIO协议概述

SDIO,全称Secure Digital Input Output,说白了就是在SD卡标准上扩展出来的通用I/O接口。它跟SD卡协议同根同源,但功能更强——不仅能读写存储设备,还能接WiFi、蓝牙、GPS、摄像头这些外设。

我个人习惯把SDIO理解成「带存储功能的SPI」。为什么这么说?因为它既有SPI那种主从架构的简洁,又多了SD卡协议里那些丰富的命令集和传输模式。我在项目中遇到过不少工程师,一上来就把它当SPI用,结果发现时序对不上——嗯,这里要特别注意。

核心要点:SDIO协议是SD卡协议的扩展,兼容SD存储模式,同时增加了I/O功能。一个SDIO设备可以同时包含存储和I/O功能,也可以只做纯I/O设备。

1.2 SDIO总线拓扑结构

先看看物理连接。SDIO总线其实很简单,就几条线:

信号线 方向 说明
CLK Host → Device 时钟信号,最高可达208MHz(UHS-II)
CMD 双向 命令/响应线,双向传输
DAT0-DAT3 双向 4位数据总线,可配置为1位模式
VDD/VSS 电源和地

你想想看,这跟SD卡一模一样对吧?没错,SDIO设备在物理层完全兼容SD卡。但有个关键区别:SDIO支持多个功能(Function),每个功能可以独立工作。比如一个WiFi+蓝牙二合一模块,WiFi是一个功能,蓝牙是另一个功能,它们共用同一套总线。

实战经验:我调试过一个SDIO WiFi模块,发现DAT3线在初始化阶段有特殊用途——它被用作卡检测信号。如果你在硬件设计时把DAT3接地了,那卡永远检测不到。这个坑我踩过,后来在原理图评审时都会特意检查这条线。

1.3 SDIO命令与响应机制

SDIO的通信靠的是命令-响应机制。主机发命令,设备回响应。就这么简单?嗯,细节都在协议里。

命令格式是固定的48位:

Bit 47     : 起始位(0)
Bit 46     : 传输方向(1=主机到设备)
Bit [45:40]: 命令索引(0-63)
Bit [39:8] : 命令参数(32位)
Bit [7:1]  : CRC7校验
Bit 0      : 结束位(1)

响应格式类似,但长度可能不同。有48位响应、136位响应,还有无响应的情况。我记得刚开始做驱动时,总搞不清什么时候该等响应,什么时候不该等。后来总结了一个规律:

  • 广播命令(如CMD0复位):不需要响应
  • 寻址命令(如CMD3获取RCA):需要48位短响应
  • 数据传输命令(如CMD18读多块):需要136位长响应

避坑指南:我曾经在调试时发现设备一直不响应,查了三天才发现是CRC7计算错了。SDIO的CRC7算法跟SD卡完全一样,但很多芯片的硬件CRC模块只支持CRC16。如果你用软件模拟,记得用多项式0x89(x^7 + x^3 + 1)。

1.4 SDIO数据传输模式

数据传输模式是SDIO的核心。说白了,就是怎么把数据从主机搬到设备,或者反过来。SDIO支持三种模式:

1.4.1 单块传输(Single Block)

一次传一个块,块大小可配(默认512字节)。适合小数据量、高可靠性的场景。我一般用它来读写设备的配置寄存器。

1.4.2 多块传输(Multiple Block)

一次传多个块,块大小固定。适合大数据量传输,比如WiFi数据包。这里有个技巧:多块传输可以设置「停止条件」,比如传完指定块数自动停,或者收到停止命令才停。

1.4.3 无限块传输(Infinite Block)

这个模式比较特殊,它不限制块数,一直传直到收到停止命令。适合流式数据,比如音频流。但要注意,这种模式下CRC校验是逐块进行的,如果某一块出错,整个传输都会中断。

性能调优建议:我做过对比测试,在4位模式下,多块传输的吞吐量比单块高30%以上。但有个前提——你的设备DMA要能跟上。如果CPU频繁中断处理,那多块传输的优势就体现不出来了。

1.5 实际调试中的注意事项

最后分享几个我在项目中积累的经验:

  1. 时钟频率别贪高:很多SDIO设备标称支持208MHz,但实际布线不好可能只能跑50MHz。我建议先跑25MHz验证功能,再逐步提频。
  2. 命令超时设置:SDIO设备响应时间可能很长(比如休眠唤醒时),超时时间建议设到1秒以上。我曾经设了100ms,结果设备一休眠就超时。
  3. 数据线方向控制:4位模式下,数据线是双向的。主机和设备都需要三态控制。如果方向切换不及时,总线冲突会导致CRC错误。

小技巧:调试SDIO时,逻辑分析仪是你的好朋友。我习惯先抓CMD线的波形,确认命令和响应都正常,再抓数据线。如果CMD线都乱糟糟的,那数据线肯定没戏。

好了,这一章的内容就到这里。SDIO协议基础是后面所有章节的基石,建议大家动手写个简单的初始化代码,把CMD0、CMD3、CMD7这些基本命令跑通。下一章我们会深入SDIO的寄存器配置和中断处理,到时候见。