针对STM32F407在SPI模式下初始化32G TF卡时,第一次上电成功但复位后初始化失败的问题,原因和解决方案如下:
TF卡未完全复位:
初始化时序缺失:
SPI外设状态残留:
修改初始化代码逻辑,确保每次初始化前执行完整复位流程:
void SD_SPI_Sync(void) {
SD_CS_HIGH(); // 释放片选
for (uint8_t i = 0; i < 10; i++) { // 发送80个时钟(10字节 * 8位)
SD_SPI_ReadWriteByte(0xFF);
}
}在SD_Initialize()开头添加:
// 复位后重新初始化SPI
SPI_Init(); // 重新配置SPI时钟和模式
SD_SPI_Sync(); // 同步时钟uint8_t SD_GoIdleState(void) {
uint8_t r1;
uint16_t retry = 0;
do {
SD_CS_LOW(); // 片选拉低
r1 = SD_SendCmd(CMD0, 0, 0x95); // 发送CMD0
SD_WaitResponse(); // 等待响应完成
SD_CS_HIGH(); // 释放片选
SD_SPI_ReadWriteByte(0xFF); // 额外8个时钟
if (r1 == 0x01) return 0; // 成功返回0
retry++;
} while (retry < 100); // 重试100次
return 1; // 超时失败
}uint8_t SD_Initialize(void) {
// 关键修复:每次初始化前同步总线和SPI外设
SPI_Init(); // 确保SPI配置正确
SD_SPI_Sync(); // 发送74+时钟同步卡
if (SD_GoIdleState() != 0) {
return SD_ERR; // CMD0复位失败
}
// 后续流程(CMD8, ACMD41等)
if (SD_SendCmd(CMD8, 0x1AA, 0x87) == 1) { // SD V2.0
// ... 原有代码
}
// ... 其他初始化步骤
}SPI同步时钟:
SD_SPI_Sync()发送至少74个时钟脉冲(10字节0xFF),确保卡退出遗留状态。SPI外设初始化:
SPI_Init(),配置SPI时钟分频(初始化阶段≤400kHz)、CPOL/CPHA模式。片选信号(CS)时序:
硬件检查:
MCU上电/复位 → SPI外设初始化(低速模式)
→ 释放片选(CS=1) + 发送80个时钟
→ 拉低片选(CS=0) + 发送CMD0
→ 等待卡返回0x01(空闲状态)
→ 释放片选(CS=1) + 额外8时钟
→ 继续后续初始化(CMD8/ACMD41等)通过上述修改,TF卡会在每次MCU复位后被强制同步到空闲状态,解决软件复位初始化失败的问题。无需用户手动拔插卡。
举报
更多回帖