2、SDIO物理层:信号定义、电压等级、时序参数、PCB设计要求
好了,咱们开始聊物理层。说白了,这是SDIO所有通信的物理基础。
你要是信号没摆弄明白,上层软件写得再好,跑起来也是一堆CRC错误。
我个人习惯,看一个板子的SDIO调试顺不顺利,先拿示波器看波形。
波形干净,后面多半没问题;波形乱七八糟,那基本是硬件硬伤。
2.1 信号定义 —— 别搞混这几根线
SDIO接口,标准配置是6根线,但很多人刚接手时容易忽略一个关键点:
它其实有两种模式,老一点的4线模式和现在主流的8线模式。
我先说4线模式,这是最常用的,也是兼容性最好的:
- CLK —— 时钟。主机提供,所有数据操作都跟着它走。
- CMD —— 命令线。双向的,主机发命令,设备回响应。
- DAT[3:0] —— 数据线。4根双向数据总线。
8线模式呢?多了DAT[7:4]这4根线。带宽直接翻倍。
但是,这里有个坑 —— 不是所有设备都支持8线模式。
我在项目里见过有人把DAT[7:4]悬空,结果插上8线卡就死机。
我的建议是:即使你不用8线,也把这4根线拉到GND或者上拉到VDD,别悬空。
把SDIO的CLK、CMD和DAT在原理图上用不同颜色标出来。
调试时,一眼就能看过来,特别方便。
2.2 信号的方向性 —— 别小看这个细节
很多刚做硬件设计的同事会问:CMD和DAT上数据到底是主机发还是设备发?
其实,它俩都是双向的,但控制方式不一样:
- CMD线:主机主动发命令,设备在特定时钟周期内回响应。
- DAT线:主机控制数据方向。读操作时设备发数据,写操作时主机发数据。
你想想看,如果DAT方向搞反了,结果是啥?
总线冲突。两个输出同时怼线,波形直接乱掉。
我帮别人查过一个问题,SDIO读卡总超时,最后发现是DAT线的方向控制逻辑做反了。
2.3 电压等级 —— 3.3V还是1.8V?这是个问题
SDIO的电压等级,是我觉得最需要讲清楚的部分。
早期标准是3.3V,现在UHS-I(超高速一代)引入了1.8V。
但问题在于,设备启动时,默认是3.3V通信,然后通过一个专门的电压切换流程降为1.8V。
这个切换流程,说起来不难,但容易出错:
- 初始化阶段,主机以3.3V与设备通信。
- 主机发CMD11,告诉设备:“我要切电压了”。
- 设备在CMD线上回响应,同时把自己的电压调到1.8V。
- 主机也要在检测到响应后,把IO电压切换到1.8V。
注意,这个过程必须同步。主机切早了或切晚了,设备都可能挂掉。
我曾经遇到过一块板子,每次电压切换时SDIO就卡死。
最后查出来,是主板上的电源切换芯片响应太慢,主机切了但设备那边还是3.3V。
如果设备只支持3.3V,不要试图用1.8V直接驱动它。
从3.3V降到1.8V,必须经过标准的电压切换流程。
强行拉低电压,可能烧坏设备内部的IO缓冲器。
2.4 时序参数 —— 速度由时钟决定,但质量由时序保证
SDIO时序参数,说白了就是信号在时钟边的建立时间和保持时间。
我列个表,把几个关键参数掰扯清楚:
| 参数 | 含义 | 典型值(正常速度) | 典型值(高速模式) |
|---|---|---|---|
| fOD | 数据输出延迟(从CLK边沿到数据有效) | 0~14 ns | 0~7 ns |
| tISU | 输入建立时间(数据在CLK边沿前必须稳定) | 5 ns | 2 ns |
| tIH | 输入保持时间(数据在CLK边沿后必须保持) | 2 ns | 1 ns |
| tCLK_cycle | 时钟周期(最小) | 40 ns (25 MHz) | 12.5 ns (80 MHz) |
为什么要注意这些参数?
因为PCB走线的长度差异,会导致信号到达时间不一致。
你想想看,如果CMD线比DAT线长5厘米,信号就会晚到约0.25 ns。
高速模式下,这0.25 ns可能就导致建立时间不够。
我的经验是:
在PCB布局阶段,就把CLK、CMD和DAT的走线长度控制在正负3 mm以内。
这样时序余量就会大很多。
2.5 PCB设计要求 —— 画板子是个细活
好,前面讲了信号、电压、时序,现在落地到PCB设计。
SDIO的PCB设计,核心就三件事:
- 阻抗控制:单线50Ω,差分对100Ω。
- 走线等长:组内偏差正负3 mm,组间不要差超过10 mm。
- 参考平面完整:不能跨分割,信号底下必须是连续的GND。
另外,CLK信号一定要做包地处理。
我之前在调试一块高速SDIO板子时,发现DAT2线上的眼图惨不忍睹。
最后定位到,是CLK线没有包地,串扰到了旁边的DAT线。
加了一根地线隔离后,问题立刻消失。
- CLK、CMD、DAT走线是否在同一个层?别跨层走。
- 所有信号是否都有完整的GND参考平面?
- 8线模式下,DAT[7:4]与DAT[3:0]的走线长度是否一致?
- 是否有串联匹配电阻?一般靠近主机端放22Ω或33Ω。
- 电源去耦电容是否靠近芯片引脚?不要放太远。
还有个细节:上拉电阻。
命令线和数据线在空闲时,需要被拉到高电平。
一般用10kΩ到47kΩ的上拉电阻到VDD。
我曾经见过有人用1kΩ,结果驱动电流太大,信号振铃严重。
这张图把物理层的知识体系串了起来。
你可以看到,信号定义、电压等级、时序参数、PCB设计这四个维度,缺一不可。
我自己做项目时,会把这四个维度做成一个检查表,每完成一个节点就打勾。
这样能最大程度避免低级错误。