1.因为1G 2G的卡刚好是V2.0的版本,而手上的128M刚好是V1.x的版本。在stm32f1xx_hal_sd.c的SD_PowerON方法中,会先发送CMD8指令判断当前SD卡的版本,如果有响应就是V2.0,没有响应就是V1.X版本或者MMC卡。 hal库中SDMMC_CmdOperCond这个方法会先发送CMD8指令然后调用SDMMC_GetCmdResp7方法接收响应的数据,而128M的卡是V1.x的低版本,没有响应会报超时SDMMC_ERROR_CMD_RSP_TIMEOUT错误。(SD_PowerON->SDMMC_CmdOperCond->SDMMC_GetCmdResp7)
2.但在SD_PowerON中,竟然判断SDMMC_ERROR_TIMEOUT而不是SDMMC_ERROR_CMD_RSP_TIMEOUT
3.因此需要将stm32h7xx_hal_sd.c的3047行改为:
if (errorstate == SDMMC_ERROR_TIMEOUT||errorstate==SDMMC_ERROR_CMD_RSP_TIMEOUT) /* No response to CMD8 */
4.重新编译调试即可。