|
楼主 |
发表于 2023-6-30 18:35:19
|
显示全部楼层
請問HAL_SD_InitCard涵式中SDMMC_CmdBlockLength 函式一直過不了 error= SDMMC_ERROR_CMD_RSP_TIMEOUT
我上網查發現
git看到stm32f4xx_hal_sd.c的HAL_SD_InitCard函式沒有用到SDMMC_CmdBlockLength函式
反倒是HAL_SD_ReadBlocks(), HAL_SD_ReadBlocks_IT(), HAL_SD_WriteBlocks(), HAL_SD_WriteBlocks_IT() 才用到 SDMMC_CmdBlockLength
我從stm32cubet產生的stm32f4xx_hal_sd.c 中的
HAL_SD_ReadBlocks(), HAL_SD_ReadBlocks_IT(), HAL_SD_WriteBlocks(), HAL_SD_WriteBlocks_IT() 反而沒用到
想請問是否版本上差異, 還是另有原因??
還想請問 有時卡片初始化有時後會失敗 有時候成功, 需要注意查看哪些區域??
感謝
附上
HAL_StatusTypeDef HAL_SD_InitCard(SD_HandleTypeDef *hsd)
{
uint32_t errorstate;
HAL_StatusTypeDef status;
SD_InitTypeDef Init;
/* Default SDIO peripheral configuration for SD card initialization */
Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
Init.BusWide = SDIO_BUS_WIDE_1B;
Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
Init.ClockDiv = SDIO_INIT_CLK_DIV;
/* Initialize SDIO peripheral interface with default configuration */
status = SDIO_Init(hsd->Instance, Init);
if(status != HAL_OK)
{
return HAL_ERROR;
}
/* Disable SDIO Clock */
__HAL_SD_DISABLE(hsd);
/* Set Power State to ON */
(void)SDIO_PowerState_ON(hsd->Instance);
/* Enable SDIO Clock */
__HAL_SD_ENABLE(hsd);
/* Required power up waiting time before starting the SD initialization sequence */
HAL_Delay(2);
/* Identify card operating voltage */
errorstate = SD_PowerON(hsd);
if(errorstate != HAL_SD_ERROR_NONE)
{
hsd->State = HAL_SD_STATE_READY;
hsd->ErrorCode |= errorstate;
return HAL_ERROR;
}
/* Card initialization */
errorstate = SD_InitCard(hsd);
if(errorstate != HAL_SD_ERROR_NONE)
{
db_printf(DB_ALWAYS, "SD_InitCard fail\n");
hsd->State = HAL_SD_STATE_READY;
hsd->ErrorCode |= errorstate;
return HAL_ERROR;
}
/* Set Block Size for Card */
errorstate = SDMMC_CmdBlockLength(hsd->Instance, BLOCKSIZE);
if(errorstate != HAL_SD_ERROR_NONE)
{
/* Clear all the static flags */
__HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
hsd->ErrorCode |= errorstate;
hsd->State = HAL_SD_STATE_READY;
db_printf(DB_ALWAYS, "SDMMC_CmdBlockLength fail:%d\n",errorstate);
return HAL_ERROR;
}
return HAL_OK;
}
|
|