static HAL_SD_ErrorTypedef SD_CmdResp1Error()

in portable/STM32F7xx/stm32f7xx_hal_sd.c [2936:3084]


    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 )
        {
            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( hsd->Instance, 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;
    }