Skip to main content
MBolo.1
Associate III
July 11, 2022
Question

_SDIO_GET_FLAG Error

  • July 11, 2022
  • 1 reply
  • 1028 views

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.

1 reply

Senior
October 23, 2024

did you find a solution, I have the same behaviour ?

Vincent