SDIO 接口的上电时序要求严格,直接关系到 SD 卡或 SD NAND 能否被正确识别。如果时序不满足,就会出现“重启后读取失败”“初始化超时”等问题。下面从硬件电源、时钟、复位命令流程、关键时间参数以及 SD NAND 的特殊性等方面详细说明。
标准 SD 卡:VDD = 2.7V ~ 3.6V(典型 3.3V)
部分 SD NAND 支持 1.8V 低电压,但大多数默认 3.3V
根据 SD 物理层规范,VDD 从 0V 上升到工作电压的时间 tr 必须满足:
tr ≤ 35ms(有些规范建议 ≤ 10ms)
如果电源上升过慢,卡内部上电复位电路可能无法正确触发,导致卡一直处于不确定状态。
VDD 达到稳定工作电压后,需要保持至少 1ms(建议 5~10ms)才能发送任何命令。
这段时间是给卡内部上电复位、初始化内部逻辑的。
如果系统需要快速断电再上电(比如看门狗复位),必须确保 VDD 完全降到 0V 以下(或至少低于 0.5V)并保持 ≥1ms,再重新上电。否则卡可能无法完全复位。
SD NAND 由于内部有控制器,对掉电间隔更敏感,建议至少 10ms。
SD 规范建议:在 VDD 稳定之前,CLK 应保持低电平或高阻态,不应有活动时钟。
上电后、发送 CMD0 之前,可以给 CLK 提供时钟,但频率必须 ≤400kHz。
实际上,主机通常先使能 SDIO 外设,然后发送 74 个以上时钟周期(用于卡内部同步),这些时钟也必须 ≤400kHz。
初始化阶段(包括 CMD0、CMD8、ACMD41)时钟频率 必须 ≤ 400kHz。
部分 SD NAND 要求更保守,建议用 100kHz ~ 200kHz 以增加稳定性。
初始化成功后,才能切换到高速时钟(如 25MHz、50MHz)。
从低速切到高速时,应保证在发送下一条命令前至少有一个时钟稳定期(通常 1~2ms)。
切频时不能突然改变,建议先停止时钟(或置低),修改分频寄存器,再重新使能。
SD 卡的初始化过程是一系列命令的时序,必须按顺序发送,且每一步之间需要适当的延时或等待响应。
从 VDD 稳定到发送 CMD0,至少延时 1ms(建议 5~10ms)。
对于 SD NAND,由于内部 NAND 控制器需要加载固件,延时可能需要 10~50ms,请参考具体芯片手册。
发送 CMD0 后,卡进入 Idle 状态。
CMD0 响应为 R1,无数据。
发送 CMD0 前,建议先发送 74 个以上时钟周期(在时钟线上产生 74 个脉冲),这是为了卡内部同步。这 74 个时钟可以在 CS 为高(SPI 模式)或 CMD 线为高时发送。
用于检测卡支持的电压范围和 SD 版本(SD 2.0 及以上)。
发送 CMD8 的参数通常为 0x1AA(表示 2.7~3.6V,check pattern 0xAA)。
如果卡响应,说明是 SD V2.0 或更高。
如果卡不响应(超时),可能是旧版卡或 SD NAND 不支持 CMD8,此时应跳过 CMD8,按 V1.0 处理。
必须先发送 CMD55(APP_CMD)前缀,再发送 ACMD41。
ACMD41 的响应中包含 busy 位(bit 31),该位为 1 表示卡仍在初始化,主机需要 循环发送 ACMD41 直到 busy 位为 0。
循环期间时钟可以保持低速,每次循环之间可以加 1ms 延时。
超时时间一般设置为 1 秒以上,SD NAND 可能需要 2~5 秒。
CMD2(ALL_SEND_CID)、CMD3(SEND_RELATIVE_ADDR)等,用于获取卡信息。
这些命令在高速时钟下进行,但也可以在低速下完成,之后切换高速。

SD NAND 是集成了 NAND Flash 和控制器的芯片,对外表现为 SD 接口,但其内部上电初始化过程比普通 SD 卡复杂,需要额外注意:
上电初始化时间更长
SD NAND 内部控制器需要从 NAND 加载固件、建立映射表等,因此从 VDD 稳定到可以响应 CMD0 的时间可能长达 10~50ms。必须增加足够的延时。
对电源纹波更敏感
SD NAND 内部有电荷泵,对电源噪声敏感,建议 VDD 引脚附近加 0.1μF + 10μF 去耦电容,电源走线尽量短粗。
初始化时钟建议更低
虽然 SD 规范允许 400kHz,但 SD NAND 在 400kHz 下有时会初始化失败,建议使用 100kHz ~ 200kHz 的初始化时钟,待成功后再提升速度。
ACMD41 循环时间要更长
SD NAND 的 busy 时间可能比普通卡长,超时建议设为 3~5 秒。
避免在初始化过程中断电
SD NAND 在初始化时如果突然断电,可能导致内部映射表损坏,下次上电无法识别。如果产品可能随时断电,建议增加掉电保护电路(如超级电容),确保有足够时间完成初始化或安全关闭。
// 上电后,先延时 50ms(针对 SD NAND)
HAL_Delay(50);
// 初始化 SDIO 外设,设置分频得到 200kHz 左右
// CLKDIV = (48MHz / (2 * 200kHz)) - 1 ≈ 119
hsd.Init.ClockDiv = 119;
HAL_SD_Init(&hsd); // 内部会发送 CMD0、CMD8、ACMD41 等
// 初始化成功后切换高速时钟(如 12MHz)
// CLKDIV = 1 -> 12MHz
__HAL_SD_DISABLE(&hsd);
MODIFY_REG(SDIO->CLKCR, SDIO_CLKCR_CLKDIV, 1);
__HAL_SD_ENABLE(&hsd);
VDD 走线宽度 ≥ 0.5mm,去耦电容紧靠芯片。
CMD、DAT0~DAT3 上拉 10kΩ 到 3.3V。
CLK 线上串联 22~33Ω 电阻减少反射。
如果使用长排线,考虑增加驱动能力或降低时钟。
用示波器观察 VDD 上电波形,确认上升时间 ≤ 10ms。
观察 CLK 在初始化期间是否 ≤400kHz,且无毛刺。
观察 CMD 线是否有正常响应(拉低表示响应)。
如果初始化失败,尝试逐步增加延时或降低时钟,找到临界值。
SDIO 上电时序的核心就是:电源稳定 → 延时等待 → 低速时钟初始化 → 命令序列 → 高速切换。对于 SD NAND,延长等待时间和降低初始化时钟是解决“重启读取失败”的关键。务必参考 SD NAND 芯片的数据手册,因为不同厂家可能有更严格的要求。
上一篇:stm32f407 sdio配置
电话:176-6539-0767
Q Q:135-0379-986
邮箱:xcz@xczmemory.cn
地址:深圳市联创商务中心13层1308室