271#ifdef HAL_SD_MODULE_ENABLED
356#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
363 if(hsd->MspInitCallback == NULL)
369 hsd->MspInitCallback(hsd);
410 Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
411 Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
412 Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
413 Init.BusWide = SDIO_BUS_WIDE_1B;
414 Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
415 Init.ClockDiv = SDIO_INIT_CLK_DIV;
418 status = SDIO_Init(hsd->
Instance, Init);
428 (void)SDIO_PowerState_ON(hsd->
Instance);
489#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
490 if(hsd->MspDeInitCallback == NULL)
496 hsd->MspDeInitCallback(hsd);
572 SDIO_DataInitTypeDef config;
575 uint32_t count, data, dataremaining;
576 uint32_t add = BlockAdd;
577 uint8_t *tempbuff = pData;
606 config.DataTimeOut = SDMMC_DATATIMEOUT;
607 config.DataLength = NumberOfBlocks *
BLOCKSIZE;
608 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
609 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
610 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
611 config.DPSM = SDIO_DPSM_ENABLE;
612 (void)SDIO_ConfigData(hsd->
Instance, &config);
615 if(NumberOfBlocks > 1U)
620 errorstate = SDMMC_CmdReadMultiBlock(hsd->
Instance, add);
627 errorstate = SDMMC_CmdReadSingleBlock(hsd->
Instance, add);
640 dataremaining = config.DataLength;
641#if defined(SDIO_STA_STBITERR)
642 while(!
__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_FLAG_STBITERR))
644 while(!
__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND))
650 for(count = 0U; count < 8U; count++)
652 data = SDIO_ReadFIFO(hsd->
Instance);
653 *tempbuff = (uint8_t)(data & 0xFFU);
656 *tempbuff = (uint8_t)((data >> 8U) & 0xFFU);
659 *tempbuff = (uint8_t)((data >> 16U) & 0xFFU);
662 *tempbuff = (uint8_t)((data >> 24U) & 0xFFU);
668 if(((
HAL_GetTick()-tickstart) >= Timeout) || (Timeout == 0U))
685 errorstate = SDMMC_CmdStopTransfer(hsd->
Instance);
699#if defined(SDIO_STA_STBITERR)
738 data = SDIO_ReadFIFO(hsd->
Instance);
739 *tempbuff = (uint8_t)(data & 0xFFU);
742 *tempbuff = (uint8_t)((data >> 8U) & 0xFFU);
745 *tempbuff = (uint8_t)((data >> 16U) & 0xFFU);
748 *tempbuff = (uint8_t)((data >> 24U) & 0xFFU);
752 if(((
HAL_GetTick()-tickstart) >= Timeout) || (Timeout == 0U))
791 SDIO_DataInitTypeDef config;
794 uint32_t count, data, dataremaining;
795 uint32_t add = BlockAdd;
796 uint8_t *tempbuff = pData;
825 config.DataTimeOut = SDMMC_DATATIMEOUT;
826 config.DataLength = NumberOfBlocks *
BLOCKSIZE;
827 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
828 config.TransferDir = SDIO_TRANSFER_DIR_TO_CARD;
829 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
830 config.DPSM = SDIO_DPSM_ENABLE;
831 (void)SDIO_ConfigData(hsd->
Instance, &config);
834 if(NumberOfBlocks > 1U)
839 errorstate = SDMMC_CmdWriteMultiBlock(hsd->
Instance, add);
846 errorstate = SDMMC_CmdWriteSingleBlock(hsd->
Instance, add);
859 dataremaining = config.DataLength;
860#if defined(SDIO_STA_STBITERR)
861 while(!
__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_FLAG_STBITERR))
863 while(!
__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND))
869 for(count = 0U; count < 8U; count++)
871 data = (uint32_t)(*tempbuff);
874 data |= ((uint32_t)(*tempbuff) << 8U);
877 data |= ((uint32_t)(*tempbuff) << 16U);
880 data |= ((uint32_t)(*tempbuff) << 24U);
883 (void)SDIO_WriteFIFO(hsd->
Instance, &data);
887 if(((
HAL_GetTick()-tickstart) >= Timeout) || (Timeout == 0U))
904 errorstate = SDMMC_CmdStopTransfer(hsd->
Instance);
918#if defined(SDIO_STA_STBITERR)
983 SDIO_DataInitTypeDef config;
985 uint32_t add = BlockAdd;
1011#if defined(SDIO_STA_STBITERR)
1012 __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND | SDIO_FLAG_RXFIFOHF | SDIO_IT_STBITERR));
1014 __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND | SDIO_FLAG_RXFIFOHF));
1023 config.DataTimeOut = SDMMC_DATATIMEOUT;
1024 config.DataLength =
BLOCKSIZE * NumberOfBlocks;
1025 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
1026 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
1027 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
1028 config.DPSM = SDIO_DPSM_ENABLE;
1029 (void)SDIO_ConfigData(hsd->
Instance, &config);
1032 if(NumberOfBlocks > 1U)
1037 errorstate = SDMMC_CmdReadMultiBlock(hsd->
Instance, add);
1044 errorstate = SDMMC_CmdReadSingleBlock(hsd->
Instance, add);
1079 SDIO_DataInitTypeDef config;
1080 uint32_t errorstate;
1081 uint32_t add = BlockAdd;
1108#if defined(SDIO_STA_STBITERR)
1109 __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_DATAEND | SDIO_FLAG_TXFIFOHE | SDIO_IT_STBITERR));
1111 __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_DATAEND | SDIO_FLAG_TXFIFOHE));
1120 if(NumberOfBlocks > 1U)
1125 errorstate = SDMMC_CmdWriteMultiBlock(hsd->
Instance, add);
1132 errorstate = SDMMC_CmdWriteSingleBlock(hsd->
Instance, add);
1145 config.DataTimeOut = SDMMC_DATATIMEOUT;
1146 config.DataLength =
BLOCKSIZE * NumberOfBlocks;
1147 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
1148 config.TransferDir = SDIO_TRANSFER_DIR_TO_CARD;
1149 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
1150 config.DPSM = SDIO_DPSM_ENABLE;
1151 (void)SDIO_ConfigData(hsd->
Instance, &config);
1176 SDIO_DataInitTypeDef config;
1177 uint32_t errorstate;
1178 uint32_t add = BlockAdd;
1201#if defined(SDIO_STA_STBITERR)
1202 __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND | SDIO_IT_STBITERR));
1204 __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND));
1223 __HAL_SD_DISABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND));
1240 config.DataTimeOut = SDMMC_DATATIMEOUT;
1241 config.DataLength =
BLOCKSIZE * NumberOfBlocks;
1242 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
1243 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
1244 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
1245 config.DPSM = SDIO_DPSM_ENABLE;
1246 (void)SDIO_ConfigData(hsd->
Instance, &config);
1249 if(NumberOfBlocks > 1U)
1254 errorstate = SDMMC_CmdReadMultiBlock(hsd->
Instance, add);
1261 errorstate = SDMMC_CmdReadSingleBlock(hsd->
Instance, add);
1297 SDIO_DataInitTypeDef config;
1298 uint32_t errorstate;
1299 uint32_t add = BlockAdd;
1323#if defined(SDIO_STA_STBITERR)
1324 __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_STBITERR));
1344 if(NumberOfBlocks > 1U)
1349 errorstate = SDMMC_CmdWriteMultiBlock(hsd->
Instance, add);
1356 errorstate = SDMMC_CmdWriteSingleBlock(hsd->
Instance, add);
1378#if defined(SDIO_STA_STBITERR)
1379 __HAL_SD_DISABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_STBITERR));
1392 config.DataTimeOut = SDMMC_DATATIMEOUT;
1393 config.DataLength =
BLOCKSIZE * NumberOfBlocks;
1394 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
1395 config.TransferDir = SDIO_TRANSFER_DIR_TO_CARD;
1396 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
1397 config.DPSM = SDIO_DPSM_ENABLE;
1398 (void)SDIO_ConfigData(hsd->
Instance, &config);
1420 uint32_t errorstate;
1421 uint32_t start_add = BlockStartAdd;
1422 uint32_t end_add = BlockEndAdd;
1428 if(end_add < start_add)
1452 if((SDIO_GetResponse(hsd->
Instance, SDIO_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
1472 errorstate = SDMMC_CmdSDEraseStartAdd(hsd->
Instance, start_add);
1483 errorstate = SDMMC_CmdSDEraseEndAdd(hsd->
Instance, end_add);
1495 errorstate = SDMMC_CmdErase(hsd->
Instance);
1522 uint32_t errorstate;
1523 uint32_t context = hsd->
Context;
1535#if defined(SDIO_STA_STBITERR)
1537 SDIO_IT_TXUNDERR | SDIO_IT_RXOVERR | SDIO_IT_TXFIFOHE |\
1538 SDIO_IT_RXFIFOHF | SDIO_IT_STBITERR);
1541 SDIO_IT_TXUNDERR | SDIO_IT_RXOVERR | SDIO_IT_TXFIFOHE |\
1545 hsd->
Instance->DCTRL &= ~(SDIO_DCTRL_DTEN);
1551 errorstate = SDMMC_CmdStopTransfer(hsd->
Instance);
1555#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1556 hsd->ErrorCallback(hsd);
1570#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1571 hsd->RxCpltCallback(hsd);
1578#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1579 hsd->TxCpltCallback(hsd);
1589 errorstate = SDMMC_CmdStopTransfer(hsd->
Instance);
1593#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1594 hsd->ErrorCallback(hsd);
1604 hsd->
Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
1608#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1609 hsd->TxCpltCallback(hsd);
1626#if defined(SDIO_STA_STBITERR)
1627 else if(
__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_RXOVERR | SDIO_FLAG_TXUNDERR | SDIO_FLAG_STBITERR) != RESET)
1629 else if(
__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_RXOVERR | SDIO_FLAG_TXUNDERR) != RESET)
1649#if defined(SDIO_STA_STBITERR)
1656#if defined(SDIO_STA_STBITERR)
1662 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR | SDIO_IT_STBITERR);
1669 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
1679#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1680 hsd->ErrorCallback(hsd);
1713#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1714 hsd->AbortCpltCallback(hsd);
1812#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1832 if(pCallback == NULL)
1835 hsd->
ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1846 case HAL_SD_TX_CPLT_CB_ID :
1847 hsd->TxCpltCallback = pCallback;
1849 case HAL_SD_RX_CPLT_CB_ID :
1850 hsd->RxCpltCallback = pCallback;
1852 case HAL_SD_ERROR_CB_ID :
1853 hsd->ErrorCallback = pCallback;
1855 case HAL_SD_ABORT_CB_ID :
1856 hsd->AbortCpltCallback = pCallback;
1858 case HAL_SD_MSP_INIT_CB_ID :
1859 hsd->MspInitCallback = pCallback;
1861 case HAL_SD_MSP_DEINIT_CB_ID :
1862 hsd->MspDeInitCallback = pCallback;
1866 hsd->
ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1876 case HAL_SD_MSP_INIT_CB_ID :
1877 hsd->MspInitCallback = pCallback;
1879 case HAL_SD_MSP_DEINIT_CB_ID :
1880 hsd->MspDeInitCallback = pCallback;
1884 hsd->
ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1893 hsd->
ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1928 case HAL_SD_TX_CPLT_CB_ID :
1931 case HAL_SD_RX_CPLT_CB_ID :
1934 case HAL_SD_ERROR_CB_ID :
1937 case HAL_SD_ABORT_CB_ID :
1940 case HAL_SD_MSP_INIT_CB_ID :
1943 case HAL_SD_MSP_DEINIT_CB_ID :
1948 hsd->
ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1958 case HAL_SD_MSP_INIT_CB_ID :
1961 case HAL_SD_MSP_DEINIT_CB_ID :
1966 hsd->
ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1975 hsd->
ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
2017 pCID->
OEM_AppliID = (uint16_t)((hsd->
CID[0] & 0x00FFFF00U) >> 8U);
2019 pCID->
ProdName1 = (((hsd->
CID[0] & 0x000000FFU) << 24U) | ((hsd->
CID[1] & 0xFFFFFF00U) >> 8U));
2021 pCID->
ProdName2 = (uint8_t)(hsd->
CID[1] & 0x000000FFU);
2023 pCID->
ProdRev = (uint8_t)((hsd->
CID[2] & 0xFF000000U) >> 24U);
2025 pCID->
ProdSN = (((hsd->
CID[2] & 0x00FFFFFFU) << 8U) | ((hsd->
CID[3] & 0xFF000000U) >> 24U));
2027 pCID->
Reserved1 = (uint8_t)((hsd->
CID[3] & 0x00F00000U) >> 20U);
2031 pCID->
CID_CRC = (uint8_t)((hsd->
CID[3] & 0x000000FEU) >> 1U);
2048 pCSD->
CSDStruct = (uint8_t)((hsd->
CSD[0] & 0xC0000000U) >> 30U);
2052 pCSD->
Reserved1 = (uint8_t)((hsd->
CSD[0] & 0x03000000U) >> 24U);
2054 pCSD->
TAAC = (uint8_t)((hsd->
CSD[0] & 0x00FF0000U) >> 16U);
2056 pCSD->
NSAC = (uint8_t)((hsd->
CSD[0] & 0x0000FF00U) >> 8U);
2062 pCSD->
RdBlockLen = (uint8_t)((hsd->
CSD[1] & 0x000F0000U) >> 16U);
2070 pCSD->
DSRImpl = (uint8_t)((hsd->
CSD[1] & 0x00001000U) >> 12U);
2076 pCSD->
DeviceSize = (((hsd->
CSD[1] & 0x000003FFU) << 2U) | ((hsd->
CSD[2] & 0xC0000000U) >> 30U));
2098 pCSD->
DeviceSize = (((hsd->
CSD[1] & 0x0000003FU) << 16U) | ((hsd->
CSD[2] & 0xFFFF0000U) >> 16U));
2114 pCSD->
EraseGrSize = (uint8_t)((hsd->
CSD[2] & 0x00004000U) >> 14U);
2116 pCSD->
EraseGrMul = (uint8_t)((hsd->
CSD[2] & 0x00003F80U) >> 7U);
2122 pCSD->
ManDeflECC = (uint8_t)((hsd->
CSD[3] & 0x60000000U) >> 29U);
2124 pCSD->
WrSpeedFact = (uint8_t)((hsd->
CSD[3] & 0x1C000000U) >> 26U);
2136 pCSD->
CopyFlag = (uint8_t)((hsd->
CSD[3] & 0x00004000U) >> 14U);
2142 pCSD->
FileFormat = (uint8_t)((hsd->
CSD[3] & 0x00000C00U) >> 10U);
2144 pCSD->
ECC= (uint8_t)((hsd->
CSD[3] & 0x00000300U) >> 8U);
2146 pCSD->
CSD_CRC = (uint8_t)((hsd->
CSD[3] & 0x000000FEU) >> 1U);
2162 uint32_t sd_status[16];
2163 uint32_t errorstate;
2177 pStatus->
DataBusWidth = (uint8_t)((sd_status[0] & 0xC0U) >> 6U);
2179 pStatus->
SecuredMode = (uint8_t)((sd_status[0] & 0x20U) >> 5U);
2181 pStatus->
CardType = (uint16_t)(((sd_status[0] & 0x00FF0000U) >> 8U) | ((sd_status[0] & 0xFF000000U) >> 24U));
2183 pStatus->
ProtectedAreaSize = (((sd_status[1] & 0xFFU) << 24U) | ((sd_status[1] & 0xFF00U) << 8U) |
2184 ((sd_status[1] & 0xFF0000U) >> 8U) | ((sd_status[1] & 0xFF000000U) >> 24U));
2186 pStatus->
SpeedClass = (uint8_t)(sd_status[2] & 0xFFU);
2192 pStatus->
EraseSize = (uint16_t)(((sd_status[2] & 0xFF000000U) >> 16U) | (sd_status[3] & 0xFFU));
2194 pStatus->
EraseTimeout = (uint8_t)((sd_status[3] & 0xFC00U) >> 10U);
2196 pStatus->
EraseOffset = (uint8_t)((sd_status[3] & 0x0300U) >> 8U);
2247 SDIO_InitTypeDef Init;
2248 uint32_t errorstate;
2259 if(WideMode == SDIO_BUS_WIDE_8B)
2263 else if(WideMode == SDIO_BUS_WIDE_4B)
2269 else if(WideMode == SDIO_BUS_WIDE_1B)
2297 Init.ClockEdge = hsd->
Init.ClockEdge;
2298 Init.ClockBypass = hsd->
Init.ClockBypass;
2299 Init.ClockPowerSave = hsd->
Init.ClockPowerSave;
2300 Init.BusWide = WideMode;
2301 Init.HardwareFlowControl = hsd->
Init.HardwareFlowControl;
2302 Init.ClockDiv = hsd->
Init.ClockDiv;
2303 (void)SDIO_Init(hsd->
Instance, Init);
2330 uint32_t errorstate;
2339 cardstate = ((resp1 >> 9U) & 0x0FU);
2353 uint32_t context = hsd->
Context;
2357 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
2362 CLEAR_BIT(hsd->
Instance->DCTRL, SDIO_DCTRL_DTEN);
2367 hsd->
Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
2417 uint32_t context = hsd->
Context;
2421 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
2423 CLEAR_BIT(hsd->
Instance->DCTRL, SDIO_DCTRL_DTEN);
2428 hsd->
Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
2472#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
2473 hsd->AbortCpltCallback(hsd);
2517 uint32_t errorstate;
2522 errorstate = SDMMC_CmdStopTransfer(hsd->
Instance);
2526#if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2527 hsd->ErrorCallback(hsd);
2536 hsd->
Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
2544#if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2545 hsd->RxCpltCallback(hsd);
2560 uint32_t RxErrorCode, TxErrorCode;
2574 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
2587#if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2588 hsd->ErrorCallback(hsd);
2618#if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2619 hsd->AbortCpltCallback(hsd);
2626#if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2627 hsd->ErrorCallback(hsd);
2657#if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2658 hsd->AbortCpltCallback(hsd);
2665#if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2666 hsd->ErrorCallback(hsd);
2681 uint32_t errorstate;
2682 uint16_t sd_rca = 1U;
2685 if(SDIO_GetPowerState(hsd->
Instance) == 0U)
2694 errorstate = SDMMC_CmdSendCID(hsd->
Instance);
2702 hsd->
CID[0U] = SDIO_GetResponse(hsd->
Instance, SDIO_RESP1);
2703 hsd->
CID[1U] = SDIO_GetResponse(hsd->
Instance, SDIO_RESP2);
2704 hsd->
CID[2U] = SDIO_GetResponse(hsd->
Instance, SDIO_RESP3);
2705 hsd->
CID[3U] = SDIO_GetResponse(hsd->
Instance, SDIO_RESP4);
2713 errorstate = SDMMC_CmdSetRelAdd(hsd->
Instance, &sd_rca);
2733 hsd->
CSD[0U] = SDIO_GetResponse(hsd->
Instance, SDIO_RESP1);
2734 hsd->
CSD[1U] = SDIO_GetResponse(hsd->
Instance, SDIO_RESP2);
2735 hsd->
CSD[2U] = SDIO_GetResponse(hsd->
Instance, SDIO_RESP3);
2736 hsd->
CSD[3U] = SDIO_GetResponse(hsd->
Instance, SDIO_RESP4);
2772 __IO uint32_t count = 0U;
2773 uint32_t response = 0U, validvoltage = 0U;
2774 uint32_t errorstate;
2777 errorstate = SDMMC_CmdGoIdleState(hsd->
Instance);
2784 errorstate = SDMMC_CmdOperCond(hsd->
Instance);
2789 errorstate = SDMMC_CmdGoIdleState(hsd->
Instance);
2804 errorstate = SDMMC_CmdAppCommand(hsd->
Instance, 0);
2812 while((count < SDMMC_MAX_VOLT_TRIAL) && (validvoltage == 0U))
2815 errorstate = SDMMC_CmdAppCommand(hsd->
Instance, 0);
2822 errorstate = SDMMC_CmdAppOperCommand(hsd->
Instance, SDMMC_VOLTAGE_WINDOW_SD | SDMMC_HIGH_CAPACITY | SD_SWITCH_1_8V_CAPACITY);
2829 response = SDIO_GetResponse(hsd->
Instance, SDIO_RESP1);
2832 validvoltage = (((response >> 31U) == 1U) ? 1U : 0U);
2837 if(count >= SDMMC_MAX_VOLT_TRIAL)
2842 if((response & SDMMC_HIGH_CAPACITY) == SDMMC_HIGH_CAPACITY)
2863 (void)SDIO_PowerState_OFF(hsd->
Instance);
2875 SDIO_DataInitTypeDef config;
2876 uint32_t errorstate;
2879 uint32_t *pData = pSDstatus;
2882 if((SDIO_GetResponse(hsd->
Instance, SDIO_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
2888 errorstate = SDMMC_CmdBlockLength(hsd->
Instance, 64U);
2904 config.DataTimeOut = SDMMC_DATATIMEOUT;
2905 config.DataLength = 64U;
2906 config.DataBlockSize = SDIO_DATABLOCK_SIZE_64B;
2907 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
2908 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
2909 config.DPSM = SDIO_DPSM_ENABLE;
2910 (void)SDIO_ConfigData(hsd->
Instance, &config);
2913 errorstate = SDMMC_CmdStatusRegister(hsd->
Instance);
2921 while(!
__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND))
2925 for(count = 0U; count < 8U; count++)
2927 *pData = SDIO_ReadFIFO(hsd->
Instance);
2932 if((
HAL_GetTick() - tickstart) >= SDMMC_SWDATATIMEOUT)
2938#if defined(SDIO_STA_STBITERR)
2961 *pData = SDIO_ReadFIFO(hsd->
Instance);
2964 if((
HAL_GetTick() - tickstart) >= SDMMC_SWDATATIMEOUT)
2985 uint32_t errorstate;
2987 if(pCardStatus == NULL)
3000 *pCardStatus = SDIO_GetResponse(hsd->
Instance, SDIO_RESP1);
3012 uint32_t scr[2U] = {0U, 0U};
3013 uint32_t errorstate;
3015 if((SDIO_GetResponse(hsd->
Instance, SDIO_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
3028 if((scr[1U] & SDMMC_WIDE_BUS_SUPPORT) != SDMMC_ALLZERO)
3038 errorstate = SDMMC_CmdBusWidth(hsd->
Instance, 2U);
3059 uint32_t scr[2U] = {0U, 0U};
3060 uint32_t errorstate;
3062 if((SDIO_GetResponse(hsd->
Instance, SDIO_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
3075 if((scr[1U] & SDMMC_SINGLE_BUS_SUPPORT) != SDMMC_ALLZERO)
3085 errorstate = SDMMC_CmdBusWidth(hsd->
Instance, 0U);
3108 SDIO_DataInitTypeDef config;
3109 uint32_t errorstate;
3111 uint32_t index = 0U;
3112 uint32_t tempscr[2U] = {0U, 0U};
3113 uint32_t *scr = pSCR;
3116 errorstate = SDMMC_CmdBlockLength(hsd->
Instance, 8U);
3129 config.DataTimeOut = SDMMC_DATATIMEOUT;
3130 config.DataLength = 8U;
3131 config.DataBlockSize = SDIO_DATABLOCK_SIZE_8B;
3132 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
3133 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
3134 config.DPSM = SDIO_DPSM_ENABLE;
3135 (void)SDIO_ConfigData(hsd->
Instance, &config);
3138 errorstate = SDMMC_CmdSendSCR(hsd->
Instance);
3144 while(!
__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT))
3148 *(tempscr + index) = SDIO_ReadFIFO(hsd->
Instance);
3156 if((
HAL_GetTick() - tickstart) >= SDMMC_SWDATATIMEOUT)
3162#if defined(SDIO_STA_STBITERR)
3190 *scr = (((tempscr[1] & SDMMC_0TO7BITS) << 24) | ((tempscr[1] & SDMMC_8TO15BITS) << 8) |\
3191 ((tempscr[1] & SDMMC_16TO23BITS) >> 8) | ((tempscr[1] & SDMMC_24TO31BITS) >> 24));
3193 *scr = (((tempscr[0] & SDMMC_0TO7BITS) << 24) | ((tempscr[0] & SDMMC_8TO15BITS) << 8) |\
3194 ((tempscr[0] & SDMMC_16TO23BITS) >> 8) | ((tempscr[0] & SDMMC_24TO31BITS) >> 24));
3209 uint32_t count, data, dataremaining;
3215 if (dataremaining > 0U)
3218 for(count = 0U; count < 8U; count++)
3220 data = SDIO_ReadFIFO(hsd->
Instance);
3221 *tmp = (uint8_t)(data & 0xFFU);
3224 *tmp = (uint8_t)((data >> 8U) & 0xFFU);
3227 *tmp = (uint8_t)((data >> 16U) & 0xFFU);
3230 *tmp = (uint8_t)((data >> 24U) & 0xFFU);
3248 uint32_t count, data, dataremaining;
3254 if (dataremaining > 0U)
3257 for(count = 0U; count < 8U; count++)
3259 data = (uint32_t)(*tmp);
3262 data |= ((uint32_t)(*tmp) << 8U);
3265 data |= ((uint32_t)(*tmp) << 16U);
3268 data |= ((uint32_t)(*tmp) << 24U);
3271 (void)SDIO_WriteFIFO(hsd->
Instance, &data);
#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_SD_ERROR_NONE
#define HAL_SD_ERROR_DATA_CRC_FAIL
#define HAL_SD_ERROR_INVALID_VOLTRANGE
#define HAL_SD_ERROR_BUSY
#define HAL_SD_ERROR_UNSUPPORTED_FEATURE
#define HAL_SD_ERROR_TX_UNDERRUN
#define HAL_SD_ERROR_PARAM
#define HAL_SD_ERROR_LOCK_UNLOCK_FAILED
#define HAL_SD_ERROR_DATA_TIMEOUT
#define HAL_SD_ERROR_ADDR_OUT_OF_RANGE
#define HAL_SD_ERROR_RX_OVERRUN
#define HAL_SD_ERROR_REQUEST_NOT_APPLICABLE
#define HAL_SD_ERROR_TIMEOUT
#define SD_CONTEXT_WRITE_MULTIPLE_BLOCK
#define SD_CONTEXT_READ_SINGLE_BLOCK
#define SD_CONTEXT_READ_MULTIPLE_BLOCK
#define SD_CONTEXT_WRITE_SINGLE_BLOCK
HAL_StatusTypeDef HAL_SD_InitCard(SD_HandleTypeDef *hsd)
Initializes the SD Card.
HAL_StatusTypeDef HAL_SD_DeInit(SD_HandleTypeDef *hsd)
De-Initializes the SD card.
void HAL_SD_MspInit(SD_HandleTypeDef *hsd)
Initializes the SD MSP.
void HAL_SD_MspDeInit(SD_HandleTypeDef *hsd)
De-Initialize SD MSP.
HAL_StatusTypeDef HAL_SD_Init(SD_HandleTypeDef *hsd)
Initializes the SD according to the specified parameters in the SD_HandleTypeDef and create the assoc...
void HAL_SD_ErrorCallback(SD_HandleTypeDef *hsd)
SD error callbacks.
uint32_t HAL_SD_GetError(SD_HandleTypeDef *hsd)
Return the SD error code.
HAL_StatusTypeDef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, 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.
void HAL_SD_AbortCallback(SD_HandleTypeDef *hsd)
SD Abort callbacks.
HAL_StatusTypeDef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, 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.
void HAL_SD_IRQHandler(SD_HandleTypeDef *hsd)
This function handles SD card interrupt request.
HAL_SD_StateTypeDef HAL_SD_GetState(SD_HandleTypeDef *hsd)
return the SD state
HAL_StatusTypeDef HAL_SD_ReadBlocks_IT(SD_HandleTypeDef *hsd, 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_SD_WriteBlocks(SD_HandleTypeDef *hsd, 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_SD_Erase(SD_HandleTypeDef *hsd, uint32_t BlockStartAdd, uint32_t BlockEndAdd)
Erases the specified memory area of the given SD card.
void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)
Tx Transfer completed callbacks.
void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)
Rx Transfer completed callbacks.
HAL_StatusTypeDef HAL_SD_WriteBlocks_IT(SD_HandleTypeDef *hsd, 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.
HAL_StatusTypeDef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, 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.
HAL_SD_CardStateTypeDef HAL_SD_GetCardState(SD_HandleTypeDef *hsd)
Gets the current sd card data state.
HAL_StatusTypeDef HAL_SD_GetCardCID(SD_HandleTypeDef *hsd, HAL_SD_CardCIDTypeDef *pCID)
Returns information the information of the card which are stored on the CID register.
HAL_StatusTypeDef HAL_SD_Abort(SD_HandleTypeDef *hsd)
Abort the current transfer and disable the SD.
HAL_StatusTypeDef HAL_SD_ConfigWideBusOperation(SD_HandleTypeDef *hsd, uint32_t WideMode)
Enables wide bus operation for the requested card if supported by card.
HAL_StatusTypeDef HAL_SD_GetCardStatus(SD_HandleTypeDef *hsd, HAL_SD_CardStatusTypeDef *pStatus)
Gets the SD status info.
HAL_StatusTypeDef HAL_SD_Abort_IT(SD_HandleTypeDef *hsd)
Abort the current transfer and disable the SD (IT mode).
HAL_StatusTypeDef HAL_SD_GetCardInfo(SD_HandleTypeDef *hsd, HAL_SD_CardInfoTypeDef *pCardInfo)
Gets the SD card info.
HAL_StatusTypeDef HAL_SD_GetCardCSD(SD_HandleTypeDef *hsd, HAL_SD_CardCSDTypeDef *pCSD)
Returns information the information of the card which are stored on the CSD register.
uint32_t HAL_SD_CardStateTypeDef
#define HAL_SD_CARD_SENDING
#define HAL_SD_CARD_RECEIVING
#define __HAL_SD_ENABLE(__HANDLE__)
Enable the SD device.
#define __HAL_SD_DISABLE(__HANDLE__)
Disable the SD device.
#define __HAL_SD_CLEAR_FLAG(__HANDLE__, __FLAG__)
Clear the SD's pending flags.
#define __HAL_SD_ENABLE_IT(__HANDLE__, __INTERRUPT__)
Enable the SD device interrupt.
#define __HAL_SD_GET_FLAG(__HANDLE__, __FLAG__)
Check whether the specified SD flag is set or not.
#define __HAL_SD_DMA_ENABLE(__HANDLE__)
Enable the SDMMC DMA transfer.
#define __HAL_SD_DISABLE_IT(__HANDLE__, __INTERRUPT__)
Disable the SD device interrupt.
static void SD_DMAError(DMA_HandleTypeDef *hdma)
DMA SD communication error callback.
static void SD_PowerOFF(SD_HandleTypeDef *hsd)
Turns the SDIO output signals off.
static uint32_t SD_WideBus_Enable(SD_HandleTypeDef *hsd)
Enables the SDIO wide bus mode.
static uint32_t SD_PowerON(SD_HandleTypeDef *hsd)
Enquires cards about their operating voltage and configures clock controls and stores SD information ...
static void SD_DMATxAbort(DMA_HandleTypeDef *hdma)
DMA SD Tx Abort callback.
static uint32_t SD_SendStatus(SD_HandleTypeDef *hsd, uint32_t *pCardStatus)
Returns the current card's status.
static void SD_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
DMA SD receive process complete callback.
static uint32_t SD_SendSDStatus(SD_HandleTypeDef *hsd, uint32_t *pSDstatus)
Send Status info command.
static uint32_t SD_WideBus_Disable(SD_HandleTypeDef *hsd)
Disables the SDIO wide bus mode.
static void SD_Write_IT(SD_HandleTypeDef *hsd)
Wrap up writing in non-blocking mode.
static void SD_DMATransmitCplt(DMA_HandleTypeDef *hdma)
DMA SD transmit process complete callback.
static uint32_t SD_FindSCR(SD_HandleTypeDef *hsd, uint32_t *pSCR)
Finds the SD card SCR register value.
static void SD_Read_IT(SD_HandleTypeDef *hsd)
Wrap up reading in non-blocking mode.
static void SD_DMARxAbort(DMA_HandleTypeDef *hdma)
DMA SD Rx Abort callback.
static uint32_t SD_InitCard(SD_HandleTypeDef *hsd)
Initializes the sd card.
#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 WriteBlockPaPartial
__IO uint8_t MaxRdCurrentVDDMax
__IO uint8_t PartBlockRead
__IO uint8_t WrBlockMisalign
__IO uint8_t WrProtectGrSize
__IO uint8_t MaxWrBlockLen
__IO uint8_t WrProtectGrEnable
__IO uint8_t ContentProtectAppli
__IO uint8_t MaxWrCurrentVDDMax
__IO uint8_t MaxWrCurrentVDDMin
__IO uint8_t TempWrProtect
__IO uint16_t CardComdClasses
__IO uint8_t RdBlockMisalign
__IO uint8_t MaxRdCurrentVDDMin
__IO uint8_t SysSpecVersion
__IO uint8_t MaxBusClkFrec
__IO uint8_t PermWrProtect
__IO uint8_t FileFormatGroup
__IO uint8_t DeviceSizeMul
SD Card Information Structure definition.
__IO uint8_t PerformanceMove
__IO uint8_t EraseTimeout
__IO uint8_t DataBusWidth
__IO uint32_t ProtectedAreaSize
__IO uint8_t AllocationUnitSize
SD handle Structure definition.
DMA_HandleTypeDef * hdmatx
HAL_SD_CardInfoTypeDef SdCard
__IO HAL_SD_StateTypeDef State
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