266#ifdef HAL_MMC_MODULE_ENABLED
275#if defined (VDD_VALUE) && (VDD_VALUE <= 1950U)
276#define MMC_VOLTAGE_RANGE EMMC_LOW_VOLTAGE_RANGE
278#define MMC_EXT_CSD_PWR_CL_26_INDEX 201
279#define MMC_EXT_CSD_PWR_CL_52_INDEX 200
280#define MMC_EXT_CSD_PWR_CL_DDR_52_INDEX 238
282#define MMC_EXT_CSD_PWR_CL_26_POS 8
283#define MMC_EXT_CSD_PWR_CL_52_POS 0
284#define MMC_EXT_CSD_PWR_CL_DDR_52_POS 16
286#define MMC_VOLTAGE_RANGE EMMC_HIGH_VOLTAGE_RANGE
288#define MMC_EXT_CSD_PWR_CL_26_INDEX 203
289#define MMC_EXT_CSD_PWR_CL_52_INDEX 202
290#define MMC_EXT_CSD_PWR_CL_DDR_52_INDEX 239
292#define MMC_EXT_CSD_PWR_CL_26_POS 24
293#define MMC_EXT_CSD_PWR_CL_52_POS 16
294#define MMC_EXT_CSD_PWR_CL_DDR_52_POS 24
298#define MMC_INIT_FREQ 400000U
366 assert_param(IS_SDIO_HARDWARE_FLOW_CONTROL(hmmc->
Init.HardwareFlowControl));
373#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
380 if(hmmc->MspInitCallback == NULL)
386 hmmc->MspInitCallback(hmmc);
411 if (hmmc->
Init.BusWide != SDIO_BUS_WIDE_1B)
436 Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
437 Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
438 Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
439 Init.BusWide = SDIO_BUS_WIDE_1B;
440 Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
441 Init.ClockDiv = SDIO_INIT_CLK_DIV;
444 status = SDIO_Init(hmmc->
Instance, Init);
454 status = SDIO_PowerState_ON(hmmc->
Instance);
519#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
520 if(hmmc->MspDeInitCallback == NULL)
526 hmmc->MspDeInitCallback(hmmc);
602 SDIO_DataInitTypeDef config;
605 uint32_t count, data, dataremaining;
606 uint32_t add = BlockAdd;
607 uint8_t *tempbuff = pData;
636 config.DataTimeOut = SDMMC_DATATIMEOUT;
638 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
639 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
640 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
641 config.DPSM = SDIO_DPSM_ENABLE;
642 (void)SDIO_ConfigData(hmmc->
Instance, &config);
645 if(NumberOfBlocks > 1U)
650 errorstate = SDMMC_CmdReadMultiBlock(hmmc->
Instance, add);
657 errorstate = SDMMC_CmdReadSingleBlock(hmmc->
Instance, add);
669 dataremaining = config.DataLength;
670#if defined(SDIO_STA_STBITERR)
671 while(!
__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_FLAG_STBITERR))
673 while(!
__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND))
679 for(count = 0U; count < 8U; count++)
681 data = SDIO_ReadFIFO(hmmc->
Instance);
682 *tempbuff = (uint8_t)(data & 0xFFU);
685 *tempbuff = (uint8_t)((data >> 8U) & 0xFFU);
688 *tempbuff = (uint8_t)((data >> 16U) & 0xFFU);
691 *tempbuff = (uint8_t)((data >> 24U) & 0xFFU);
697 if(((
HAL_GetTick()-tickstart) >= Timeout) || (Timeout == 0U))
711 errorstate = SDMMC_CmdStopTransfer(hmmc->
Instance);
755 data = SDIO_ReadFIFO(hmmc->
Instance);
756 *tempbuff = (uint8_t)(data & 0xFFU);
759 *tempbuff = (uint8_t)((data >> 8U) & 0xFFU);
762 *tempbuff = (uint8_t)((data >> 16U) & 0xFFU);
765 *tempbuff = (uint8_t)((data >> 24U) & 0xFFU);
769 if(((
HAL_GetTick()-tickstart) >= Timeout) || (Timeout == 0U))
807 SDIO_DataInitTypeDef config;
810 uint32_t count, data, dataremaining;
811 uint32_t add = BlockAdd;
812 uint8_t *tempbuff = pData;
841 if(NumberOfBlocks > 1U)
846 errorstate = SDMMC_CmdWriteMultiBlock(hmmc->
Instance, add);
853 errorstate = SDMMC_CmdWriteSingleBlock(hmmc->
Instance, add);
865 config.DataTimeOut = SDMMC_DATATIMEOUT;
867 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
868 config.TransferDir = SDIO_TRANSFER_DIR_TO_CARD;
869 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
870 config.DPSM = SDIO_DPSM_ENABLE;
871 (void)SDIO_ConfigData(hmmc->
Instance, &config);
874 dataremaining = config.DataLength;
875#if defined(SDIO_STA_STBITERR)
876 while(!
__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_FLAG_STBITERR))
878 while(!
__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND))
884 for(count = 0U; count < 8U; count++)
886 data = (uint32_t)(*tempbuff);
889 data |= ((uint32_t)(*tempbuff) << 8U);
892 data |= ((uint32_t)(*tempbuff) << 16U);
895 data |= ((uint32_t)(*tempbuff) << 24U);
898 (void)SDIO_WriteFIFO(hmmc->
Instance, &data);
902 if(((
HAL_GetTick()-tickstart) >= Timeout) || (Timeout == 0U))
916 errorstate = SDMMC_CmdStopTransfer(hmmc->
Instance);
986 SDIO_DataInitTypeDef config;
988 uint32_t add = BlockAdd;
1014#if defined(SDIO_STA_STBITERR)
1015 __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND | SDIO_FLAG_RXFIFOHF | SDIO_IT_STBITERR));
1017 __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND | SDIO_FLAG_RXFIFOHF));
1026 config.DataTimeOut = SDMMC_DATATIMEOUT;
1028 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
1029 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
1030 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
1031 config.DPSM = SDIO_DPSM_ENABLE;
1032 (void)SDIO_ConfigData(hmmc->
Instance, &config);
1035 if(NumberOfBlocks > 1U)
1040 errorstate = SDMMC_CmdReadMultiBlock(hmmc->
Instance, add);
1047 errorstate = SDMMC_CmdReadSingleBlock(hmmc->
Instance, add);
1082 SDIO_DataInitTypeDef config;
1083 uint32_t errorstate;
1084 uint32_t add = BlockAdd;
1111#if defined(SDIO_STA_STBITERR)
1112 __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_DATAEND | SDIO_FLAG_TXFIFOHE | SDIO_IT_STBITERR));
1114 __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_DATAEND | SDIO_FLAG_TXFIFOHE));
1123 if(NumberOfBlocks > 1U)
1128 errorstate = SDMMC_CmdWriteMultiBlock(hmmc->
Instance, add);
1135 errorstate = SDMMC_CmdWriteSingleBlock(hmmc->
Instance, add);
1147 config.DataTimeOut = SDMMC_DATATIMEOUT;
1149 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
1150 config.TransferDir = SDIO_TRANSFER_DIR_TO_CARD;
1151 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
1152 config.DPSM = SDIO_DPSM_ENABLE;
1153 (void)SDIO_ConfigData(hmmc->
Instance, &config);
1178 SDIO_DataInitTypeDef config;
1179 uint32_t errorstate;
1180 uint32_t add = BlockAdd;
1203#if defined(SDIO_STA_STBITERR)
1204 __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND | SDIO_IT_STBITERR));
1206 __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND));
1230 __HAL_MMC_DISABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND));
1242 config.DataTimeOut = SDMMC_DATATIMEOUT;
1244 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
1245 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
1246 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
1247 config.DPSM = SDIO_DPSM_ENABLE;
1248 (void)SDIO_ConfigData(hmmc->
Instance, &config);
1251 if(NumberOfBlocks > 1U)
1256 errorstate = SDMMC_CmdReadMultiBlock(hmmc->
Instance, add);
1263 errorstate = SDMMC_CmdReadSingleBlock(hmmc->
Instance, add);
1269 __HAL_MMC_DISABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND));
1299 SDIO_DataInitTypeDef config;
1300 uint32_t errorstate;
1301 uint32_t add = BlockAdd;
1325#if defined(SDIO_STA_STBITERR)
1326 __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_STBITERR));
1347 if(NumberOfBlocks > 1U)
1352 errorstate = SDMMC_CmdWriteMultiBlock(hmmc->
Instance, add);
1359 errorstate = SDMMC_CmdWriteSingleBlock(hmmc->
Instance, add);
1365 __HAL_MMC_DISABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_DATAEND));
1381 __HAL_MMC_DISABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_DATAEND));
1390 config.DataTimeOut = SDMMC_DATATIMEOUT;
1392 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
1393 config.TransferDir = SDIO_TRANSFER_DIR_TO_CARD;
1394 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
1395 config.DPSM = SDIO_DPSM_ENABLE;
1396 (void)SDIO_ConfigData(hmmc->
Instance, &config);
1418 uint32_t errorstate;
1419 uint32_t start_add = BlockStartAdd;
1420 uint32_t end_add = BlockEndAdd;
1426 if(end_add < start_add)
1450 if((SDIO_GetResponse(hmmc->
Instance, SDIO_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
1466 errorstate = SDMMC_CmdEraseStartAdd(hmmc->
Instance, start_add);
1477 errorstate = SDMMC_CmdEraseEndAdd(hmmc->
Instance, end_add);
1488 errorstate = SDMMC_CmdErase(hmmc->
Instance);
1515 uint32_t errorstate;
1516 uint32_t context = hmmc->
Context;
1528#if defined(SDIO_STA_STBITERR)
1530 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR | SDIO_IT_STBITERR);
1533 SDIO_IT_TXUNDERR | SDIO_IT_RXOVERR | SDIO_IT_TXFIFOHE |\
1537 hmmc->
Instance->DCTRL &= ~(SDIO_DCTRL_DTEN);
1543 errorstate = SDMMC_CmdStopTransfer(hmmc->
Instance);
1547#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1548 hmmc->ErrorCallback(hmmc);
1558 hmmc->
Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
1562#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1563 hmmc->TxCpltCallback(hmmc);
1574 errorstate = SDMMC_CmdStopTransfer(hmmc->
Instance);
1578#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1579 hmmc->ErrorCallback(hmmc);
1592#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1593 hmmc->RxCpltCallback(hmmc);
1600#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1601 hmmc->TxCpltCallback(hmmc);
1618#if defined(SDIO_STA_STBITERR)
1619 else if(
__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_RXOVERR | SDIO_FLAG_TXUNDERR | SDIO_FLAG_STBITERR) != RESET)
1621 else if(
__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_RXOVERR | SDIO_FLAG_TXUNDERR) != RESET)
1641#if defined(SDIO_STA_STBITERR)
1648#if defined(SDIO_STA_STBITERR)
1654 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR | SDIO_IT_STBITERR);
1661 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
1670#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1671 hmmc->ErrorCallback(hmmc);
1689 else if(hmmc->
hdmarx != NULL)
1703#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1704 hmmc->AbortCpltCallback(hmmc);
1803#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1823 if(pCallback == NULL)
1826 hmmc->
ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
1837 case HAL_MMC_TX_CPLT_CB_ID :
1838 hmmc->TxCpltCallback = pCallback;
1840 case HAL_MMC_RX_CPLT_CB_ID :
1841 hmmc->RxCpltCallback = pCallback;
1843 case HAL_MMC_ERROR_CB_ID :
1844 hmmc->ErrorCallback = pCallback;
1846 case HAL_MMC_ABORT_CB_ID :
1847 hmmc->AbortCpltCallback = pCallback;
1849 case HAL_MMC_MSP_INIT_CB_ID :
1850 hmmc->MspInitCallback = pCallback;
1852 case HAL_MMC_MSP_DEINIT_CB_ID :
1853 hmmc->MspDeInitCallback = pCallback;
1857 hmmc->
ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
1867 case HAL_MMC_MSP_INIT_CB_ID :
1868 hmmc->MspInitCallback = pCallback;
1870 case HAL_MMC_MSP_DEINIT_CB_ID :
1871 hmmc->MspDeInitCallback = pCallback;
1875 hmmc->
ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
1884 hmmc->
ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
1919 case HAL_MMC_TX_CPLT_CB_ID :
1922 case HAL_MMC_RX_CPLT_CB_ID :
1925 case HAL_MMC_ERROR_CB_ID :
1928 case HAL_MMC_ABORT_CB_ID :
1931 case HAL_MMC_MSP_INIT_CB_ID :
1934 case HAL_MMC_MSP_DEINIT_CB_ID :
1939 hmmc->
ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
1949 case HAL_MMC_MSP_INIT_CB_ID :
1952 case HAL_MMC_MSP_DEINIT_CB_ID :
1957 hmmc->
ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
1966 hmmc->
ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
2008 pCID->
OEM_AppliID = (uint16_t)((hmmc->
CID[0] & 0x00FFFF00U) >> 8U);
2010 pCID->
ProdName1 = (((hmmc->
CID[0] & 0x000000FFU) << 24U) | ((hmmc->
CID[1] & 0xFFFFFF00U) >> 8U));
2012 pCID->
ProdName2 = (uint8_t)(hmmc->
CID[1] & 0x000000FFU);
2014 pCID->
ProdRev = (uint8_t)((hmmc->
CID[2] & 0xFF000000U) >> 24U);
2016 pCID->
ProdSN = (((hmmc->
CID[2] & 0x00FFFFFFU) << 8U) | ((hmmc->
CID[3] & 0xFF000000U) >> 24U));
2018 pCID->
Reserved1 = (uint8_t)((hmmc->
CID[3] & 0x00F00000U) >> 20U);
2022 pCID->
CID_CRC = (uint8_t)((hmmc->
CID[3] & 0x000000FEU) >> 1U);
2039 uint32_t block_nbr = 0;
2041 pCSD->
CSDStruct = (uint8_t)((hmmc->
CSD[0] & 0xC0000000U) >> 30U);
2045 pCSD->
Reserved1 = (uint8_t)((hmmc->
CSD[0] & 0x03000000U) >> 24U);
2047 pCSD->
TAAC = (uint8_t)((hmmc->
CSD[0] & 0x00FF0000U) >> 16U);
2049 pCSD->
NSAC = (uint8_t)((hmmc->
CSD[0] & 0x0000FF00U) >> 8U);
2055 pCSD->
RdBlockLen = (uint8_t)((hmmc->
CSD[1] & 0x000F0000U) >> 16U);
2063 pCSD->
DSRImpl = (uint8_t)((hmmc->
CSD[1] & 0x00001000U) >> 12U);
2067 pCSD->
DeviceSize = (((hmmc->
CSD[1] & 0x000003FFU) << 2U) | ((hmmc->
CSD[2] & 0xC0000000U) >> 30U));
2108 pCSD->
EraseGrSize = (uint8_t)((hmmc->
CSD[2] & 0x00004000U) >> 14U);
2110 pCSD->
EraseGrMul = (uint8_t)((hmmc->
CSD[2] & 0x00003F80U) >> 7U);
2116 pCSD->
ManDeflECC = (uint8_t)((hmmc->
CSD[3] & 0x60000000U) >> 29U);
2118 pCSD->
WrSpeedFact = (uint8_t)((hmmc->
CSD[3] & 0x1C000000U) >> 26U);
2130 pCSD->
CopyFlag = (uint8_t)((hmmc->
CSD[3] & 0x00004000U) >> 14U);
2136 pCSD->
FileFormat = (uint8_t)((hmmc->
CSD[3] & 0x00000C00U) >> 10U);
2138 pCSD->
ECC= (uint8_t)((hmmc->
CSD[3] & 0x00000300U) >> 8U);
2140 pCSD->
CSD_CRC = (uint8_t)((hmmc->
CSD[3] & 0x000000FEU) >> 1U);
2178 SDIO_DataInitTypeDef config;
2179 uint32_t errorstate;
2203 config.DataTimeOut = SDMMC_DATATIMEOUT;
2204 config.DataLength = 512;
2205 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
2206 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
2207 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
2208 config.DPSM = SDIO_DPSM_ENABLE;
2209 (void)SDIO_ConfigData(hmmc->
Instance, &config);
2212 errorstate = SDMMC_CmdSendEXTCSD(hmmc->
Instance, 0);
2223 while(!
__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND))
2228 for(count = 0U; count < 8U; count++)
2230 *tmp_buf = SDIO_ReadFIFO(hmmc->
Instance);
2235 if(((
HAL_GetTick()-tickstart) >= Timeout) || (Timeout == 0U))
2297 SDIO_InitTypeDef Init;
2298 uint32_t errorstate;
2299 uint32_t response = 0U;
2311 if(WideMode == SDIO_BUS_WIDE_8B)
2313 errorstate = SDMMC_CmdSwitch(hmmc->
Instance, 0x03B70200U);
2315 else if(WideMode == SDIO_BUS_WIDE_4B)
2317 errorstate = SDMMC_CmdSwitch(hmmc->
Instance, 0x03B70100U);
2319 else if(WideMode == SDIO_BUS_WIDE_1B)
2321 errorstate = SDMMC_CmdSwitch(hmmc->
Instance, 0x03B70000U);
2333 count = SDMMC_MAX_TRIAL;
2343 response = SDIO_GetResponse(hmmc->
Instance, SDIO_RESP1);
2345 }
while(((response & 0x100U) == 0U) && (count != 0U));
2351 if ((response & 0x80U) != 0U)
2353 errorstate = SDMMC_ERROR_GENERAL_UNKNOWN_ERR;
2359 Init.BusWide = WideMode;
2360 (void)SDIO_Init(hmmc->
Instance, Init);
2363 else if (count == 0U)
2365 errorstate = SDMMC_ERROR_TIMEOUT;
2396 uint32_t errorstate;
2397 uint32_t resp1 = 0U;
2405 cardstate = ((resp1 >> 9U) & 0x0FU);
2422 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
2430 hmmc->
Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
2479 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
2487 hmmc->
Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
2525#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
2526 hmmc->AbortCpltCallback(hmmc);
2570 uint32_t errorstate;
2575 errorstate = SDMMC_CmdStopTransfer(hmmc->
Instance);
2579#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
2580 hmmc->ErrorCallback(hmmc);
2589 hmmc->
Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
2596#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
2597 hmmc->RxCpltCallback(hmmc);
2612 uint32_t RxErrorCode, TxErrorCode;
2626 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
2638#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
2639 hmmc->ErrorCallback(hmmc);
2673#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
2674 hmmc->AbortCpltCallback(hmmc);
2681#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
2682 hmmc->ErrorCallback(hmmc);
2718#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
2719 hmmc->AbortCpltCallback(hmmc);
2726#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
2727 hmmc->ErrorCallback(hmmc);
2744 uint32_t errorstate;
2745 uint16_t mmc_rca = 2U;
2749 if(SDIO_GetPowerState(hmmc->
Instance) == 0U)
2756 errorstate = SDMMC_CmdSendCID(hmmc->
Instance);
2764 hmmc->
CID[0U] = SDIO_GetResponse(hmmc->
Instance, SDIO_RESP1);
2765 hmmc->
CID[1U] = SDIO_GetResponse(hmmc->
Instance, SDIO_RESP2);
2766 hmmc->
CID[2U] = SDIO_GetResponse(hmmc->
Instance, SDIO_RESP3);
2767 hmmc->
CID[3U] = SDIO_GetResponse(hmmc->
Instance, SDIO_RESP4);
2772 errorstate = SDMMC_CmdSetRelAddMmc(hmmc->
Instance, mmc_rca);
2790 hmmc->
CSD[0U] = SDIO_GetResponse(hmmc->
Instance, SDIO_RESP1);
2791 hmmc->
CSD[1U] = SDIO_GetResponse(hmmc->
Instance, SDIO_RESP2);
2792 hmmc->
CSD[2U] = SDIO_GetResponse(hmmc->
Instance, SDIO_RESP3);
2793 hmmc->
CSD[3U] = SDIO_GetResponse(hmmc->
Instance, SDIO_RESP4);
2834 Init.BusWide = SDIO_BUS_WIDE_1B;
2835 (void)SDIO_Init(hmmc->
Instance, Init);
2850 __IO uint32_t count = 0U;
2851 uint32_t response = 0U, validvoltage = 0U;
2852 uint32_t errorstate;
2855 errorstate = SDMMC_CmdGoIdleState(hmmc->
Instance);
2861 while(validvoltage == 0U)
2863 if(count++ == SDMMC_MAX_VOLT_TRIAL)
2876 response = SDIO_GetResponse(hmmc->
Instance, SDIO_RESP1);
2879 validvoltage = (((response >> 31U) == 1U) ? 1U : 0U);
2883 if (((response & (0xFF000000U)) >> 24U) == 0xC0U)
2903 (void)SDIO_PowerState_OFF(hmmc->
Instance);
2915 uint32_t errorstate;
2917 if(pCardStatus == NULL)
2930 *pCardStatus = SDIO_GetResponse(hmmc->
Instance, SDIO_RESP1);
2945 SDIO_DataInitTypeDef config;
2946 uint32_t errorstate;
2958 config.DataTimeOut = SDMMC_DATATIMEOUT;
2959 config.DataLength = 512;
2960 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
2961 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
2962 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
2963 config.DPSM = SDIO_DPSM_ENABLE;
2964 (void)SDIO_ConfigData(hmmc->
Instance, &config);
2967 errorstate = SDMMC_CmdSendEXTCSD(hmmc->
Instance, 0);
2978 while(!
__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND))
2983 for(count = 0U; count < 8U; count++)
2985 tmp_data = SDIO_ReadFIFO(hmmc->
Instance);
2988 if ((i + count) == ((uint32_t)FieldIndex/4U))
2990 *pFieldData = tmp_data;
2996 if(((
HAL_GetTick()-tickstart) >= Timeout) || (Timeout == 0U))
3030 uint32_t count, data, dataremaining;
3036 if (dataremaining > 0U)
3039 for(count = 0U; count < 8U; count++)
3041 data = SDIO_ReadFIFO(hmmc->
Instance);
3042 *tmp = (uint8_t)(data & 0xFFU);
3045 *tmp = (uint8_t)((data >> 8U) & 0xFFU);
3048 *tmp = (uint8_t)((data >> 16U) & 0xFFU);
3051 *tmp = (uint8_t)((data >> 24U) & 0xFFU);
3069 uint32_t count, data, dataremaining;
3075 if (dataremaining > 0U)
3078 for(count = 0U; count < 8U; count++)
3080 data = (uint32_t)(*tmp);
3083 data |= ((uint32_t)(*tmp) << 8U);
3086 data |= ((uint32_t)(*tmp) << 16U);
3089 data |= ((uint32_t)(*tmp) << 24U);
3092 (void)SDIO_WriteFIFO(hmmc->
Instance, &data);
3110 uint32_t response = 0U;
3112 uint32_t power_class, supported_pwr_class;
3114 if((Wide == SDIO_BUS_WIDE_8B) || (Wide == SDIO_BUS_WIDE_4B))
3121 errorstate = SDMMC_ERROR_GENERAL_UNKNOWN_ERR;
3125 power_class = ((power_class >> 24U) & 0x000000FFU);
3134 if(Wide == SDIO_BUS_WIDE_8B)
3137 supported_pwr_class = (supported_pwr_class >> 4U);
3140 if ((power_class & 0x0FU) != (supported_pwr_class & 0x0FU))
3143 errorstate = SDMMC_CmdSwitch(hmmc->
Instance, (0x03BB0000U | ((supported_pwr_class & 0x0FU) << 8U)));
3148 count = SDMMC_MAX_TRIAL;
3158 response = SDIO_GetResponse(hmmc->
Instance, SDIO_RESP1);
3160 }
while(((response & 0x100U) == 0U) && (count != 0U));
3166 if ((response & 0x80U) != 0U)
3168 errorstate = SDMMC_ERROR_UNSUPPORTED_FEATURE;
3171 else if (count == 0U)
3173 errorstate = SDMMC_ERROR_TIMEOUT;
#define DMA_MEMORY_TO_PERIPH
#define DMA_PERIPH_TO_MEMORY
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
Aborts the DMA Transfer.
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
Aborts the DMA Transfer in Interrupt mode.
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
Start the DMA Transfer with interrupt enabled.
uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma)
Return the DMA error code.
void HAL_Delay(uint32_t Delay)
This function provides minimum delay (in milliseconds) based on variable incremented.
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
#define HAL_MMC_ERROR_BUSY
#define HAL_MMC_ERROR_LOCK_UNLOCK_FAILED
#define HAL_MMC_ERROR_ADDR_OUT_OF_RANGE
#define HAL_MMC_ERROR_DATA_TIMEOUT
#define HAL_MMC_ERROR_TX_UNDERRUN
#define HAL_MMC_ERROR_RX_OVERRUN
#define HAL_MMC_ERROR_TIMEOUT
#define HAL_MMC_ERROR_INVALID_VOLTRANGE
#define HAL_MMC_ERROR_DATA_CRC_FAIL
#define HAL_MMC_ERROR_PARAM
#define HAL_MMC_ERROR_REQUEST_NOT_APPLICABLE
#define HAL_MMC_ERROR_DMA
#define HAL_MMC_ERROR_NONE
#define HAL_MMC_ERROR_UNSUPPORTED_FEATURE
#define MMC_CONTEXT_WRITE_MULTIPLE_BLOCK
#define MMC_CONTEXT_WRITE_SINGLE_BLOCK
#define MMC_CONTEXT_READ_SINGLE_BLOCK
#define MMC_CONTEXT_READ_MULTIPLE_BLOCK
#define MMC_HIGH_CAPACITY_CARD
#define MMC_LOW_CAPACITY_CARD
HAL_StatusTypeDef HAL_MMC_DeInit(MMC_HandleTypeDef *hmmc)
De-Initializes the MMC card.
void HAL_MMC_MspDeInit(MMC_HandleTypeDef *hmmc)
De-Initialize MMC MSP.
HAL_StatusTypeDef HAL_MMC_InitCard(MMC_HandleTypeDef *hmmc)
Initializes the MMC Card.
HAL_StatusTypeDef HAL_MMC_Init(MMC_HandleTypeDef *hmmc)
Initializes the MMC according to the specified parameters in the MMC_HandleTypeDef and create the ass...
void HAL_MMC_MspInit(MMC_HandleTypeDef *hmmc)
Initializes the MMC MSP.
HAL_StatusTypeDef HAL_MMC_ReadBlocks_DMA(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
Reads block(s) from a specified address in a card. The Data transfer is managed by DMA mode.
HAL_StatusTypeDef HAL_MMC_ReadBlocks_IT(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
Reads block(s) from a specified address in a card. The Data transfer is managed in interrupt mode.
HAL_StatusTypeDef HAL_MMC_WriteBlocks_IT(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
Writes block(s) to a specified address in a card. The Data transfer is managed in interrupt mode.
uint32_t HAL_MMC_GetError(MMC_HandleTypeDef *hmmc)
Return the MMC error code.
HAL_StatusTypeDef HAL_MMC_WriteBlocks(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout)
Allows to write block(s) to a specified address in a card. The Data transfer is managed by polling mo...
void HAL_MMC_TxCpltCallback(MMC_HandleTypeDef *hmmc)
Tx Transfer completed callbacks.
void HAL_MMC_ErrorCallback(MMC_HandleTypeDef *hmmc)
MMC error callbacks.
void HAL_MMC_AbortCallback(MMC_HandleTypeDef *hmmc)
MMC Abort callbacks.
void HAL_MMC_RxCpltCallback(MMC_HandleTypeDef *hmmc)
Rx Transfer completed callbacks.
HAL_StatusTypeDef HAL_MMC_ReadBlocks(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout)
Reads block(s) from a specified address in a card. The Data transfer is managed by polling mode.
HAL_StatusTypeDef HAL_MMC_Erase(MMC_HandleTypeDef *hmmc, uint32_t BlockStartAdd, uint32_t BlockEndAdd)
Erases the specified memory area of the given MMC card.
HAL_MMC_StateTypeDef HAL_MMC_GetState(MMC_HandleTypeDef *hmmc)
return the MMC state
HAL_StatusTypeDef HAL_MMC_WriteBlocks_DMA(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
Writes block(s) to a specified address in a card. The Data transfer is managed by DMA mode.
void HAL_MMC_IRQHandler(MMC_HandleTypeDef *hmmc)
This function handles MMC card interrupt request.
HAL_StatusTypeDef HAL_MMC_GetCardCSD(MMC_HandleTypeDef *hmmc, HAL_MMC_CardCSDTypeDef *pCSD)
Returns information the information of the card which are stored on the CSD register.
HAL_StatusTypeDef HAL_MMC_Abort(MMC_HandleTypeDef *hmmc)
Abort the current transfer and disable the MMC.
HAL_StatusTypeDef HAL_MMC_Abort_IT(MMC_HandleTypeDef *hmmc)
Abort the current transfer and disable the MMC (IT mode).
HAL_StatusTypeDef HAL_MMC_ConfigWideBusOperation(MMC_HandleTypeDef *hmmc, uint32_t WideMode)
Enables wide bus operation for the requested card if supported by card.
HAL_StatusTypeDef HAL_MMC_GetCardInfo(MMC_HandleTypeDef *hmmc, HAL_MMC_CardInfoTypeDef *pCardInfo)
Gets the MMC card info.
HAL_StatusTypeDef HAL_MMC_GetCardCID(MMC_HandleTypeDef *hmmc, HAL_MMC_CardCIDTypeDef *pCID)
Returns information the information of the card which are stored on the CID register.
HAL_MMC_CardStateTypeDef HAL_MMC_GetCardState(MMC_HandleTypeDef *hmmc)
Gets the current mmc card data state.
HAL_StatusTypeDef HAL_MMC_GetCardExtCSD(MMC_HandleTypeDef *hmmc, uint32_t *pExtCSD, uint32_t Timeout)
Returns information the information of the card which are stored on the Extended CSD register.
#define HAL_MMC_CARD_SENDING
uint32_t HAL_MMC_CardStateTypeDef
#define HAL_MMC_CARD_RECEIVING
#define __HAL_MMC_DISABLE_IT(__HANDLE__, __INTERRUPT__)
Disable the MMC device interrupt.
#define __HAL_MMC_ENABLE(__HANDLE__)
Enable the MMC device.
#define __HAL_MMC_GET_FLAG(__HANDLE__, __FLAG__)
Check whether the specified MMC flag is set or not.
#define __HAL_MMC_DMA_ENABLE(__HANDLE__)
Enable the SDMMC DMA transfer.
#define __HAL_MMC_DISABLE(__HANDLE__)
Disable the MMC device.
#define __HAL_MMC_ENABLE_IT(__HANDLE__, __INTERRUPT__)
Enable the MMC device interrupt.
#define __HAL_MMC_CLEAR_FLAG(__HANDLE__, __FLAG__)
Clear the MMC's pending flags.
#define MMC_EXT_CSD_PWR_CL_26_INDEX
#define MMC_EXT_CSD_PWR_CL_26_POS
#define MMC_VOLTAGE_RANGE
static void MMC_DMAError(DMA_HandleTypeDef *hdma)
DMA MMC communication error callback.
static uint32_t MMC_PowerON(MMC_HandleTypeDef *hmmc)
Enquires cards about their operating voltage and configures clock controls and stores MMC information...
static uint32_t MMC_PwrClassUpdate(MMC_HandleTypeDef *hmmc, uint32_t Wide)
Update the power class of the device.
static uint32_t MMC_SendStatus(MMC_HandleTypeDef *hmmc, uint32_t *pCardStatus)
Returns the current card's status.
static uint32_t MMC_ReadExtCSD(MMC_HandleTypeDef *hmmc, uint32_t *pFieldData, uint16_t FieldIndex, uint32_t Timeout)
Reads extended CSD register to get the sectors number of the device.
static void MMC_DMATxAbort(DMA_HandleTypeDef *hdma)
DMA MMC Tx Abort callback.
static void MMC_PowerOFF(MMC_HandleTypeDef *hmmc)
Turns the SDIO output signals off.
static void MMC_Write_IT(MMC_HandleTypeDef *hmmc)
Wrap up writing in non-blocking mode.
static void MMC_DMATransmitCplt(DMA_HandleTypeDef *hdma)
DMA MMC transmit process complete callback.
static void MMC_DMARxAbort(DMA_HandleTypeDef *hdma)
DMA MMC Rx Abort callback.
static void MMC_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
DMA MMC receive process complete callback.
static uint32_t MMC_InitCard(MMC_HandleTypeDef *hmmc)
Initializes the mmc card.
static void MMC_Read_IT(MMC_HandleTypeDef *hmmc)
Wrap up reading in non-blocking mode.
#define assert_param(expr)
This file contains all the functions prototypes for the HAL module driver.
HAL_StatusTypeDef
HAL Status structures definition
#define __HAL_UNLOCK(__HANDLE__)
#define __HAL_LOCK(__HANDLE__)
__IO uint16_t OEM_AppliID
__IO uint8_t ManufacturerID
__IO uint16_t ManufactDate
__IO uint8_t PermWrProtect
__IO uint8_t WriteBlockPaPartial
__IO uint8_t MaxBusClkFrec
__IO uint8_t WrBlockMisalign
__IO uint8_t WrProtectGrSize
__IO uint8_t PartBlockRead
__IO uint8_t FileFormatGroup
__IO uint8_t SysSpecVersion
__IO uint8_t MaxWrCurrentVDDMax
__IO uint8_t ContentProtectAppli
__IO uint8_t DeviceSizeMul
__IO uint8_t TempWrProtect
__IO uint8_t RdBlockMisalign
__IO uint8_t MaxWrCurrentVDDMin
__IO uint8_t MaxRdCurrentVDDMin
__IO uint8_t MaxRdCurrentVDDMax
__IO uint8_t MaxWrBlockLen
__IO uint16_t CardComdClasses
__IO uint8_t WrProtectGrEnable
MMC Card Information Structure definition.
MMC handle Structure definition.
HAL_MMC_CardInfoTypeDef MmcCard
__IO HAL_MMC_StateTypeDef State
DMA_HandleTypeDef * hdmatx
DMA_HandleTypeDef * hdmarx
DMA handle Structure definition.
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
DMA_Stream_TypeDef * Instance