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
313 static uint32_t MMC_ReadExtCSD(
MMC_HandleTypeDef *hmmc, uint32_t *pFieldData, uint16_t FieldIndex, uint32_t Timeout);
361 assert_param(IS_SDIO_ALL_INSTANCE(hmmc->Instance));
362 assert_param(IS_SDIO_CLOCK_EDGE(hmmc->Init.ClockEdge));
363 assert_param(IS_SDIO_CLOCK_BYPASS(hmmc->Init.ClockBypass));
364 assert_param(IS_SDIO_CLOCK_POWER_SAVE(hmmc->Init.ClockPowerSave));
365 assert_param(IS_SDIO_BUS_WIDE(hmmc->Init.BusWide));
366 assert_param(IS_SDIO_HARDWARE_FLOW_CONTROL(hmmc->Init.HardwareFlowControl));
367 assert_param(IS_SDIO_CLKDIV(hmmc->Init.ClockDiv));
369 if(hmmc->State == HAL_MMC_STATE_RESET)
372 hmmc->Lock = HAL_UNLOCKED;
373 #if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
380 if(hmmc->MspInitCallback == NULL)
386 hmmc->MspInitCallback(hmmc);
393 hmmc->State = HAL_MMC_STATE_BUSY;
402 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
405 hmmc->Context = MMC_CONTEXT_NONE;
408 hmmc->State = HAL_MMC_STATE_READY;
411 if (hmmc->Init.BusWide != SDIO_BUS_WIDE_1B)
432 MMC_InitTypeDef Init;
433 HAL_StatusTypeDef status;
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);
445 if(status == HAL_ERROR)
451 __HAL_MMC_DISABLE(hmmc);
455 if(status == HAL_ERROR)
461 __HAL_MMC_ENABLE(hmmc);
467 errorstate = MMC_PowerON(hmmc);
468 if(errorstate != HAL_MMC_ERROR_NONE)
470 hmmc->State = HAL_MMC_STATE_READY;
471 hmmc->ErrorCode |= errorstate;
476 errorstate = MMC_InitCard(hmmc);
477 if(errorstate != HAL_MMC_ERROR_NONE)
479 hmmc->State = HAL_MMC_STATE_READY;
480 hmmc->ErrorCode |= errorstate;
486 if(errorstate != HAL_MMC_ERROR_NONE)
489 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
490 hmmc->ErrorCode |= errorstate;
491 hmmc->State = HAL_MMC_STATE_READY;
512 assert_param(IS_SDIO_ALL_INSTANCE(hmmc->Instance));
514 hmmc->State = HAL_MMC_STATE_BUSY;
519 #if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
520 if(hmmc->MspDeInitCallback == NULL)
526 hmmc->MspDeInitCallback(hmmc);
532 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
533 hmmc->State = HAL_MMC_STATE_RESET;
605 uint32_t count, data, dataremaining;
606 uint32_t add = BlockAdd;
607 uint8_t *tempbuff = pData;
611 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
615 if(hmmc->State == HAL_MMC_STATE_READY)
617 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
619 if((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr))
621 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
625 hmmc->State = HAL_MMC_STATE_BUSY;
628 hmmc->Instance->DCTRL = 0U;
630 if ((hmmc->MmcCard.CardType) != MMC_HIGH_CAPACITY_CARD)
637 config.
DataLength = NumberOfBlocks * MMC_BLOCKSIZE;
641 config.
DPSM = SDIO_DPSM_ENABLE;
645 if(NumberOfBlocks > 1U)
647 hmmc->Context = MMC_CONTEXT_READ_MULTIPLE_BLOCK;
654 hmmc->Context = MMC_CONTEXT_READ_SINGLE_BLOCK;
659 if(errorstate != HAL_MMC_ERROR_NONE)
662 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
663 hmmc->ErrorCode |= errorstate;
664 hmmc->State = HAL_MMC_STATE_READY;
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))
676 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXFIFOHF) && (dataremaining > 0U))
679 for(count = 0U; count < 8U; count++)
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))
700 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
701 hmmc->ErrorCode |= HAL_MMC_ERROR_TIMEOUT;
702 hmmc->State= HAL_MMC_STATE_READY;
708 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DATAEND) && (NumberOfBlocks > 1U))
712 if(errorstate != HAL_MMC_ERROR_NONE)
715 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
716 hmmc->ErrorCode |= errorstate;
717 hmmc->State = HAL_MMC_STATE_READY;
723 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DTIMEOUT))
726 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
727 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT;
728 hmmc->State = HAL_MMC_STATE_READY;
731 else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DCRCFAIL))
734 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
735 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_CRC_FAIL;
736 hmmc->State = HAL_MMC_STATE_READY;
739 else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXOVERR))
742 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
743 hmmc->ErrorCode |= HAL_MMC_ERROR_RX_OVERRUN;
744 hmmc->State = HAL_MMC_STATE_READY;
753 while ((__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXDAVL)) && (dataremaining > 0U))
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))
772 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
773 hmmc->ErrorCode |= HAL_MMC_ERROR_TIMEOUT;
774 hmmc->State= HAL_MMC_STATE_READY;
780 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_DATA_FLAGS);
782 hmmc->State = HAL_MMC_STATE_READY;
788 hmmc->ErrorCode |= HAL_MMC_ERROR_BUSY;
810 uint32_t count, data, dataremaining;
811 uint32_t add = BlockAdd;
812 uint8_t *tempbuff = pData;
816 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
820 if(hmmc->State == HAL_MMC_STATE_READY)
822 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
824 if((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr))
826 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
830 hmmc->State = HAL_MMC_STATE_BUSY;
833 hmmc->Instance->DCTRL = 0U;
835 if ((hmmc->MmcCard.CardType) != MMC_HIGH_CAPACITY_CARD)
841 if(NumberOfBlocks > 1U)
843 hmmc->Context = MMC_CONTEXT_WRITE_MULTIPLE_BLOCK;
850 hmmc->Context = MMC_CONTEXT_WRITE_SINGLE_BLOCK;
855 if(errorstate != HAL_MMC_ERROR_NONE)
858 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
859 hmmc->ErrorCode |= errorstate;
860 hmmc->State = HAL_MMC_STATE_READY;
866 config.
DataLength = NumberOfBlocks * MMC_BLOCKSIZE;
870 config.
DPSM = SDIO_DPSM_ENABLE;
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))
881 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_TXFIFOHE) && (dataremaining > 0U))
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);
902 if(((
HAL_GetTick()-tickstart) >= Timeout) || (Timeout == 0U))
905 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
906 hmmc->ErrorCode |= errorstate;
907 hmmc->State = HAL_MMC_STATE_READY;
913 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DATAEND) && (NumberOfBlocks > 1U))
917 if(errorstate != HAL_MMC_ERROR_NONE)
920 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
921 hmmc->ErrorCode |= errorstate;
922 hmmc->State = HAL_MMC_STATE_READY;
928 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DTIMEOUT))
931 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
932 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT;
933 hmmc->State = HAL_MMC_STATE_READY;
936 else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DCRCFAIL))
939 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
940 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_CRC_FAIL;
941 hmmc->State = HAL_MMC_STATE_READY;
944 else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_TXUNDERR))
947 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
948 hmmc->ErrorCode |= HAL_MMC_ERROR_TX_UNDERRUN;
949 hmmc->State = HAL_MMC_STATE_READY;
958 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_DATA_FLAGS);
960 hmmc->State = HAL_MMC_STATE_READY;
966 hmmc->ErrorCode |= HAL_MMC_ERROR_BUSY;
988 uint32_t add = BlockAdd;
992 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
996 if(hmmc->State == HAL_MMC_STATE_READY)
998 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
1000 if((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr))
1002 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
1006 hmmc->State = HAL_MMC_STATE_BUSY;
1009 hmmc->Instance->DCTRL = 0U;
1011 hmmc->pRxBuffPtr = pData;
1012 hmmc->RxXferSize = MMC_BLOCKSIZE * NumberOfBlocks;
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));
1020 if ((hmmc->MmcCard.CardType) != MMC_HIGH_CAPACITY_CARD)
1027 config.
DataLength = MMC_BLOCKSIZE * NumberOfBlocks;
1031 config.
DPSM = SDIO_DPSM_ENABLE;
1035 if(NumberOfBlocks > 1U)
1037 hmmc->Context = (MMC_CONTEXT_READ_MULTIPLE_BLOCK | MMC_CONTEXT_IT);
1044 hmmc->Context = (MMC_CONTEXT_READ_SINGLE_BLOCK | MMC_CONTEXT_IT);
1050 if(errorstate != HAL_MMC_ERROR_NONE)
1053 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
1054 hmmc->ErrorCode |= errorstate;
1055 hmmc->State = HAL_MMC_STATE_READY;
1083 uint32_t errorstate;
1084 uint32_t add = BlockAdd;
1088 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
1092 if(hmmc->State == HAL_MMC_STATE_READY)
1094 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
1096 if((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr))
1098 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
1102 hmmc->State = HAL_MMC_STATE_BUSY;
1105 hmmc->Instance->DCTRL = 0U;
1107 hmmc->pTxBuffPtr = pData;
1108 hmmc->TxXferSize = MMC_BLOCKSIZE * NumberOfBlocks;
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));
1117 if ((hmmc->MmcCard.CardType) != MMC_HIGH_CAPACITY_CARD)
1123 if(NumberOfBlocks > 1U)
1125 hmmc->Context = (MMC_CONTEXT_WRITE_MULTIPLE_BLOCK| MMC_CONTEXT_IT);
1132 hmmc->Context = (MMC_CONTEXT_WRITE_SINGLE_BLOCK | MMC_CONTEXT_IT);
1137 if(errorstate != HAL_MMC_ERROR_NONE)
1140 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
1141 hmmc->ErrorCode |= errorstate;
1142 hmmc->State = HAL_MMC_STATE_READY;
1148 config.
DataLength = MMC_BLOCKSIZE * NumberOfBlocks;
1152 config.
DPSM = SDIO_DPSM_ENABLE;
1179 uint32_t errorstate;
1180 uint32_t add = BlockAdd;
1184 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
1188 if(hmmc->State == HAL_MMC_STATE_READY)
1190 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
1192 if((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr))
1194 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
1198 hmmc->State = HAL_MMC_STATE_BUSY;
1201 hmmc->Instance->DCTRL = 0U;
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));
1210 hmmc->hdmarx->XferCpltCallback = MMC_DMAReceiveCplt;
1213 hmmc->hdmarx->XferErrorCallback = MMC_DMAError;
1216 hmmc->hdmarx->XferAbortCallback = NULL;
1218 if ((hmmc->MmcCard.CardType) != MMC_HIGH_CAPACITY_CARD)
1224 hmmc->hdmarx->Init.Direction = DMA_PERIPH_TO_MEMORY;
1225 MODIFY_REG(hmmc->hdmarx->Instance->CR, DMA_SxCR_DIR, hmmc->hdmarx->Init.Direction);
1228 if(
HAL_DMA_Start_IT(hmmc->hdmarx, (uint32_t)&hmmc->Instance->FIFO, (uint32_t)pData, (uint32_t)(MMC_BLOCKSIZE * NumberOfBlocks)/4) != HAL_OK)
1230 __HAL_MMC_DISABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND));
1231 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
1232 hmmc->ErrorCode = HAL_MMC_ERROR_DMA;
1233 hmmc->State = HAL_MMC_STATE_READY;
1239 __HAL_MMC_DMA_ENABLE(hmmc);
1243 config.
DataLength = MMC_BLOCKSIZE * NumberOfBlocks;
1247 config.
DPSM = SDIO_DPSM_ENABLE;
1251 if(NumberOfBlocks > 1U)
1253 hmmc->Context = (MMC_CONTEXT_READ_MULTIPLE_BLOCK | MMC_CONTEXT_DMA);
1260 hmmc->Context = (MMC_CONTEXT_READ_SINGLE_BLOCK | MMC_CONTEXT_DMA);
1265 if(errorstate != HAL_MMC_ERROR_NONE)
1268 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
1269 __HAL_MMC_DISABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND));
1270 hmmc->ErrorCode = errorstate;
1271 hmmc->State = HAL_MMC_STATE_READY;
1300 uint32_t errorstate;
1301 uint32_t add = BlockAdd;
1305 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
1309 if(hmmc->State == HAL_MMC_STATE_READY)
1311 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
1313 if((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr))
1315 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
1319 hmmc->State = HAL_MMC_STATE_BUSY;
1322 hmmc->Instance->DCTRL = 0U;
1325 #if defined(SDIO_STA_STBITERR)
1326 __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_STBITERR));
1328 __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR));
1332 hmmc->hdmatx->XferCpltCallback = MMC_DMATransmitCplt;
1335 hmmc->hdmatx->XferErrorCallback = MMC_DMAError;
1338 hmmc->hdmatx->XferAbortCallback = NULL;
1340 if ((hmmc->MmcCard.CardType) != MMC_HIGH_CAPACITY_CARD)
1347 if(NumberOfBlocks > 1U)
1349 hmmc->Context = (MMC_CONTEXT_WRITE_MULTIPLE_BLOCK | MMC_CONTEXT_DMA);
1356 hmmc->Context = (MMC_CONTEXT_WRITE_SINGLE_BLOCK | MMC_CONTEXT_DMA);
1361 if(errorstate != HAL_MMC_ERROR_NONE)
1364 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
1365 __HAL_MMC_DISABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_DATAEND));
1366 hmmc->ErrorCode |= errorstate;
1367 hmmc->State = HAL_MMC_STATE_READY;
1372 __HAL_MMC_DMA_ENABLE(hmmc);
1375 hmmc->hdmatx->Init.Direction = DMA_MEMORY_TO_PERIPH;
1376 MODIFY_REG(hmmc->hdmatx->Instance->CR, DMA_SxCR_DIR, hmmc->hdmatx->Init.Direction);
1379 if(
HAL_DMA_Start_IT(hmmc->hdmatx, (uint32_t)pData, (uint32_t)&hmmc->Instance->FIFO, (uint32_t)(MMC_BLOCKSIZE * NumberOfBlocks)/4) != HAL_OK)
1381 __HAL_MMC_DISABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_DATAEND));
1382 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
1383 hmmc->ErrorCode |= HAL_MMC_ERROR_DMA;
1384 hmmc->State = HAL_MMC_STATE_READY;
1391 config.
DataLength = MMC_BLOCKSIZE * NumberOfBlocks;
1395 config.
DPSM = SDIO_DPSM_ENABLE;
1418 uint32_t errorstate;
1419 uint32_t start_add = BlockStartAdd;
1420 uint32_t end_add = BlockEndAdd;
1422 if(hmmc->State == HAL_MMC_STATE_READY)
1424 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
1426 if(end_add < start_add)
1428 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
1432 if(end_add > (hmmc->MmcCard.LogBlockNbr))
1434 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
1438 hmmc->State = HAL_MMC_STATE_BUSY;
1441 if(((hmmc->MmcCard.Class) & SDIO_CCCC_ERASE) == 0U)
1444 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
1445 hmmc->ErrorCode |= HAL_MMC_ERROR_REQUEST_NOT_APPLICABLE;
1446 hmmc->State = HAL_MMC_STATE_READY;
1450 if((
SDIO_GetResponse(hmmc->Instance, SDIO_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
1453 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
1454 hmmc->ErrorCode |= HAL_MMC_ERROR_LOCK_UNLOCK_FAILED;
1455 hmmc->State = HAL_MMC_STATE_READY;
1459 if ((hmmc->MmcCard.CardType) != MMC_HIGH_CAPACITY_CARD)
1467 if(errorstate != HAL_MMC_ERROR_NONE)
1470 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
1471 hmmc->ErrorCode |= errorstate;
1472 hmmc->State = HAL_MMC_STATE_READY;
1478 if(errorstate != HAL_MMC_ERROR_NONE)
1481 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
1482 hmmc->ErrorCode |= errorstate;
1483 hmmc->State = HAL_MMC_STATE_READY;
1489 if(errorstate != HAL_MMC_ERROR_NONE)
1492 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
1493 hmmc->ErrorCode |= errorstate;
1494 hmmc->State = HAL_MMC_STATE_READY;
1498 hmmc->State = HAL_MMC_STATE_READY;
1515 uint32_t errorstate;
1516 uint32_t context = hmmc->Context;
1519 if((__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXFIFOHF) != RESET) && ((context & MMC_CONTEXT_IT) != 0U))
1524 else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DATAEND) != RESET)
1526 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_FLAG_DATAEND);
1528 #if defined(SDIO_STA_STBITERR)
1529 __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
1530 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR | SDIO_IT_STBITERR);
1532 __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT |\
1533 SDIO_IT_TXUNDERR | SDIO_IT_RXOVERR | SDIO_IT_TXFIFOHE |\
1537 hmmc->Instance->DCTRL &= ~(SDIO_DCTRL_DTEN);
1539 if((context & MMC_CONTEXT_DMA) != 0U)
1541 if((context & MMC_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U)
1544 if(errorstate != HAL_MMC_ERROR_NONE)
1546 hmmc->ErrorCode |= errorstate;
1547 #if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1548 hmmc->ErrorCallback(hmmc);
1554 if(((context & MMC_CONTEXT_READ_SINGLE_BLOCK) == 0U) && ((context & MMC_CONTEXT_READ_MULTIPLE_BLOCK) == 0U))
1558 hmmc->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
1560 hmmc->State = HAL_MMC_STATE_READY;
1562 #if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1563 hmmc->TxCpltCallback(hmmc);
1569 else if((context & MMC_CONTEXT_IT) != 0U)
1572 if(((context & MMC_CONTEXT_READ_MULTIPLE_BLOCK) != 0U) || ((context & MMC_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
1575 if(errorstate != HAL_MMC_ERROR_NONE)
1577 hmmc->ErrorCode |= errorstate;
1578 #if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1579 hmmc->ErrorCallback(hmmc);
1587 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_DATA_FLAGS);
1589 hmmc->State = HAL_MMC_STATE_READY;
1590 if(((context & MMC_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & MMC_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
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);
1613 else if((__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_TXFIFOHE) != RESET) && ((context & MMC_CONTEXT_IT) != 0U))
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)
1625 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DCRCFAIL) != RESET)
1627 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_CRC_FAIL;
1629 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DTIMEOUT) != RESET)
1631 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT;
1633 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXOVERR) != RESET)
1635 hmmc->ErrorCode |= HAL_MMC_ERROR_RX_OVERRUN;
1637 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_TXUNDERR) != RESET)
1639 hmmc->ErrorCode |= HAL_MMC_ERROR_TX_UNDERRUN;
1641 #if defined(SDIO_STA_STBITERR)
1642 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_STBITERR) != RESET)
1644 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT;
1648 #if defined(SDIO_STA_STBITERR)
1650 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_DATA_FLAGS | SDIO_FLAG_STBITERR);
1653 __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
1654 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR | SDIO_IT_STBITERR);
1657 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_DATA_FLAGS);
1660 __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
1661 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
1666 if((context & MMC_CONTEXT_IT) != 0U)
1669 hmmc->State = HAL_MMC_STATE_READY;
1670 #if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1671 hmmc->ErrorCallback(hmmc);
1676 else if((context & MMC_CONTEXT_DMA) != 0U)
1679 if(hmmc->hdmatx != NULL)
1682 hmmc->hdmatx->XferAbortCallback = MMC_DMATxAbort;
1686 MMC_DMATxAbort(hmmc->hdmatx);
1689 else if(hmmc->hdmarx != NULL)
1692 hmmc->hdmarx->XferAbortCallback = MMC_DMARxAbort;
1696 MMC_DMARxAbort(hmmc->hdmarx);
1701 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
1702 hmmc->State = HAL_MMC_STATE_READY;
1703 #if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1704 hmmc->AbortCpltCallback(hmmc);
1740 return hmmc->ErrorCode;
1803 #if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1821 HAL_StatusTypeDef status = HAL_OK;
1823 if(pCallback == NULL)
1826 hmmc->ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
1833 if(hmmc->State == HAL_MMC_STATE_READY)
1838 hmmc->TxCpltCallback = pCallback;
1841 hmmc->RxCpltCallback = pCallback;
1844 hmmc->ErrorCallback = pCallback;
1847 hmmc->AbortCpltCallback = pCallback;
1850 hmmc->MspInitCallback = pCallback;
1853 hmmc->MspDeInitCallback = pCallback;
1857 hmmc->ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
1863 else if (hmmc->State == HAL_MMC_STATE_RESET)
1868 hmmc->MspInitCallback = pCallback;
1871 hmmc->MspDeInitCallback = pCallback;
1875 hmmc->ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
1884 hmmc->ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
1910 HAL_StatusTypeDef status = HAL_OK;
1915 if(hmmc->State == HAL_MMC_STATE_READY)
1939 hmmc->ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
1945 else if (hmmc->State == HAL_MMC_STATE_RESET)
1957 hmmc->ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
1966 hmmc->ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
2006 pCID->
ManufacturerID = (uint8_t)((hmmc->CID[0] & 0xFF000000U) >> 24U);
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);
2020 pCID->
ManufactDate = (uint16_t)((hmmc->CID[3] & 0x000FFF00U) >> 8U);
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);
2043 pCSD->
SysSpecVersion = (uint8_t)((hmmc->CSD[0] & 0x3C000000U) >> 26U);
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);
2051 pCSD->
MaxBusClkFrec = (uint8_t)(hmmc->CSD[0] & 0x000000FFU);
2053 pCSD->
CardComdClasses = (uint16_t)((hmmc->CSD[1] & 0xFFF00000U) >> 20U);
2055 pCSD->
RdBlockLen = (uint8_t)((hmmc->CSD[1] & 0x000F0000U) >> 16U);
2057 pCSD->
PartBlockRead = (uint8_t)((hmmc->CSD[1] & 0x00008000U) >> 15U);
2059 pCSD->
WrBlockMisalign = (uint8_t)((hmmc->CSD[1] & 0x00004000U) >> 14U);
2061 pCSD->
RdBlockMisalign = (uint8_t)((hmmc->CSD[1] & 0x00002000U) >> 13U);
2063 pCSD->
DSRImpl = (uint8_t)((hmmc->CSD[1] & 0x00001000U) >> 12U);
2067 pCSD->
DeviceSize = (((hmmc->CSD[1] & 0x000003FFU) << 2U) | ((hmmc->CSD[2] & 0xC0000000U) >> 30U));
2077 pCSD->
DeviceSizeMul = (uint8_t)((hmmc->CSD[2] & 0x00038000U) >> 15U);
2079 if(MMC_ReadExtCSD(hmmc, &block_nbr, 212, 0x0FFFFFFFU) != HAL_OK)
2084 if(hmmc->MmcCard.CardType == MMC_LOW_CAPACITY_CARD)
2086 hmmc->MmcCard.BlockNbr = (pCSD->
DeviceSize + 1U) ;
2087 hmmc->MmcCard.BlockNbr *= (1UL << ((pCSD->
DeviceSizeMul & 0x07U) + 2U));
2088 hmmc->MmcCard.BlockSize = (1UL << (pCSD->
RdBlockLen & 0x0FU));
2089 hmmc->MmcCard.LogBlockNbr = (hmmc->MmcCard.BlockNbr) * ((hmmc->MmcCard.BlockSize) / 512U);
2090 hmmc->MmcCard.LogBlockSize = 512U;
2092 else if(hmmc->MmcCard.CardType == MMC_HIGH_CAPACITY_CARD)
2094 hmmc->MmcCard.BlockNbr = block_nbr;
2095 hmmc->MmcCard.LogBlockNbr = hmmc->MmcCard.BlockNbr;
2096 hmmc->MmcCard.BlockSize = 512U;
2097 hmmc->MmcCard.LogBlockSize = hmmc->MmcCard.BlockSize;
2102 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
2103 hmmc->ErrorCode |= HAL_MMC_ERROR_UNSUPPORTED_FEATURE;
2104 hmmc->State = HAL_MMC_STATE_READY;
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);
2120 pCSD->
MaxWrBlockLen= (uint8_t)((hmmc->CSD[3] & 0x03C00000U) >> 22U);
2128 pCSD->
FileFormatGroup = (uint8_t)((hmmc->CSD[3] & 0x00008000U) >> 15U);
2130 pCSD->
CopyFlag = (uint8_t)((hmmc->CSD[3] & 0x00004000U) >> 14U);
2132 pCSD->
PermWrProtect = (uint8_t)((hmmc->CSD[3] & 0x00002000U) >> 13U);
2134 pCSD->
TempWrProtect = (uint8_t)((hmmc->CSD[3] & 0x00001000U) >> 12U);
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);
2156 pCardInfo->
CardType = (uint32_t)(hmmc->MmcCard.CardType);
2157 pCardInfo->
Class = (uint32_t)(hmmc->MmcCard.Class);
2158 pCardInfo->
RelCardAdd = (uint32_t)(hmmc->MmcCard.RelCardAdd);
2159 pCardInfo->
BlockNbr = (uint32_t)(hmmc->MmcCard.BlockNbr);
2160 pCardInfo->
BlockSize = (uint32_t)(hmmc->MmcCard.BlockSize);
2161 pCardInfo->
LogBlockNbr = (uint32_t)(hmmc->MmcCard.LogBlockNbr);
2162 pCardInfo->
LogBlockSize = (uint32_t)(hmmc->MmcCard.LogBlockSize);
2179 uint32_t errorstate;
2186 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
2190 if(hmmc->State == HAL_MMC_STATE_READY)
2192 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
2194 hmmc->State = HAL_MMC_STATE_BUSY;
2197 hmmc->Instance->DCTRL = 0;
2208 config.
DPSM = SDIO_DPSM_ENABLE;
2213 if(errorstate != HAL_MMC_ERROR_NONE)
2216 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
2217 hmmc->ErrorCode |= errorstate;
2218 hmmc->State = HAL_MMC_STATE_READY;
2223 while(!__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND))
2225 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXFIFOHF))
2228 for(count = 0U; count < 8U; count++)
2235 if(((
HAL_GetTick()-tickstart) >= Timeout) || (Timeout == 0U))
2238 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
2239 hmmc->ErrorCode |= HAL_MMC_ERROR_TIMEOUT;
2240 hmmc->State= HAL_MMC_STATE_READY;
2246 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DTIMEOUT))
2249 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
2250 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT;
2251 hmmc->State = HAL_MMC_STATE_READY;
2254 else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DCRCFAIL))
2257 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
2258 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_CRC_FAIL;
2259 hmmc->State = HAL_MMC_STATE_READY;
2262 else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXOVERR))
2265 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
2266 hmmc->ErrorCode |= HAL_MMC_ERROR_RX_OVERRUN;
2267 hmmc->State = HAL_MMC_STATE_READY;
2276 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_DATA_FLAGS);
2277 hmmc->State = HAL_MMC_STATE_READY;
2297 SDIO_InitTypeDef Init;
2298 uint32_t errorstate;
2299 uint32_t response = 0U;
2302 assert_param(IS_SDIO_BUS_WIDE(WideMode));
2305 hmmc->State = HAL_MMC_STATE_BUSY;
2307 errorstate = MMC_PwrClassUpdate(hmmc, WideMode);
2309 if(errorstate == HAL_MMC_ERROR_NONE)
2311 if(WideMode == SDIO_BUS_WIDE_8B)
2315 else if(WideMode == SDIO_BUS_WIDE_4B)
2319 else if(WideMode == SDIO_BUS_WIDE_1B)
2326 errorstate = HAL_MMC_ERROR_PARAM;
2330 if(errorstate == HAL_MMC_ERROR_NONE)
2333 count = SDMMC_MAX_TRIAL;
2336 errorstate =
SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U));
2337 if(errorstate != HAL_MMC_ERROR_NONE)
2345 }
while(((response & 0x100U) == 0U) && (count != 0U));
2348 if ((count != 0U) && (errorstate == HAL_MMC_ERROR_NONE))
2351 if ((response & 0x80U) != 0U)
2353 errorstate = SDMMC_ERROR_GENERAL_UNKNOWN_ERR;
2359 Init.BusWide = WideMode;
2363 else if (count == 0U)
2365 errorstate = SDMMC_ERROR_TIMEOUT;
2375 hmmc->State = HAL_MMC_STATE_READY;
2377 if(errorstate != HAL_MMC_ERROR_NONE)
2380 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
2381 hmmc->ErrorCode |= errorstate;
2396 uint32_t errorstate;
2397 uint32_t resp1 = 0U;
2399 errorstate = MMC_SendStatus(hmmc, &resp1);
2400 if(errorstate != HAL_MMC_ERROR_NONE)
2402 hmmc->ErrorCode |= errorstate;
2405 cardstate = ((resp1 >> 9U) & 0x0FU);
2407 return (HAL_MMC_CardStateTypeDef)cardstate;
2418 HAL_MMC_CardStateTypeDef CardState;
2421 __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
2422 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
2425 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_DATA_FLAGS);
2427 if((hmmc->hdmatx != NULL) || (hmmc->hdmarx != NULL))
2430 hmmc->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
2433 if(hmmc->hdmatx != NULL)
2437 hmmc->ErrorCode |= HAL_MMC_ERROR_DMA;
2441 if(hmmc->hdmarx != NULL)
2445 hmmc->ErrorCode |= HAL_MMC_ERROR_DMA;
2450 hmmc->State = HAL_MMC_STATE_READY;
2453 hmmc->Context = MMC_CONTEXT_NONE;
2456 if((CardState == HAL_MMC_CARD_RECEIVING) || (CardState == HAL_MMC_CARD_SENDING))
2460 if(hmmc->ErrorCode != HAL_MMC_ERROR_NONE)
2475 HAL_MMC_CardStateTypeDef CardState;
2478 __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
2479 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
2482 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_DATA_FLAGS);
2484 if((hmmc->hdmatx != NULL) || (hmmc->hdmarx != NULL))
2487 hmmc->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
2490 if(hmmc->hdmatx != NULL)
2492 hmmc->hdmatx->XferAbortCallback = MMC_DMATxAbort;
2495 hmmc->hdmatx = NULL;
2499 if(hmmc->hdmarx != NULL)
2501 hmmc->hdmarx->XferAbortCallback = MMC_DMARxAbort;
2504 hmmc->hdmarx = NULL;
2510 if((hmmc->hdmatx == NULL) && (hmmc->hdmarx == NULL))
2513 hmmc->State = HAL_MMC_STATE_READY;
2515 if((CardState == HAL_MMC_CARD_RECEIVING) || (CardState == HAL_MMC_CARD_SENDING))
2519 if(hmmc->ErrorCode != HAL_MMC_ERROR_NONE)
2525 #if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
2526 hmmc->AbortCpltCallback(hmmc);
2559 __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DATAEND));
2570 uint32_t errorstate;
2573 if(hmmc->Context == (MMC_CONTEXT_READ_MULTIPLE_BLOCK | MMC_CONTEXT_DMA))
2576 if(errorstate != HAL_MMC_ERROR_NONE)
2578 hmmc->ErrorCode |= errorstate;
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);
2592 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_DATA_FLAGS);
2594 hmmc->State = HAL_MMC_STATE_READY;
2596 #if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
2597 hmmc->RxCpltCallback(hmmc);
2611 HAL_MMC_CardStateTypeDef CardState;
2612 uint32_t RxErrorCode, TxErrorCode;
2617 RxErrorCode = hmmc->hdmarx->ErrorCode;
2618 TxErrorCode = hmmc->hdmatx->ErrorCode;
2619 if((RxErrorCode == HAL_DMA_ERROR_TE) || (TxErrorCode == HAL_DMA_ERROR_TE))
2622 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
2625 __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
2626 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
2628 hmmc->ErrorCode |= HAL_MMC_ERROR_DMA;
2630 if((CardState == HAL_MMC_CARD_RECEIVING) || (CardState == HAL_MMC_CARD_SENDING))
2635 hmmc->State= HAL_MMC_STATE_READY;
2638 #if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
2639 hmmc->ErrorCallback(hmmc);
2654 HAL_MMC_CardStateTypeDef CardState;
2656 if(hmmc->hdmatx != NULL)
2658 hmmc->hdmatx = NULL;
2662 if(hmmc->hdmarx == NULL)
2665 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
2666 hmmc->State = HAL_MMC_STATE_READY;
2667 if((CardState == HAL_MMC_CARD_RECEIVING) || (CardState == HAL_MMC_CARD_SENDING))
2671 if(hmmc->ErrorCode != HAL_MMC_ERROR_NONE)
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);
2699 HAL_MMC_CardStateTypeDef CardState;
2701 if(hmmc->hdmarx != NULL)
2703 hmmc->hdmarx = NULL;
2707 if(hmmc->hdmatx == NULL)
2710 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
2711 hmmc->State = HAL_MMC_STATE_READY;
2712 if((CardState == HAL_MMC_CARD_RECEIVING) || (CardState == HAL_MMC_CARD_SENDING))
2716 if(hmmc->ErrorCode != HAL_MMC_ERROR_NONE)
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;
2746 MMC_InitTypeDef Init;
2752 return HAL_MMC_ERROR_REQUEST_NOT_APPLICABLE;
2757 if(errorstate != HAL_MMC_ERROR_NONE)
2773 if(errorstate != HAL_MMC_ERROR_NONE)
2779 hmmc->MmcCard.RelCardAdd = mmc_rca;
2782 errorstate =
SDMMC_CmdSendCSD(hmmc->Instance, (uint32_t)(hmmc->MmcCard.RelCardAdd << 16U));
2783 if(errorstate != HAL_MMC_ERROR_NONE)
2797 hmmc->MmcCard.Class = (
SDIO_GetResponse(hmmc->Instance, SDIO_RESP2) >> 20U);
2800 errorstate =
SDMMC_CmdSelDesel(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U));
2801 if(errorstate != HAL_MMC_ERROR_NONE)
2809 return hmmc->ErrorCode;
2813 errorstate =
SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U));
2814 if(errorstate != HAL_MMC_ERROR_NONE)
2816 hmmc->ErrorCode |= errorstate;
2822 return hmmc->ErrorCode;
2826 errorstate =
SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U));
2827 if(errorstate != HAL_MMC_ERROR_NONE)
2829 hmmc->ErrorCode |= errorstate;
2834 Init.BusWide = SDIO_BUS_WIDE_1B;
2838 return HAL_MMC_ERROR_NONE;
2850 __IO uint32_t count = 0U;
2851 uint32_t response = 0U, validvoltage = 0U;
2852 uint32_t errorstate;
2856 if(errorstate != HAL_MMC_ERROR_NONE)
2861 while(validvoltage == 0U)
2863 if(count++ == SDMMC_MAX_VOLT_TRIAL)
2865 return HAL_MMC_ERROR_INVALID_VOLTRANGE;
2870 if(errorstate != HAL_MMC_ERROR_NONE)
2872 return HAL_MMC_ERROR_UNSUPPORTED_FEATURE;
2879 validvoltage = (((response >> 31U) == 1U) ? 1U : 0U);
2883 if (((response & (0xFF000000U)) >> 24U) == 0xC0U)
2885 hmmc->MmcCard.CardType = MMC_HIGH_CAPACITY_CARD;
2889 hmmc->MmcCard.CardType = MMC_LOW_CAPACITY_CARD;
2892 return HAL_MMC_ERROR_NONE;
2915 uint32_t errorstate;
2917 if(pCardStatus == NULL)
2919 return HAL_MMC_ERROR_PARAM;
2923 errorstate =
SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(hmmc->MmcCard.RelCardAdd << 16U));
2924 if(errorstate != HAL_MMC_ERROR_NONE)
2932 return HAL_MMC_ERROR_NONE;
2943 static uint32_t MMC_ReadExtCSD(
MMC_HandleTypeDef *hmmc, uint32_t *pFieldData, uint16_t FieldIndex, uint32_t Timeout)
2946 uint32_t errorstate;
2952 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
2955 hmmc->Instance->DCTRL = 0;
2963 config.
DPSM = SDIO_DPSM_ENABLE;
2968 if(errorstate != HAL_MMC_ERROR_NONE)
2971 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
2972 hmmc->ErrorCode |= errorstate;
2973 hmmc->State = HAL_MMC_STATE_READY;
2978 while(!__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND))
2980 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXFIFOHF))
2983 for(count = 0U; count < 8U; count++)
2988 if ((i + count) == ((uint32_t)FieldIndex/4U))
2990 *pFieldData = tmp_data;
2996 if(((
HAL_GetTick()-tickstart) >= Timeout) || (Timeout == 0U))
2999 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
3000 hmmc->ErrorCode |= HAL_MMC_ERROR_TIMEOUT;
3001 hmmc->State= HAL_MMC_STATE_READY;
3007 errorstate =
SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16));
3008 if(errorstate != HAL_MMC_ERROR_NONE)
3010 hmmc->ErrorCode |= errorstate;
3014 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_DATA_FLAGS);
3016 hmmc->State = HAL_MMC_STATE_READY;
3030 uint32_t count, data, dataremaining;
3033 tmp = hmmc->pRxBuffPtr;
3034 dataremaining = hmmc->RxXferSize;
3036 if (dataremaining > 0U)
3039 for(count = 0U; count < 8U; count++)
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);
3056 hmmc->pRxBuffPtr = tmp;
3057 hmmc->RxXferSize = dataremaining;
3069 uint32_t count, data, dataremaining;
3072 tmp = hmmc->pTxBuffPtr;
3073 dataremaining = hmmc->TxXferSize;
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);
3095 hmmc->pTxBuffPtr = tmp;
3096 hmmc->TxXferSize = dataremaining;
3110 uint32_t response = 0U;
3111 uint32_t errorstate = HAL_MMC_ERROR_NONE;
3112 uint32_t power_class, supported_pwr_class;
3114 if((Wide == SDIO_BUS_WIDE_8B) || (Wide == SDIO_BUS_WIDE_4B))
3119 if(MMC_ReadExtCSD(hmmc, &power_class, 187, SDMMC_DATATIMEOUT) != HAL_OK)
3121 errorstate = SDMMC_ERROR_GENERAL_UNKNOWN_ERR;
3125 power_class = ((power_class >> 24U) & 0x000000FFU);
3130 supported_pwr_class = ((hmmc->Ext_CSD[(MMC_EXT_CSD_PWR_CL_26_INDEX/4)] >> MMC_EXT_CSD_PWR_CL_26_POS) & 0x000000FFU);
3132 if(errorstate == HAL_MMC_ERROR_NONE)
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)));
3145 if(errorstate == HAL_MMC_ERROR_NONE)
3148 count = SDMMC_MAX_TRIAL;
3151 errorstate =
SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U));
3152 if(errorstate != HAL_MMC_ERROR_NONE)
3160 }
while(((response & 0x100U) == 0U) && (count != 0U));
3163 if ((count != 0U) && (errorstate == HAL_MMC_ERROR_NONE))
3166 if ((response & 0x80U) != 0U)
3168 errorstate = SDMMC_ERROR_UNSUPPORTED_FEATURE;
3171 else if (count == 0U)
3173 errorstate = SDMMC_ERROR_TIMEOUT;
ADC handle Structure definition.
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.
HAL_StatusTypeDef SDIO_Init(SDIO_TypeDef *SDIOx, SDIO_InitTypeDef Init)
Initializes the SDMMC according to the specified parameters in the SDMMC_InitTypeDef and create the a...
uint32_t SDIO_ReadFIFO(SDIO_TypeDef *SDIOx)
Read data (word) from Rx FIFO in blocking mode (polling)
HAL_StatusTypeDef SDIO_WriteFIFO(SDIO_TypeDef *SDIOx, uint32_t *pWriteData)
Write data (word) to Tx FIFO in blocking mode (polling)
HAL_StatusTypeDef SDIO_PowerState_OFF(SDIO_TypeDef *SDIOx)
Set SDMMC Power state to OFF.
uint32_t SDIO_GetPowerState(SDIO_TypeDef *SDIOx)
Get SDMMC Power state.
HAL_StatusTypeDef SDIO_PowerState_ON(SDIO_TypeDef *SDIOx)
Set SDMMC Power state to ON.
HAL_StatusTypeDef SDIO_ConfigData(SDIO_TypeDef *SDIOx, SDIO_DataInitTypeDef *Data)
Configure the SDMMC data path according to the specified parameters in the SDIO_DataInitTypeDef.
uint32_t SDIO_GetResponse(SDIO_TypeDef *SDIOx, uint32_t Response)
Return the response received from the card for the last command.
uint32_t SDMMC_CmdSwitch(SDIO_TypeDef *SDIOx, uint32_t Argument)
Checks switchable function and switch card function. SDMMC_CMD_HS_SWITCH command.
uint32_t SDMMC_CmdSelDesel(SDIO_TypeDef *SDIOx, uint64_t Addr)
Send the Select Deselect command and check the response.
uint32_t SDMMC_CmdBlockLength(SDIO_TypeDef *SDIOx, uint32_t BlockSize)
Send the Data Block Length command and check the response.
uint32_t SDMMC_CmdWriteSingleBlock(SDIO_TypeDef *SDIOx, uint32_t WriteAdd)
Send the Write Single Block command and check the response.
uint32_t SDMMC_CmdEraseStartAdd(SDIO_TypeDef *SDIOx, uint32_t StartAdd)
Send the Start Address Erase command and check the response.
uint32_t SDMMC_CmdGoIdleState(SDIO_TypeDef *SDIOx)
Send the Go Idle State command and check the response.
uint32_t SDMMC_CmdSetRelAddMmc(SDIO_TypeDef *SDIOx, uint16_t RCA)
Send the Set Relative Address command to MMC card (not SD card).
uint32_t SDMMC_CmdWriteMultiBlock(SDIO_TypeDef *SDIOx, uint32_t WriteAdd)
Send the Write Multi Block command and check the response.
uint32_t SDMMC_CmdErase(SDIO_TypeDef *SDIOx)
Send the Erase command and check the response.
uint32_t SDMMC_CmdEraseEndAdd(SDIO_TypeDef *SDIOx, uint32_t EndAdd)
Send the End Address Erase command and check the response.
uint32_t SDMMC_CmdStopTransfer(SDIO_TypeDef *SDIOx)
Send the Stop Transfer command and check the response.
uint32_t SDMMC_CmdSendEXTCSD(SDIO_TypeDef *SDIOx, uint32_t Argument)
Send the Send EXT_CSD command and check the response.
uint32_t SDMMC_CmdSendCSD(SDIO_TypeDef *SDIOx, uint32_t Argument)
Send the Send CSD command and check the response.
uint32_t SDMMC_CmdReadMultiBlock(SDIO_TypeDef *SDIOx, uint32_t ReadAdd)
Send the Read Multi Block command and check the response.
uint32_t SDMMC_CmdOpCondition(SDIO_TypeDef *SDIOx, uint32_t Argument)
Sends host capacity support information and activates the card's initialization process....
uint32_t SDMMC_CmdSendCID(SDIO_TypeDef *SDIOx)
Send the Send CID command and check the response.
uint32_t SDMMC_CmdReadSingleBlock(SDIO_TypeDef *SDIOx, uint32_t ReadAdd)
Send the Read Single Block command and check the response.
uint32_t SDMMC_CmdSendStatus(SDIO_TypeDef *SDIOx, uint32_t Argument)
Send the Status command and check the response.
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_RegisterCallback(MMC_HandleTypeDef *hmmc, HAL_MMC_CallbackIDTypeDef CallbackId, pMMC_CallbackTypeDef pCallback)
Register a User MMC Callback To be used instead of the weak (surcharged) predefined callback.
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...
HAL_StatusTypeDef HAL_MMC_UnRegisterCallback(MMC_HandleTypeDef *hmmc, HAL_MMC_CallbackIDTypeDef CallbackId)
Unregister a User MMC Callback MMC Callback is redirected to the weak (surcharged) predefined callbac...
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.
struct __MMC_HandleTypeDef else typedef struct endif MMC_HandleTypeDef
MMC handle Structure definition.
MMC Card Information Structure definition.
__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
__IO uint16_t OEM_AppliID
__IO uint8_t ManufacturerID
__IO uint16_t ManufactDate
HAL_MMC_CallbackIDTypeDef
@ HAL_MMC_MSP_DEINIT_CB_ID
This file contains all the functions prototypes for the HAL module driver.
SDMMC Data Control structure.
DMA handle Structure definition.