1. SDIO协议基础:从入门到实战
大家好,我是老张。做嵌入式驱动开发十几年了,SDIO协议算是我打交道最多的接口之一。今天咱们就来聊聊SDIO协议的基础知识。说实话,很多新手一上来就啃协议手册,结果越看越懵。我的建议是——先理解它要解决什么问题,再看细节。
1.1 SDIO协议概述
SDIO,全称Secure Digital Input Output,说白了就是在SD卡接口上跑I/O设备通信。你想想看,SD卡接口本来是用来存数据的,但工程师们发现这个接口速度够快、引脚又少,干脆拿来接Wi-Fi模块、蓝牙模块、GPS模块、摄像头……嗯,这就是SDIO的由来。
我个人习惯把SDIO理解成「带存储功能的SPI升级版」。它保留了SD卡的存储命令集,同时扩展了I/O相关的命令。一个SDIO设备可以同时拥有多个功能(Function),每个功能就像一个小外设。比如一个Wi-Fi模块,Function 0是控制寄存器,Function 1是数据收发通道。
1.2 SDIO总线拓扑
SDIO总线长什么样?我画个图你就明白了。
从图上你能看到,SDIO总线其实很简单。一个主机(Host)通过三条线——CLK、CMD、DAT——连接多个设备。CLK提供时钟,CMD传命令和响应,DAT传数据。
这里有个坑我得提醒你:SDIO总线上的设备数量是有限制的。我记得有一次项目里想挂4个Wi-Fi模块,结果发现SDIO协议最多支持3个设备(加上主机自己)。嗯,后来只能改用多个SDIO控制器。
1.3 SDIO命令与响应
SDIO通信的核心就是「命令-响应」对。主机发一个命令,设备回一个响应。就这么简单。但命令的类型和格式,嗯,有点讲究。
命令格式长这样:
命令格式(48位):
[0:0] 起始位(固定为0)
[1:1] 传输位(1=主机到设备)
[2:7] 命令索引(6位,共64种命令)
[8:39] 参数(32位,具体含义看命令)
[40:46] CRC7校验(7位)
[47:47] 结束位(固定为1)
响应格式也类似,只是传输位变成0(设备到主机)。
我个人把SDIO命令分成几类:
- 广播命令(如CMD0、CMD2):所有设备都能收到,不需要指定地址
- 寻址命令(如CMD7、CMD52):指定某个设备响应
- 数据传输命令(如CMD53):读写数据块
- 应用相关命令(ACMD):以CMD55为前缀的特殊命令
说到CMD52和CMD53,这两个是SDIO特有的命令,SD卡协议里没有。CMD52用来读写8位寄存器,CMD53用来读写数据块。我在调试Wi-Fi模块时,90%的时间都在用CMD53读写数据。
1.4 SDIO数据传输模式
SDIO支持三种数据传输模式,我按使用频率排个序:
| 模式 | 特点 | 适用场景 | 最大速率 |
|---|---|---|---|
| SPI模式 | 用SPI总线传输,引脚少 | 低速设备、兼容性要求高 | 25 Mbps |
| 1位SD模式 | 只用DAT0传数据 | 调试阶段、引脚受限 | 25 Mbps |
| 4位SD模式 | DAT0-DAT3并行传输 | 高速设备(Wi-Fi、摄像头) | 100 Mbps |
你可能会问:为什么不用8位模式?嗯,SDIO协议最多就4根数据线,这是历史原因。不过100 Mbps对于大多数嵌入式设备来说已经够用了。
数据传输的具体流程是这样的:
- 主机发CMD53命令,带上起始地址和传输长度
- 设备回复响应,表示准备好了
- 主机和设备开始数据块传输
- 每个数据块后面跟CRC校验
- 传输完成后,主机发CMD12停止传输
这里有个细节:数据块大小可以配置。默认是512字节,但有些设备支持1K、2K甚至4K。我建议你根据实际应用来选——Wi-Fi模块用512字节比较稳,摄像头用4K能提高吞吐量。
说到数据传输,不得不提DMA。我个人习惯在SDIO驱动里用DMA传输大数据块。CPU只需要设置好DMA描述符,剩下的交给硬件。这样CPU可以去做别的事,比如处理网络协议栈。
嗯,SDIO协议基础就聊这么多。记住一句话:SDIO就是带I/O能力的SD卡接口。理解了这句话,后面的驱动开发就好办了。