in portable/STM32F4xx/stm32f4xx_hal_sd.c [2890:3039]
static HAL_SD_ErrorTypedef SD_CmdResp1Error( SD_HandleTypeDef * hsd,
uint8_t SD_CMD )
{
HAL_SD_ErrorTypedef errorstate = SD_OK;
uint32_t response_r1;
uint32_t remaining_loops = 168000 * 50;
while( !__HAL_SD_SDIO_GET_FLAG( hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT ) )
{
if( ( --remaining_loops ) == 0 )
{
FF_PRINTF( "SD_CmdResp1Error: times out\n" );
break;
}
}
if( __HAL_SD_SDIO_GET_FLAG( hsd, SDIO_FLAG_CTIMEOUT ) )
{
errorstate = SD_CMD_RSP_TIMEOUT;
__HAL_SD_SDIO_CLEAR_FLAG( hsd, SDIO_FLAG_CTIMEOUT );
return errorstate;
}
else if( __HAL_SD_SDIO_GET_FLAG( hsd, SDIO_FLAG_CCRCFAIL ) )
{
errorstate = SD_CMD_CRC_FAIL;
__HAL_SD_SDIO_CLEAR_FLAG( hsd, SDIO_FLAG_CCRCFAIL );
return errorstate;
}
/* Check response received is of desired command */
if( SDIO_GetCommandResponse( hsd->Instance ) != SD_CMD )
{
FF_PRINTF( "RESPCMD[1] = %08x cmd = %02x\n", ( unsigned ) hsd->Instance->RESPCMD, SD_CMD );
errorstate = SD_ILLEGAL_CMD;
return errorstate;
}
/* Clear all the static flags */
__HAL_SD_SDIO_CLEAR_FLAG( hsd, SDIO_STATIC_FLAGS );
/* We have received response, retrieve it for analysis */
response_r1 = SDIO_GetResponse( SDIO_RESP1 );
if( ( response_r1 & SD_OCR_ERRORBITS ) == SD_ALLZERO )
{
return errorstate;
}
if( ( response_r1 & SD_OCR_ADDR_OUT_OF_RANGE ) == SD_OCR_ADDR_OUT_OF_RANGE )
{
return( SD_ADDR_OUT_OF_RANGE );
}
if( ( response_r1 & SD_OCR_ADDR_MISALIGNED ) == SD_OCR_ADDR_MISALIGNED )
{
return( SD_ADDR_MISALIGNED );
}
if( ( response_r1 & SD_OCR_BLOCK_LEN_ERR ) == SD_OCR_BLOCK_LEN_ERR )
{
return( SD_BLOCK_LEN_ERR );
}
if( ( response_r1 & SD_OCR_ERASE_SEQ_ERR ) == SD_OCR_ERASE_SEQ_ERR )
{
return( SD_ERASE_SEQ_ERR );
}
if( ( response_r1 & SD_OCR_BAD_ERASE_PARAM ) == SD_OCR_BAD_ERASE_PARAM )
{
return( SD_BAD_ERASE_PARAM );
}
if( ( response_r1 & SD_OCR_WRITE_PROT_VIOLATION ) == SD_OCR_WRITE_PROT_VIOLATION )
{
return( SD_WRITE_PROT_VIOLATION );
}
if( ( response_r1 & SD_OCR_LOCK_UNLOCK_FAILED ) == SD_OCR_LOCK_UNLOCK_FAILED )
{
return( SD_LOCK_UNLOCK_FAILED );
}
if( ( response_r1 & SD_OCR_COM_CRC_FAILED ) == SD_OCR_COM_CRC_FAILED )
{
return( SD_COM_CRC_FAILED );
}
if( ( response_r1 & SD_OCR_ILLEGAL_CMD ) == SD_OCR_ILLEGAL_CMD )
{
return( SD_ILLEGAL_CMD );
}
if( ( response_r1 & SD_OCR_CARD_ECC_FAILED ) == SD_OCR_CARD_ECC_FAILED )
{
return( SD_CARD_ECC_FAILED );
}
if( ( response_r1 & SD_OCR_CC_ERROR ) == SD_OCR_CC_ERROR )
{
return( SD_CC_ERROR );
}
if( ( response_r1 & SD_OCR_GENERAL_UNKNOWN_ERROR ) == SD_OCR_GENERAL_UNKNOWN_ERROR )
{
return( SD_GENERAL_UNKNOWN_ERROR );
}
if( ( response_r1 & SD_OCR_STREAM_READ_UNDERRUN ) == SD_OCR_STREAM_READ_UNDERRUN )
{
return( SD_STREAM_READ_UNDERRUN );
}
if( ( response_r1 & SD_OCR_STREAM_WRITE_OVERRUN ) == SD_OCR_STREAM_WRITE_OVERRUN )
{
return( SD_STREAM_WRITE_OVERRUN );
}
if( ( response_r1 & SD_OCR_CID_CSD_OVERWRITE ) == SD_OCR_CID_CSD_OVERWRITE )
{
return( SD_CID_CSD_OVERWRITE );
}
if( ( response_r1 & SD_OCR_WP_ERASE_SKIP ) == SD_OCR_WP_ERASE_SKIP )
{
return( SD_WP_ERASE_SKIP );
}
if( ( response_r1 & SD_OCR_CARD_ECC_DISABLED ) == SD_OCR_CARD_ECC_DISABLED )
{
return( SD_CARD_ECC_DISABLED );
}
if( ( response_r1 & SD_OCR_ERASE_RESET ) == SD_OCR_ERASE_RESET )
{
return( SD_ERASE_RESET );
}
if( ( response_r1 & SD_OCR_AKE_SEQ_ERROR ) == SD_OCR_AKE_SEQ_ERROR )
{
return( SD_AKE_SEQ_ERROR );
}
return errorstate;
}