2022-07-11 09:37 AM
So I'm using a SDIO connection to write some files to the SD card (MCU STM32F446Vet6).
Using the PC8-PC12 lines. Using the FATFS and SDIO from CubeMX. In main.c file have this sniped of code
/* USER CODE BEGIN 2 */
if(f_mount(&SDFatFS, (TCHAR const*)SDPath, 0) != FR_OK)
{
Error_Handler();
}
else
{
res=f_mkfs((TCHAR const*)SDPath, FM_ANY, 0, rtext, sizeof(rtext));
if(res != FR_OK)
{
Error_Handler();
}
else
{
//Open file for writing (Create)
if(f_open(&SDFile, "STM32.TXT", FA_CREATE_ALWAYS | FA_WRITE) != FR_OK)
{
Error_Handler();
}
else
{
//Write to the text file
res = f_write(&SDFile, wtext, strlen((char *)wtext), (void *)&byteswritten);
if((byteswritten == 0) || (res != FR_OK))
{
Error_Handler();
}
else
{
f_close(&SDFile);
}
}
}
}
f_mount(&SDFatFS, (TCHAR const*)NULL, 0);
/*
at line 9 (res=f_mkfs((TCHAR const*)SDPath, FM_ANY, 0, rtext, sizeof(rtext));) getting the Error FR_NOT_READY. After following the step by step debugging ended to the file
stm32f4xx_II_sdmmc.c where I'm getting in this code
uint32_t SDMMC_GetCmdResp7(SDIO_TypeDef *SDIOx)
{
uint32_t sta_reg;
/* 8 is the number of required instructions cycles for the below loop statement.
The SDIO_CMDTIMEOUT is expressed in ms */
uint32_t count = SDIO_CMDTIMEOUT * (SystemCoreClock / 8U /1000U);
do
{
if (count-- == 0U)
{
return SDMMC_ERROR_TIMEOUT;
}
sta_reg = SDIOx->STA;
}while(((sta_reg & (SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)) == 0U) ||
((sta_reg & SDIO_FLAG_CMDACT) != 0U ));
int c= __SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CTIMEOUT);
if(c)
{
/* Card is SD V2.0 compliant */
__SDIO_CLEAR_FLAG(SDIOx, SDIO_FLAG_CTIMEOUT);
return SDMMC_ERROR_CMD_RSP_TIMEOUT;
}
else if(__SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CCRCFAIL))
{
/* Card is SD V2.0 compliant */
__SDIO_CLEAR_FLAG(SDIOx, SDIO_FLAG_CCRCFAIL);
return SDMMC_ERROR_CMD_CRC_FAIL;
}
else
{
/* Nothing to do */
}
if(__SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CMDREND))
{
/* Card is SD V2.0 compliant */
__SDIO_CLEAR_FLAG(SDIOx, SDIO_FLAG_CMDREND);
}
return SDMMC_ERROR_NONE;
}
at line 24 Error SDMMC_ERROR_CMD_RSP_TIMEOUT;.
From the code it looks like __SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CTIMEOUT) comes TRUE which triggers the __SDIO_CLEAR_FLAG(SDIOx, SDIO_FLAG_CTIMEOUT). It looks to avoid any Errors I should NOT get TRUE at any of statements starting to line 19.
Questions what triggers that Error and how to fix it , and also more information on those _SDIO_FLAG_XXXX functions would be very appreciated.
2024-10-23 08:58 AM
did you find a solution, I have the same behaviour ?
Vincent