271#ifdef HAL_SD_MODULE_ENABLED
290static uint32_t SD_InitCard(SD_HandleTypeDef *hsd);
291static uint32_t SD_PowerON(SD_HandleTypeDef *hsd);
292static uint32_t SD_SendSDStatus(SD_HandleTypeDef *hsd, uint32_t *pSDstatus);
293static uint32_t SD_SendStatus(SD_HandleTypeDef *hsd, uint32_t *pCardStatus);
294static uint32_t SD_WideBus_Enable(SD_HandleTypeDef *hsd);
295static uint32_t SD_WideBus_Disable(SD_HandleTypeDef *hsd);
296static uint32_t SD_FindSCR(SD_HandleTypeDef *hsd, uint32_t *pSCR);
297static void SD_PowerOFF(SD_HandleTypeDef *hsd);
298static void SD_Write_IT(SD_HandleTypeDef *hsd);
299static void SD_Read_IT(SD_HandleTypeDef *hsd);
346 assert_param(IS_SDIO_CLOCK_BYPASS(hsd->Init.ClockBypass));
347 assert_param(IS_SDIO_CLOCK_POWER_SAVE(hsd->Init.ClockPowerSave));
349 assert_param(IS_SDIO_HARDWARE_FLOW_CONTROL(hsd->Init.HardwareFlowControl));
352 if(hsd->State == HAL_SD_STATE_RESET)
356#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
358 hsd->TxCpltCallback = HAL_SD_TxCpltCallback;
359 hsd->RxCpltCallback = HAL_SD_RxCpltCallback;
360 hsd->ErrorCallback = HAL_SD_ErrorCallback;
361 hsd->AbortCpltCallback = HAL_SD_AbortCallback;
363 if(hsd->MspInitCallback == NULL)
365 hsd->MspInitCallback = HAL_SD_MspInit;
369 hsd->MspInitCallback(hsd);
376 hsd->State = HAL_SD_STATE_BUSY;
379 if (HAL_SD_InitCard(hsd) !=
HAL_OK)
385 if(HAL_SD_ConfigWideBusOperation(hsd, hsd->Init.BusWide) !=
HAL_OK)
391 hsd->ErrorCode = HAL_SD_ERROR_NONE;
394 hsd->Context = SD_CONTEXT_NONE;
397 hsd->State = HAL_SD_STATE_READY;
415 Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
416 Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
417 Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
418 Init.BusWide = SDIO_BUS_WIDE_1B;
419 Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
420 Init.ClockDiv = SDIO_INIT_CLK_DIV;
423 SDIO_Init(hsd->Instance, Init);
426 __HAL_SD_DISABLE(hsd);
429 (void)SDIO_PowerState_ON(hsd->Instance);
432 __HAL_SD_ENABLE(hsd);
438 errorstate = SD_PowerON(hsd);
439 if(errorstate != HAL_SD_ERROR_NONE)
441 hsd->State = HAL_SD_STATE_READY;
442 hsd->ErrorCode |= errorstate;
447 errorstate = SD_InitCard(hsd);
448 if(errorstate != HAL_SD_ERROR_NONE)
450 hsd->State = HAL_SD_STATE_READY;
451 hsd->ErrorCode |= errorstate;
456 errorstate = SDMMC_CmdBlockLength(hsd->Instance, BLOCKSIZE);
457 if(errorstate != HAL_SD_ERROR_NONE)
460 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
461 hsd->ErrorCode |= errorstate;
462 hsd->State = HAL_SD_STATE_READY;
485 hsd->State = HAL_SD_STATE_BUSY;
490#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
491 if(hsd->MspDeInitCallback == NULL)
493 hsd->MspDeInitCallback = HAL_SD_MspDeInit;
497 hsd->MspDeInitCallback(hsd);
500 HAL_SD_MspDeInit(hsd);
503 hsd->ErrorCode = HAL_SD_ERROR_NONE;
504 hsd->State = HAL_SD_STATE_RESET;
515__weak
void HAL_SD_MspInit(SD_HandleTypeDef *hsd)
530__weak
void HAL_SD_MspDeInit(SD_HandleTypeDef *hsd)
571HAL_StatusTypeDef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout)
573 SDIO_DataInitTypeDef config;
576 uint32_t count, data, dataremaining;
577 uint32_t add = BlockAdd;
578 uint8_t *tempbuff = pData;
582 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
586 if(hsd->State == HAL_SD_STATE_READY)
588 hsd->ErrorCode = HAL_SD_ERROR_NONE;
590 if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
592 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
596 hsd->State = HAL_SD_STATE_BUSY;
599 hsd->Instance->DCTRL = 0U;
601 if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
607 config.DataTimeOut = SDMMC_DATATIMEOUT;
608 config.DataLength = NumberOfBlocks * BLOCKSIZE;
609 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
610 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
611 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
612 config.DPSM = SDIO_DPSM_ENABLE;
613 (void)SDIO_ConfigData(hsd->Instance, &config);
616 if(NumberOfBlocks > 1U)
618 hsd->Context = SD_CONTEXT_READ_MULTIPLE_BLOCK;
621 errorstate = SDMMC_CmdReadMultiBlock(hsd->Instance, add);
625 hsd->Context = SD_CONTEXT_READ_SINGLE_BLOCK;
628 errorstate = SDMMC_CmdReadSingleBlock(hsd->Instance, add);
630 if(errorstate != HAL_SD_ERROR_NONE)
633 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
634 hsd->ErrorCode |= errorstate;
635 hsd->State = HAL_SD_STATE_READY;
636 hsd->Context = SD_CONTEXT_NONE;
641 dataremaining = config.DataLength;
642#if defined(SDIO_STA_STBITERR)
643 while(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_FLAG_STBITERR))
645 while(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND))
648 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF) && (dataremaining > 0U))
651 for(count = 0U; count < 8U; count++)
653 data = SDIO_ReadFIFO(hsd->Instance);
654 *tempbuff = (uint8_t)(data & 0xFFU);
657 *tempbuff = (uint8_t)((data >> 8U) & 0xFFU);
660 *tempbuff = (uint8_t)((data >> 16U) & 0xFFU);
663 *tempbuff = (uint8_t)((data >> 24U) & 0xFFU);
669 if(((
HAL_GetTick()-tickstart) >= Timeout) || (Timeout == 0U))
672 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
673 hsd->ErrorCode |= HAL_SD_ERROR_TIMEOUT;
674 hsd->State= HAL_SD_STATE_READY;
675 hsd->Context = SD_CONTEXT_NONE;
681 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DATAEND) && (NumberOfBlocks > 1U))
683 if(hsd->SdCard.CardType != CARD_SECURED)
686 errorstate = SDMMC_CmdStopTransfer(hsd->Instance);
687 if(errorstate != HAL_SD_ERROR_NONE)
690 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
691 hsd->ErrorCode |= errorstate;
692 hsd->State = HAL_SD_STATE_READY;
693 hsd->Context = SD_CONTEXT_NONE;
700#if defined(SDIO_STA_STBITERR)
701 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT) || (__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_STBITERR)))
703 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT))
707 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
708 hsd->ErrorCode |= HAL_SD_ERROR_DATA_TIMEOUT;
709 hsd->State = HAL_SD_STATE_READY;
710 hsd->Context = SD_CONTEXT_NONE;
713 else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL))
716 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
717 hsd->ErrorCode |= HAL_SD_ERROR_DATA_CRC_FAIL;
718 hsd->State = HAL_SD_STATE_READY;
719 hsd->Context = SD_CONTEXT_NONE;
722 else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR))
725 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
726 hsd->ErrorCode |= HAL_SD_ERROR_RX_OVERRUN;
727 hsd->State = HAL_SD_STATE_READY;
728 hsd->Context = SD_CONTEXT_NONE;
737 while ((__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXDAVL)) && (dataremaining > 0U))
739 data = SDIO_ReadFIFO(hsd->Instance);
740 *tempbuff = (uint8_t)(data & 0xFFU);
743 *tempbuff = (uint8_t)((data >> 8U) & 0xFFU);
746 *tempbuff = (uint8_t)((data >> 16U) & 0xFFU);
749 *tempbuff = (uint8_t)((data >> 24U) & 0xFFU);
753 if(((
HAL_GetTick()-tickstart) >= Timeout) || (Timeout == 0U))
756 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
757 hsd->ErrorCode |= HAL_SD_ERROR_TIMEOUT;
758 hsd->State= HAL_SD_STATE_READY;
759 hsd->Context = SD_CONTEXT_NONE;
765 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
767 hsd->State = HAL_SD_STATE_READY;
773 hsd->ErrorCode |= HAL_SD_ERROR_BUSY;
790HAL_StatusTypeDef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout)
792 SDIO_DataInitTypeDef config;
795 uint32_t count, data, dataremaining;
796 uint32_t add = BlockAdd;
797 uint8_t *tempbuff = pData;
801 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
805 if(hsd->State == HAL_SD_STATE_READY)
807 hsd->ErrorCode = HAL_SD_ERROR_NONE;
809 if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
811 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
815 hsd->State = HAL_SD_STATE_BUSY;
818 hsd->Instance->DCTRL = 0U;
820 if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
826 config.DataTimeOut = SDMMC_DATATIMEOUT;
827 config.DataLength = NumberOfBlocks * BLOCKSIZE;
828 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
829 config.TransferDir = SDIO_TRANSFER_DIR_TO_CARD;
830 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
831 config.DPSM = SDIO_DPSM_ENABLE;
832 (void)SDIO_ConfigData(hsd->Instance, &config);
835 if(NumberOfBlocks > 1U)
837 hsd->Context = SD_CONTEXT_WRITE_MULTIPLE_BLOCK;
840 errorstate = SDMMC_CmdWriteMultiBlock(hsd->Instance, add);
844 hsd->Context = SD_CONTEXT_WRITE_SINGLE_BLOCK;
847 errorstate = SDMMC_CmdWriteSingleBlock(hsd->Instance, add);
849 if(errorstate != HAL_SD_ERROR_NONE)
852 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
853 hsd->ErrorCode |= errorstate;
854 hsd->State = HAL_SD_STATE_READY;
855 hsd->Context = SD_CONTEXT_NONE;
860 dataremaining = config.DataLength;
861#if defined(SDIO_STA_STBITERR)
862 while(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_FLAG_STBITERR))
864 while(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND))
867 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXFIFOHE) && (dataremaining > 0U))
870 for(count = 0U; count < 8U; count++)
872 data = (uint32_t)(*tempbuff);
875 data |= ((uint32_t)(*tempbuff) << 8U);
878 data |= ((uint32_t)(*tempbuff) << 16U);
881 data |= ((uint32_t)(*tempbuff) << 24U);
884 (void)SDIO_WriteFIFO(hsd->Instance, &data);
888 if(((
HAL_GetTick()-tickstart) >= Timeout) || (Timeout == 0U))
891 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
892 hsd->ErrorCode |= errorstate;
893 hsd->State = HAL_SD_STATE_READY;
894 hsd->Context = SD_CONTEXT_NONE;
900 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DATAEND) && (NumberOfBlocks > 1U))
902 if(hsd->SdCard.CardType != CARD_SECURED)
905 errorstate = SDMMC_CmdStopTransfer(hsd->Instance);
906 if(errorstate != HAL_SD_ERROR_NONE)
909 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
910 hsd->ErrorCode |= errorstate;
911 hsd->State = HAL_SD_STATE_READY;
912 hsd->Context = SD_CONTEXT_NONE;
919#if defined(SDIO_STA_STBITERR)
920 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT) || (__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_STBITERR)))
922 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT))
926 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
927 hsd->ErrorCode |= HAL_SD_ERROR_DATA_TIMEOUT;
928 hsd->State = HAL_SD_STATE_READY;
929 hsd->Context = SD_CONTEXT_NONE;
932 else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL))
935 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
936 hsd->ErrorCode |= HAL_SD_ERROR_DATA_CRC_FAIL;
937 hsd->State = HAL_SD_STATE_READY;
938 hsd->Context = SD_CONTEXT_NONE;
941 else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR))
944 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
945 hsd->ErrorCode |= HAL_SD_ERROR_TX_UNDERRUN;
946 hsd->State = HAL_SD_STATE_READY;
947 hsd->Context = SD_CONTEXT_NONE;
956 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
958 hsd->State = HAL_SD_STATE_READY;
964 hsd->ErrorCode |= HAL_SD_ERROR_BUSY;
982HAL_StatusTypeDef HAL_SD_ReadBlocks_IT(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
984 SDIO_DataInitTypeDef config;
986 uint32_t add = BlockAdd;
990 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
994 if(hsd->State == HAL_SD_STATE_READY)
996 hsd->ErrorCode = HAL_SD_ERROR_NONE;
998 if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
1000 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
1004 hsd->State = HAL_SD_STATE_BUSY;
1007 hsd->Instance->DCTRL = 0U;
1009 hsd->pRxBuffPtr = pData;
1010 hsd->RxXferSize = BLOCKSIZE * NumberOfBlocks;
1012#if defined(SDIO_STA_STBITERR)
1013 __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND | SDIO_FLAG_RXFIFOHF | SDIO_IT_STBITERR));
1015 __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND | SDIO_FLAG_RXFIFOHF));
1018 if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
1024 config.DataTimeOut = SDMMC_DATATIMEOUT;
1025 config.DataLength = BLOCKSIZE * NumberOfBlocks;
1026 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
1027 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
1028 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
1029 config.DPSM = SDIO_DPSM_ENABLE;
1030 (void)SDIO_ConfigData(hsd->Instance, &config);
1033 if(NumberOfBlocks > 1U)
1035 hsd->Context = (SD_CONTEXT_READ_MULTIPLE_BLOCK | SD_CONTEXT_IT);
1038 errorstate = SDMMC_CmdReadMultiBlock(hsd->Instance, add);
1042 hsd->Context = (SD_CONTEXT_READ_SINGLE_BLOCK | SD_CONTEXT_IT);
1045 errorstate = SDMMC_CmdReadSingleBlock(hsd->Instance, add);
1047 if(errorstate != HAL_SD_ERROR_NONE)
1050 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1051 hsd->ErrorCode |= errorstate;
1052 hsd->State = HAL_SD_STATE_READY;
1053 hsd->Context = SD_CONTEXT_NONE;
1078HAL_StatusTypeDef HAL_SD_WriteBlocks_IT(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
1080 SDIO_DataInitTypeDef config;
1081 uint32_t errorstate;
1082 uint32_t add = BlockAdd;
1086 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
1090 if(hsd->State == HAL_SD_STATE_READY)
1092 hsd->ErrorCode = HAL_SD_ERROR_NONE;
1094 if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
1096 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
1100 hsd->State = HAL_SD_STATE_BUSY;
1103 hsd->Instance->DCTRL = 0U;
1105 hsd->pTxBuffPtr = pData;
1106 hsd->TxXferSize = BLOCKSIZE * NumberOfBlocks;
1109#if defined(SDIO_STA_STBITERR)
1110 __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_DATAEND | SDIO_FLAG_TXFIFOHE | SDIO_IT_STBITERR));
1112 __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_DATAEND | SDIO_FLAG_TXFIFOHE));
1115 if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
1121 if(NumberOfBlocks > 1U)
1123 hsd->Context = (SD_CONTEXT_WRITE_MULTIPLE_BLOCK| SD_CONTEXT_IT);
1126 errorstate = SDMMC_CmdWriteMultiBlock(hsd->Instance, add);
1130 hsd->Context = (SD_CONTEXT_WRITE_SINGLE_BLOCK | SD_CONTEXT_IT);
1133 errorstate = SDMMC_CmdWriteSingleBlock(hsd->Instance, add);
1135 if(errorstate != HAL_SD_ERROR_NONE)
1138 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1139 hsd->ErrorCode |= errorstate;
1140 hsd->State = HAL_SD_STATE_READY;
1141 hsd->Context = SD_CONTEXT_NONE;
1146 config.DataTimeOut = SDMMC_DATATIMEOUT;
1147 config.DataLength = BLOCKSIZE * NumberOfBlocks;
1148 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
1149 config.TransferDir = SDIO_TRANSFER_DIR_TO_CARD;
1150 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
1151 config.DPSM = SDIO_DPSM_ENABLE;
1152 (void)SDIO_ConfigData(hsd->Instance, &config);
1175HAL_StatusTypeDef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
1177 SDIO_DataInitTypeDef config;
1178 uint32_t errorstate;
1179 uint32_t add = BlockAdd;
1183 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
1187 if(hsd->State == HAL_SD_STATE_READY)
1189 hsd->ErrorCode = HAL_SD_ERROR_NONE;
1191 if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
1193 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
1197 hsd->State = HAL_SD_STATE_BUSY;
1200 hsd->Instance->DCTRL = 0U;
1202#if defined(SDIO_STA_STBITERR)
1203 __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND | SDIO_IT_STBITERR));
1205 __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND));
1209 hsd->hdmarx->XferCpltCallback = SD_DMAReceiveCplt;
1212 hsd->hdmarx->XferErrorCallback = SD_DMAError;
1215 hsd->hdmarx->XferAbortCallback = NULL;
1219 MODIFY_REG(hsd->hdmarx->Instance->CR, DMA_SxCR_DIR, hsd->hdmarx->Init.Direction);
1222 if(
HAL_DMA_Start_IT(hsd->hdmarx, (uint32_t)&hsd->Instance->FIFO, (uint32_t)pData, (uint32_t)(BLOCKSIZE * NumberOfBlocks)/4U) !=
HAL_OK)
1224 __HAL_SD_DISABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND));
1225 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1226 hsd->ErrorCode |= HAL_SD_ERROR_DMA;
1227 hsd->State = HAL_SD_STATE_READY;
1233 __HAL_SD_DMA_ENABLE(hsd);
1235 if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
1241 config.DataTimeOut = SDMMC_DATATIMEOUT;
1242 config.DataLength = BLOCKSIZE * NumberOfBlocks;
1243 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
1244 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
1245 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
1246 config.DPSM = SDIO_DPSM_ENABLE;
1247 (void)SDIO_ConfigData(hsd->Instance, &config);
1250 if(NumberOfBlocks > 1U)
1252 hsd->Context = (SD_CONTEXT_READ_MULTIPLE_BLOCK | SD_CONTEXT_DMA);
1255 errorstate = SDMMC_CmdReadMultiBlock(hsd->Instance, add);
1259 hsd->Context = (SD_CONTEXT_READ_SINGLE_BLOCK | SD_CONTEXT_DMA);
1262 errorstate = SDMMC_CmdReadSingleBlock(hsd->Instance, add);
1264 if(errorstate != HAL_SD_ERROR_NONE)
1267 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1268 hsd->ErrorCode |= errorstate;
1269 hsd->State = HAL_SD_STATE_READY;
1270 hsd->Context = SD_CONTEXT_NONE;
1296HAL_StatusTypeDef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
1298 SDIO_DataInitTypeDef config;
1299 uint32_t errorstate;
1300 uint32_t add = BlockAdd;
1304 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
1308 if(hsd->State == HAL_SD_STATE_READY)
1310 hsd->ErrorCode = HAL_SD_ERROR_NONE;
1312 if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
1314 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
1318 hsd->State = HAL_SD_STATE_BUSY;
1321 hsd->Instance->DCTRL = 0U;
1324#if defined(SDIO_STA_STBITERR)
1325 __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_STBITERR));
1327 __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR));
1331 hsd->hdmatx->XferCpltCallback = SD_DMATransmitCplt;
1334 hsd->hdmatx->XferErrorCallback = SD_DMAError;
1337 hsd->hdmatx->XferAbortCallback = NULL;
1339 if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
1345 if(NumberOfBlocks > 1U)
1347 hsd->Context = (SD_CONTEXT_WRITE_MULTIPLE_BLOCK | SD_CONTEXT_DMA);
1350 errorstate = SDMMC_CmdWriteMultiBlock(hsd->Instance, add);
1354 hsd->Context = (SD_CONTEXT_WRITE_SINGLE_BLOCK | SD_CONTEXT_DMA);
1357 errorstate = SDMMC_CmdWriteSingleBlock(hsd->Instance, add);
1359 if(errorstate != HAL_SD_ERROR_NONE)
1362 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1363 hsd->ErrorCode |= errorstate;
1364 hsd->State = HAL_SD_STATE_READY;
1365 hsd->Context = SD_CONTEXT_NONE;
1370 __HAL_SD_DMA_ENABLE(hsd);
1374 MODIFY_REG(hsd->hdmatx->Instance->CR, DMA_SxCR_DIR, hsd->hdmatx->Init.Direction);
1377 if(
HAL_DMA_Start_IT(hsd->hdmatx, (uint32_t)pData, (uint32_t)&hsd->Instance->FIFO, (uint32_t)(BLOCKSIZE * NumberOfBlocks)/4U) !=
HAL_OK)
1379#if defined(SDIO_STA_STBITERR)
1380 __HAL_SD_DISABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_STBITERR));
1382 __HAL_SD_DISABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR));
1384 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1385 hsd->ErrorCode |= HAL_SD_ERROR_DMA;
1386 hsd->State = HAL_SD_STATE_READY;
1387 hsd->Context = SD_CONTEXT_NONE;
1393 config.DataTimeOut = SDMMC_DATATIMEOUT;
1394 config.DataLength = BLOCKSIZE * NumberOfBlocks;
1395 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
1396 config.TransferDir = SDIO_TRANSFER_DIR_TO_CARD;
1397 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
1398 config.DPSM = SDIO_DPSM_ENABLE;
1399 (void)SDIO_ConfigData(hsd->Instance, &config);
1419HAL_StatusTypeDef HAL_SD_Erase(SD_HandleTypeDef *hsd, uint32_t BlockStartAdd, uint32_t BlockEndAdd)
1421 uint32_t errorstate;
1422 uint32_t start_add = BlockStartAdd;
1423 uint32_t end_add = BlockEndAdd;
1425 if(hsd->State == HAL_SD_STATE_READY)
1427 hsd->ErrorCode = HAL_SD_ERROR_NONE;
1429 if(end_add < start_add)
1431 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
1435 if(end_add > (hsd->SdCard.LogBlockNbr))
1437 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
1441 hsd->State = HAL_SD_STATE_BUSY;
1444 if(((hsd->SdCard.Class) & SDIO_CCCC_ERASE) == 0U)
1447 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1448 hsd->ErrorCode |= HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
1449 hsd->State = HAL_SD_STATE_READY;
1453 if((SDIO_GetResponse(hsd->Instance, SDIO_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
1456 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1457 hsd->ErrorCode |= HAL_SD_ERROR_LOCK_UNLOCK_FAILED;
1458 hsd->State = HAL_SD_STATE_READY;
1463 if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
1470 if(hsd->SdCard.CardType != CARD_SECURED)
1473 errorstate = SDMMC_CmdSDEraseStartAdd(hsd->Instance, start_add);
1474 if(errorstate != HAL_SD_ERROR_NONE)
1477 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1478 hsd->ErrorCode |= errorstate;
1479 hsd->State = HAL_SD_STATE_READY;
1484 errorstate = SDMMC_CmdSDEraseEndAdd(hsd->Instance, end_add);
1485 if(errorstate != HAL_SD_ERROR_NONE)
1488 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1489 hsd->ErrorCode |= errorstate;
1490 hsd->State = HAL_SD_STATE_READY;
1496 errorstate = SDMMC_CmdErase(hsd->Instance);
1497 if(errorstate != HAL_SD_ERROR_NONE)
1500 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1501 hsd->ErrorCode |= errorstate;
1502 hsd->State = HAL_SD_STATE_READY;
1506 hsd->State = HAL_SD_STATE_READY;
1521void HAL_SD_IRQHandler(SD_HandleTypeDef *hsd)
1523 uint32_t errorstate;
1524 uint32_t context = hsd->Context;
1527 if((__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF) != RESET) && ((context & SD_CONTEXT_IT) != 0U))
1532 else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DATAEND) != RESET)
1534 __HAL_SD_CLEAR_FLAG(hsd, SDIO_FLAG_DATAEND);
1536#if defined(SDIO_STA_STBITERR)
1537 __HAL_SD_DISABLE_IT(hsd, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
1538 SDIO_IT_TXUNDERR | SDIO_IT_RXOVERR | SDIO_IT_TXFIFOHE |\
1539 SDIO_IT_RXFIFOHF | SDIO_IT_STBITERR);
1541 __HAL_SD_DISABLE_IT(hsd, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
1542 SDIO_IT_TXUNDERR | SDIO_IT_RXOVERR | SDIO_IT_TXFIFOHE |\
1546 hsd->Instance->DCTRL &= ~(SDIO_DCTRL_DTEN);
1548 if((context & SD_CONTEXT_IT) != 0U)
1550 if(((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U) || ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
1552 errorstate = SDMMC_CmdStopTransfer(hsd->Instance);
1553 if(errorstate != HAL_SD_ERROR_NONE)
1555 hsd->ErrorCode |= errorstate;
1556#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1557 hsd->ErrorCallback(hsd);
1559 HAL_SD_ErrorCallback(hsd);
1565 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
1567 hsd->State = HAL_SD_STATE_READY;
1568 hsd->Context = SD_CONTEXT_NONE;
1569 if(((context & SD_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
1571#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1572 hsd->RxCpltCallback(hsd);
1574 HAL_SD_RxCpltCallback(hsd);
1579#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1580 hsd->TxCpltCallback(hsd);
1582 HAL_SD_TxCpltCallback(hsd);
1586 else if((context & SD_CONTEXT_DMA) != 0U)
1588 if((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U)
1590 errorstate = SDMMC_CmdStopTransfer(hsd->Instance);
1591 if(errorstate != HAL_SD_ERROR_NONE)
1593 hsd->ErrorCode |= errorstate;
1594#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1595 hsd->ErrorCallback(hsd);
1597 HAL_SD_ErrorCallback(hsd);
1601 if(((context & SD_CONTEXT_READ_SINGLE_BLOCK) == 0U) && ((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) == 0U))
1605 hsd->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
1607 hsd->State = HAL_SD_STATE_READY;
1609#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1610 hsd->TxCpltCallback(hsd);
1612 HAL_SD_TxCpltCallback(hsd);
1622 else if((__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXFIFOHE) != RESET) && ((context & SD_CONTEXT_IT) != 0U))
1627#if defined(SDIO_STA_STBITERR)
1628 else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_RXOVERR | SDIO_FLAG_TXUNDERR | SDIO_FLAG_STBITERR) != RESET)
1630 else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_RXOVERR | SDIO_FLAG_TXUNDERR) != RESET)
1634 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL) != RESET)
1636 hsd->ErrorCode |= HAL_SD_ERROR_DATA_CRC_FAIL;
1638 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT) != RESET)
1640 hsd->ErrorCode |= HAL_SD_ERROR_DATA_TIMEOUT;
1642 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR) != RESET)
1644 hsd->ErrorCode |= HAL_SD_ERROR_RX_OVERRUN;
1646 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR) != RESET)
1648 hsd->ErrorCode |= HAL_SD_ERROR_TX_UNDERRUN;
1650#if defined(SDIO_STA_STBITERR)
1651 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_STBITERR) != RESET)
1653 hsd->ErrorCode |= HAL_SD_ERROR_DATA_TIMEOUT;
1657#if defined(SDIO_STA_STBITERR)
1659 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS | SDIO_FLAG_STBITERR);
1662 __HAL_SD_DISABLE_IT(hsd, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
1663 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR | SDIO_IT_STBITERR);
1666 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
1669 __HAL_SD_DISABLE_IT(hsd, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
1670 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
1673 hsd->ErrorCode |= SDMMC_CmdStopTransfer(hsd->Instance);
1675 if((context & SD_CONTEXT_IT) != 0U)
1678 hsd->State = HAL_SD_STATE_READY;
1679 hsd->Context = SD_CONTEXT_NONE;
1680#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1681 hsd->ErrorCallback(hsd);
1683 HAL_SD_ErrorCallback(hsd);
1686 else if((context & SD_CONTEXT_DMA) != 0U)
1689 if(((context & SD_CONTEXT_WRITE_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
1692 hsd->hdmatx->XferAbortCallback = SD_DMATxAbort;
1696 SD_DMATxAbort(hsd->hdmatx);
1699 else if(((context & SD_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
1702 hsd->hdmarx->XferAbortCallback = SD_DMARxAbort;
1706 SD_DMARxAbort(hsd->hdmarx);
1711 hsd->ErrorCode = HAL_SD_ERROR_NONE;
1712 hsd->State = HAL_SD_STATE_READY;
1713 hsd->Context = SD_CONTEXT_NONE;
1714#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1715 hsd->AbortCpltCallback(hsd);
1717 HAL_SD_AbortCallback(hsd);
1737HAL_SD_StateTypeDef HAL_SD_GetState(SD_HandleTypeDef *hsd)
1748uint32_t HAL_SD_GetError(SD_HandleTypeDef *hsd)
1750 return hsd->ErrorCode;
1758__weak
void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)
1773__weak
void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)
1788__weak
void HAL_SD_ErrorCallback(SD_HandleTypeDef *hsd)
1803__weak
void HAL_SD_AbortCallback(SD_HandleTypeDef *hsd)
1813#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1829HAL_StatusTypeDef HAL_SD_RegisterCallback(SD_HandleTypeDef *hsd, HAL_SD_CallbackIDTypeDef CallbackID, pSD_CallbackTypeDef pCallback)
1833 if(pCallback == NULL)
1836 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1843 if(hsd->State == HAL_SD_STATE_READY)
1847 case HAL_SD_TX_CPLT_CB_ID :
1848 hsd->TxCpltCallback = pCallback;
1850 case HAL_SD_RX_CPLT_CB_ID :
1851 hsd->RxCpltCallback = pCallback;
1853 case HAL_SD_ERROR_CB_ID :
1854 hsd->ErrorCallback = pCallback;
1856 case HAL_SD_ABORT_CB_ID :
1857 hsd->AbortCpltCallback = pCallback;
1859 case HAL_SD_MSP_INIT_CB_ID :
1860 hsd->MspInitCallback = pCallback;
1862 case HAL_SD_MSP_DEINIT_CB_ID :
1863 hsd->MspDeInitCallback = pCallback;
1867 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1873 else if (hsd->State == HAL_SD_STATE_RESET)
1877 case HAL_SD_MSP_INIT_CB_ID :
1878 hsd->MspInitCallback = pCallback;
1880 case HAL_SD_MSP_DEINIT_CB_ID :
1881 hsd->MspDeInitCallback = pCallback;
1885 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1894 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1918HAL_StatusTypeDef HAL_SD_UnRegisterCallback(SD_HandleTypeDef *hsd, HAL_SD_CallbackIDTypeDef CallbackID)
1925 if(hsd->State == HAL_SD_STATE_READY)
1929 case HAL_SD_TX_CPLT_CB_ID :
1930 hsd->TxCpltCallback = HAL_SD_TxCpltCallback;
1932 case HAL_SD_RX_CPLT_CB_ID :
1933 hsd->RxCpltCallback = HAL_SD_RxCpltCallback;
1935 case HAL_SD_ERROR_CB_ID :
1936 hsd->ErrorCallback = HAL_SD_ErrorCallback;
1938 case HAL_SD_ABORT_CB_ID :
1939 hsd->AbortCpltCallback = HAL_SD_AbortCallback;
1941 case HAL_SD_MSP_INIT_CB_ID :
1942 hsd->MspInitCallback = HAL_SD_MspInit;
1944 case HAL_SD_MSP_DEINIT_CB_ID :
1945 hsd->MspDeInitCallback = HAL_SD_MspDeInit;
1949 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1955 else if (hsd->State == HAL_SD_STATE_RESET)
1959 case HAL_SD_MSP_INIT_CB_ID :
1960 hsd->MspInitCallback = HAL_SD_MspInit;
1962 case HAL_SD_MSP_DEINIT_CB_ID :
1963 hsd->MspDeInitCallback = HAL_SD_MspDeInit;
1967 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1976 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
2014HAL_StatusTypeDef HAL_SD_GetCardCID(SD_HandleTypeDef *hsd, HAL_SD_CardCIDTypeDef *pCID)
2016 pCID->ManufacturerID = (uint8_t)((hsd->CID[0] & 0xFF000000U) >> 24U);
2018 pCID->OEM_AppliID = (uint16_t)((hsd->CID[0] & 0x00FFFF00U) >> 8U);
2020 pCID->ProdName1 = (((hsd->CID[0] & 0x000000FFU) << 24U) | ((hsd->CID[1] & 0xFFFFFF00U) >> 8U));
2022 pCID->ProdName2 = (uint8_t)(hsd->CID[1] & 0x000000FFU);
2024 pCID->ProdRev = (uint8_t)((hsd->CID[2] & 0xFF000000U) >> 24U);
2026 pCID->ProdSN = (((hsd->CID[2] & 0x00FFFFFFU) << 8U) | ((hsd->CID[3] & 0xFF000000U) >> 24U));
2028 pCID->Reserved1 = (uint8_t)((hsd->CID[3] & 0x00F00000U) >> 20U);
2030 pCID->ManufactDate = (uint16_t)((hsd->CID[3] & 0x000FFF00U) >> 8U);
2032 pCID->CID_CRC = (uint8_t)((hsd->CID[3] & 0x000000FEU) >> 1U);
2034 pCID->Reserved2 = 1U;
2047HAL_StatusTypeDef HAL_SD_GetCardCSD(SD_HandleTypeDef *hsd, HAL_SD_CardCSDTypeDef *pCSD)
2049 pCSD->CSDStruct = (uint8_t)((hsd->CSD[0] & 0xC0000000U) >> 30U);
2051 pCSD->SysSpecVersion = (uint8_t)((hsd->CSD[0] & 0x3C000000U) >> 26U);
2053 pCSD->Reserved1 = (uint8_t)((hsd->CSD[0] & 0x03000000U) >> 24U);
2055 pCSD->TAAC = (uint8_t)((hsd->CSD[0] & 0x00FF0000U) >> 16U);
2057 pCSD->NSAC = (uint8_t)((hsd->CSD[0] & 0x0000FF00U) >> 8U);
2059 pCSD->MaxBusClkFrec = (uint8_t)(hsd->CSD[0] & 0x000000FFU);
2061 pCSD->CardComdClasses = (uint16_t)((hsd->CSD[1] & 0xFFF00000U) >> 20U);
2063 pCSD->RdBlockLen = (uint8_t)((hsd->CSD[1] & 0x000F0000U) >> 16U);
2065 pCSD->PartBlockRead = (uint8_t)((hsd->CSD[1] & 0x00008000U) >> 15U);
2067 pCSD->WrBlockMisalign = (uint8_t)((hsd->CSD[1] & 0x00004000U) >> 14U);
2069 pCSD->RdBlockMisalign = (uint8_t)((hsd->CSD[1] & 0x00002000U) >> 13U);
2071 pCSD->DSRImpl = (uint8_t)((hsd->CSD[1] & 0x00001000U) >> 12U);
2073 pCSD->Reserved2 = 0U;
2075 if(hsd->SdCard.CardType == CARD_SDSC)
2077 pCSD->DeviceSize = (((hsd->CSD[1] & 0x000003FFU) << 2U) | ((hsd->CSD[2] & 0xC0000000U) >> 30U));
2079 pCSD->MaxRdCurrentVDDMin = (uint8_t)((hsd->CSD[2] & 0x38000000U) >> 27U);
2081 pCSD->MaxRdCurrentVDDMax = (uint8_t)((hsd->CSD[2] & 0x07000000U) >> 24U);
2083 pCSD->MaxWrCurrentVDDMin = (uint8_t)((hsd->CSD[2] & 0x00E00000U) >> 21U);
2085 pCSD->MaxWrCurrentVDDMax = (uint8_t)((hsd->CSD[2] & 0x001C0000U) >> 18U);
2087 pCSD->DeviceSizeMul = (uint8_t)((hsd->CSD[2] & 0x00038000U) >> 15U);
2089 hsd->SdCard.BlockNbr = (pCSD->DeviceSize + 1U) ;
2090 hsd->SdCard.BlockNbr *= (1UL << ((pCSD->DeviceSizeMul & 0x07U) + 2U));
2091 hsd->SdCard.BlockSize = (1UL << (pCSD->RdBlockLen & 0x0FU));
2093 hsd->SdCard.LogBlockNbr = (hsd->SdCard.BlockNbr) * ((hsd->SdCard.BlockSize) / 512U);
2094 hsd->SdCard.LogBlockSize = 512U;
2096 else if(hsd->SdCard.CardType == CARD_SDHC_SDXC)
2099 pCSD->DeviceSize = (((hsd->CSD[1] & 0x0000003FU) << 16U) | ((hsd->CSD[2] & 0xFFFF0000U) >> 16U));
2101 hsd->SdCard.BlockNbr = ((pCSD->DeviceSize + 1U) * 1024U);
2102 hsd->SdCard.LogBlockNbr = hsd->SdCard.BlockNbr;
2103 hsd->SdCard.BlockSize = 512U;
2104 hsd->SdCard.LogBlockSize = hsd->SdCard.BlockSize;
2109 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
2110 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2111 hsd->State = HAL_SD_STATE_READY;
2115 pCSD->EraseGrSize = (uint8_t)((hsd->CSD[2] & 0x00004000U) >> 14U);
2117 pCSD->EraseGrMul = (uint8_t)((hsd->CSD[2] & 0x00003F80U) >> 7U);
2119 pCSD->WrProtectGrSize = (uint8_t)(hsd->CSD[2] & 0x0000007FU);
2121 pCSD->WrProtectGrEnable = (uint8_t)((hsd->CSD[3] & 0x80000000U) >> 31U);
2123 pCSD->ManDeflECC = (uint8_t)((hsd->CSD[3] & 0x60000000U) >> 29U);
2125 pCSD->WrSpeedFact = (uint8_t)((hsd->CSD[3] & 0x1C000000U) >> 26U);
2127 pCSD->MaxWrBlockLen= (uint8_t)((hsd->CSD[3] & 0x03C00000U) >> 22U);
2129 pCSD->WriteBlockPaPartial = (uint8_t)((hsd->CSD[3] & 0x00200000U) >> 21U);
2131 pCSD->Reserved3 = 0;
2133 pCSD->ContentProtectAppli = (uint8_t)((hsd->CSD[3] & 0x00010000U) >> 16U);
2135 pCSD->FileFormatGroup = (uint8_t)((hsd->CSD[3] & 0x00008000U) >> 15U);
2137 pCSD->CopyFlag = (uint8_t)((hsd->CSD[3] & 0x00004000U) >> 14U);
2139 pCSD->PermWrProtect = (uint8_t)((hsd->CSD[3] & 0x00002000U) >> 13U);
2141 pCSD->TempWrProtect = (uint8_t)((hsd->CSD[3] & 0x00001000U) >> 12U);
2143 pCSD->FileFormat = (uint8_t)((hsd->CSD[3] & 0x00000C00U) >> 10U);
2145 pCSD->ECC= (uint8_t)((hsd->CSD[3] & 0x00000300U) >> 8U);
2147 pCSD->CSD_CRC = (uint8_t)((hsd->CSD[3] & 0x000000FEU) >> 1U);
2149 pCSD->Reserved4 = 1;
2161HAL_StatusTypeDef HAL_SD_GetCardStatus(SD_HandleTypeDef *hsd, HAL_SD_CardStatusTypeDef *pStatus)
2163 uint32_t sd_status[16];
2164 uint32_t errorstate;
2167 errorstate = SD_SendSDStatus(hsd, sd_status);
2168 if(errorstate != HAL_SD_ERROR_NONE)
2171 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
2172 hsd->ErrorCode |= errorstate;
2173 hsd->State = HAL_SD_STATE_READY;
2178 pStatus->DataBusWidth = (uint8_t)((sd_status[0] & 0xC0U) >> 6U);
2180 pStatus->SecuredMode = (uint8_t)((sd_status[0] & 0x20U) >> 5U);
2182 pStatus->CardType = (uint16_t)(((sd_status[0] & 0x00FF0000U) >> 8U) | ((sd_status[0] & 0xFF000000U) >> 24U));
2184 pStatus->ProtectedAreaSize = (((sd_status[1] & 0xFFU) << 24U) | ((sd_status[1] & 0xFF00U) << 8U) |
2185 ((sd_status[1] & 0xFF0000U) >> 8U) | ((sd_status[1] & 0xFF000000U) >> 24U));
2187 pStatus->SpeedClass = (uint8_t)(sd_status[2] & 0xFFU);
2189 pStatus->PerformanceMove = (uint8_t)((sd_status[2] & 0xFF00U) >> 8U);
2191 pStatus->AllocationUnitSize = (uint8_t)((sd_status[2] & 0xF00000U) >> 20U);
2193 pStatus->EraseSize = (uint16_t)(((sd_status[2] & 0xFF000000U) >> 16U) | (sd_status[3] & 0xFFU));
2195 pStatus->EraseTimeout = (uint8_t)((sd_status[3] & 0xFC00U) >> 10U);
2197 pStatus->EraseOffset = (uint8_t)((sd_status[3] & 0x0300U) >> 8U);
2201 errorstate = SDMMC_CmdBlockLength(hsd->Instance, BLOCKSIZE);
2202 if(errorstate != HAL_SD_ERROR_NONE)
2205 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
2206 hsd->ErrorCode = errorstate;
2207 hsd->State = HAL_SD_STATE_READY;
2221HAL_StatusTypeDef HAL_SD_GetCardInfo(SD_HandleTypeDef *hsd, HAL_SD_CardInfoTypeDef *pCardInfo)
2223 pCardInfo->CardType = (uint32_t)(hsd->SdCard.CardType);
2224 pCardInfo->CardVersion = (uint32_t)(hsd->SdCard.CardVersion);
2225 pCardInfo->Class = (uint32_t)(hsd->SdCard.Class);
2226 pCardInfo->RelCardAdd = (uint32_t)(hsd->SdCard.RelCardAdd);
2227 pCardInfo->BlockNbr = (uint32_t)(hsd->SdCard.BlockNbr);
2228 pCardInfo->BlockSize = (uint32_t)(hsd->SdCard.BlockSize);
2229 pCardInfo->LogBlockNbr = (uint32_t)(hsd->SdCard.LogBlockNbr);
2230 pCardInfo->LogBlockSize = (uint32_t)(hsd->SdCard.LogBlockSize);
2246HAL_StatusTypeDef HAL_SD_ConfigWideBusOperation(SD_HandleTypeDef *hsd, uint32_t WideMode)
2248 SDIO_InitTypeDef Init;
2249 uint32_t errorstate;
2256 hsd->State = HAL_SD_STATE_BUSY;
2258 if(hsd->SdCard.CardType != CARD_SECURED)
2260 if(WideMode == SDIO_BUS_WIDE_8B)
2262 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2264 else if(WideMode == SDIO_BUS_WIDE_4B)
2266 errorstate = SD_WideBus_Enable(hsd);
2268 hsd->ErrorCode |= errorstate;
2270 else if(WideMode == SDIO_BUS_WIDE_1B)
2272 errorstate = SD_WideBus_Disable(hsd);
2274 hsd->ErrorCode |= errorstate;
2279 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
2285 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2288 if(hsd->ErrorCode != HAL_SD_ERROR_NONE)
2291 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
2292 hsd->State = HAL_SD_STATE_READY;
2298 Init.ClockEdge = hsd->Init.ClockEdge;
2299 Init.ClockBypass = hsd->Init.ClockBypass;
2300 Init.ClockPowerSave = hsd->Init.ClockPowerSave;
2301 Init.BusWide = WideMode;
2302 Init.HardwareFlowControl = hsd->Init.HardwareFlowControl;
2303 Init.ClockDiv = hsd->Init.ClockDiv;
2304 (void)SDIO_Init(hsd->Instance, Init);
2308 errorstate = SDMMC_CmdBlockLength(hsd->Instance, BLOCKSIZE);
2309 if(errorstate != HAL_SD_ERROR_NONE)
2312 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
2313 hsd->ErrorCode |= errorstate;
2318 hsd->State = HAL_SD_STATE_READY;
2328HAL_SD_CardStateTypeDef HAL_SD_GetCardState(SD_HandleTypeDef *hsd)
2331 uint32_t errorstate;
2334 errorstate = SD_SendStatus(hsd, &resp1);
2335 if(errorstate != HAL_SD_ERROR_NONE)
2337 hsd->ErrorCode |= errorstate;
2340 cardstate = ((resp1 >> 9U) & 0x0FU);
2342 return (HAL_SD_CardStateTypeDef)cardstate;
2353 HAL_SD_CardStateTypeDef CardState;
2354 uint32_t context = hsd->Context;
2357 __HAL_SD_DISABLE_IT(hsd, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
2358 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
2361 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
2363 CLEAR_BIT(hsd->Instance->DCTRL, SDIO_DCTRL_DTEN);
2365 if ((context & SD_CONTEXT_DMA) != 0U)
2368 hsd->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
2371 if (((context & SD_CONTEXT_WRITE_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
2375 hsd->ErrorCode |= HAL_SD_ERROR_DMA;
2379 else if (((context & SD_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
2383 hsd->ErrorCode |= HAL_SD_ERROR_DMA;
2392 hsd->State = HAL_SD_STATE_READY;
2395 hsd->Context = SD_CONTEXT_NONE;
2397 CardState = HAL_SD_GetCardState(hsd);
2398 if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING))
2400 hsd->ErrorCode = SDMMC_CmdStopTransfer(hsd->Instance);
2402 if(hsd->ErrorCode != HAL_SD_ERROR_NONE)
2417 HAL_SD_CardStateTypeDef CardState;
2418 uint32_t context = hsd->Context;
2421 __HAL_SD_DISABLE_IT(hsd, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
2422 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
2424 CLEAR_BIT(hsd->Instance->DCTRL, SDIO_DCTRL_DTEN);
2426 if ((context & SD_CONTEXT_DMA) != 0U)
2429 hsd->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
2432 if (((context & SD_CONTEXT_WRITE_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
2434 hsd->hdmatx->XferAbortCallback = SD_DMATxAbort;
2441 else if (((context & SD_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
2443 hsd->hdmarx->XferAbortCallback = SD_DMARxAbort;
2458 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
2460 CardState = HAL_SD_GetCardState(hsd);
2461 hsd->State = HAL_SD_STATE_READY;
2462 hsd->Context = SD_CONTEXT_NONE;
2463 if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING))
2465 hsd->ErrorCode = SDMMC_CmdStopTransfer(hsd->Instance);
2467 if(hsd->ErrorCode != HAL_SD_ERROR_NONE)
2473#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
2474 hsd->AbortCpltCallback(hsd);
2476 HAL_SD_AbortCallback(hsd);
2504 SD_HandleTypeDef* hsd = (SD_HandleTypeDef* )(hdma->
Parent);
2507 __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DATAEND));
2517 SD_HandleTypeDef* hsd = (SD_HandleTypeDef* )(hdma->
Parent);
2518 uint32_t errorstate;
2521 if(hsd->Context == (SD_CONTEXT_READ_MULTIPLE_BLOCK | SD_CONTEXT_DMA))
2523 errorstate = SDMMC_CmdStopTransfer(hsd->Instance);
2524 if(errorstate != HAL_SD_ERROR_NONE)
2526 hsd->ErrorCode |= errorstate;
2527#if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2528 hsd->ErrorCallback(hsd);
2530 HAL_SD_ErrorCallback(hsd);
2537 hsd->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
2540 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
2542 hsd->State = HAL_SD_STATE_READY;
2543 hsd->Context = SD_CONTEXT_NONE;
2545#if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2546 hsd->RxCpltCallback(hsd);
2548 HAL_SD_RxCpltCallback(hsd);
2559 SD_HandleTypeDef* hsd = (SD_HandleTypeDef* )(hdma->
Parent);
2560 HAL_SD_CardStateTypeDef CardState;
2561 uint32_t RxErrorCode, TxErrorCode;
2566 RxErrorCode = hsd->hdmarx->ErrorCode;
2567 TxErrorCode = hsd->hdmatx->ErrorCode;
2571 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
2574 __HAL_SD_DISABLE_IT(hsd, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
2575 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
2577 hsd->ErrorCode |= HAL_SD_ERROR_DMA;
2578 CardState = HAL_SD_GetCardState(hsd);
2579 if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING))
2581 hsd->ErrorCode |= SDMMC_CmdStopTransfer(hsd->Instance);
2584 hsd->State= HAL_SD_STATE_READY;
2585 hsd->Context = SD_CONTEXT_NONE;
2588#if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2589 hsd->ErrorCallback(hsd);
2591 HAL_SD_ErrorCallback(hsd);
2603 SD_HandleTypeDef* hsd = (SD_HandleTypeDef* )(hdma->
Parent);
2604 HAL_SD_CardStateTypeDef CardState;
2607 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
2609 CardState = HAL_SD_GetCardState(hsd);
2610 hsd->State = HAL_SD_STATE_READY;
2611 hsd->Context = SD_CONTEXT_NONE;
2612 if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING))
2614 hsd->ErrorCode |= SDMMC_CmdStopTransfer(hsd->Instance);
2617 if(hsd->ErrorCode == HAL_SD_ERROR_NONE)
2619#if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2620 hsd->AbortCpltCallback(hsd);
2622 HAL_SD_AbortCallback(hsd);
2627#if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2628 hsd->ErrorCallback(hsd);
2630 HAL_SD_ErrorCallback(hsd);
2642 SD_HandleTypeDef* hsd = (SD_HandleTypeDef* )(hdma->
Parent);
2643 HAL_SD_CardStateTypeDef CardState;
2646 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
2648 CardState = HAL_SD_GetCardState(hsd);
2649 hsd->State = HAL_SD_STATE_READY;
2650 hsd->Context = SD_CONTEXT_NONE;
2651 if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING))
2653 hsd->ErrorCode |= SDMMC_CmdStopTransfer(hsd->Instance);
2656 if(hsd->ErrorCode == HAL_SD_ERROR_NONE)
2658#if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2659 hsd->AbortCpltCallback(hsd);
2661 HAL_SD_AbortCallback(hsd);
2666#if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2667 hsd->ErrorCallback(hsd);
2669 HAL_SD_ErrorCallback(hsd);
2679static uint32_t SD_InitCard(SD_HandleTypeDef *hsd)
2681 HAL_SD_CardCSDTypeDef CSD;
2682 uint32_t errorstate;
2683 uint16_t sd_rca = 1U;
2686 if(SDIO_GetPowerState(hsd->Instance) == 0U)
2689 return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
2692 if(hsd->SdCard.CardType != CARD_SECURED)
2695 errorstate = SDMMC_CmdSendCID(hsd->Instance);
2696 if(errorstate != HAL_SD_ERROR_NONE)
2703 hsd->CID[0U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP1);
2704 hsd->CID[1U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP2);
2705 hsd->CID[2U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP3);
2706 hsd->CID[3U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP4);
2710 if(hsd->SdCard.CardType != CARD_SECURED)
2714 errorstate = SDMMC_CmdSetRelAdd(hsd->Instance, &sd_rca);
2715 if(errorstate != HAL_SD_ERROR_NONE)
2720 if(hsd->SdCard.CardType != CARD_SECURED)
2723 hsd->SdCard.RelCardAdd = sd_rca;
2726 errorstate = SDMMC_CmdSendCSD(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
2727 if(errorstate != HAL_SD_ERROR_NONE)
2734 hsd->CSD[0U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP1);
2735 hsd->CSD[1U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP2);
2736 hsd->CSD[2U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP3);
2737 hsd->CSD[3U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP4);
2742 hsd->SdCard.Class = (SDIO_GetResponse(hsd->Instance, SDIO_RESP2) >> 20U);
2745 if (HAL_SD_GetCardCSD(hsd, &CSD) !=
HAL_OK)
2747 return HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2751 errorstate = SDMMC_CmdSelDesel(hsd->Instance, (uint32_t)(((uint32_t)hsd->SdCard.RelCardAdd) << 16U));
2752 if(errorstate != HAL_SD_ERROR_NONE)
2758 return HAL_SD_ERROR_NONE;
2768static uint32_t SD_PowerON(SD_HandleTypeDef *hsd)
2770 __IO uint32_t count = 0U;
2771 uint32_t response = 0U, validvoltage = 0U;
2772 uint32_t errorstate;
2775 errorstate = SDMMC_CmdGoIdleState(hsd->Instance);
2776 if(errorstate != HAL_SD_ERROR_NONE)
2782 errorstate = SDMMC_CmdOperCond(hsd->Instance);
2783 if(errorstate != HAL_SD_ERROR_NONE)
2785 hsd->SdCard.CardVersion = CARD_V1_X;
2787 errorstate = SDMMC_CmdGoIdleState(hsd->Instance);
2788 if(errorstate != HAL_SD_ERROR_NONE)
2796 hsd->SdCard.CardVersion = CARD_V2_X;
2799 if( hsd->SdCard.CardVersion == CARD_V2_X)
2802 errorstate = SDMMC_CmdAppCommand(hsd->Instance, 0);
2803 if(errorstate != HAL_SD_ERROR_NONE)
2805 return HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2810 while((count < SDMMC_MAX_VOLT_TRIAL) && (validvoltage == 0U))
2813 errorstate = SDMMC_CmdAppCommand(hsd->Instance, 0);
2814 if(errorstate != HAL_SD_ERROR_NONE)
2820 errorstate = SDMMC_CmdAppOperCommand(hsd->Instance, SDMMC_VOLTAGE_WINDOW_SD | SDMMC_HIGH_CAPACITY | SD_SWITCH_1_8V_CAPACITY);
2821 if(errorstate != HAL_SD_ERROR_NONE)
2823 return HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2827 response = SDIO_GetResponse(hsd->Instance, SDIO_RESP1);
2830 validvoltage = (((response >> 31U) == 1U) ? 1U : 0U);
2835 if(count >= SDMMC_MAX_VOLT_TRIAL)
2837 return HAL_SD_ERROR_INVALID_VOLTRANGE;
2840 if((response & SDMMC_HIGH_CAPACITY) == SDMMC_HIGH_CAPACITY)
2842 hsd->SdCard.CardType = CARD_SDHC_SDXC;
2846 hsd->SdCard.CardType = CARD_SDSC;
2850 return HAL_SD_ERROR_NONE;
2858static void SD_PowerOFF(SD_HandleTypeDef *hsd)
2861 (void)SDIO_PowerState_OFF(hsd->Instance);
2871static uint32_t SD_SendSDStatus(SD_HandleTypeDef *hsd, uint32_t *pSDstatus)
2873 SDIO_DataInitTypeDef config;
2874 uint32_t errorstate;
2877 uint32_t *pData = pSDstatus;
2880 if((SDIO_GetResponse(hsd->Instance, SDIO_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
2882 return HAL_SD_ERROR_LOCK_UNLOCK_FAILED;
2886 errorstate = SDMMC_CmdBlockLength(hsd->Instance, 64U);
2887 if(errorstate != HAL_SD_ERROR_NONE)
2889 hsd->ErrorCode |= HAL_SD_ERROR_NONE;
2894 errorstate = SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
2895 if(errorstate != HAL_SD_ERROR_NONE)
2897 hsd->ErrorCode |= HAL_SD_ERROR_NONE;
2902 config.DataTimeOut = SDMMC_DATATIMEOUT;
2903 config.DataLength = 64U;
2904 config.DataBlockSize = SDIO_DATABLOCK_SIZE_64B;
2905 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
2906 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
2907 config.DPSM = SDIO_DPSM_ENABLE;
2908 (void)SDIO_ConfigData(hsd->Instance, &config);
2911 errorstate = SDMMC_CmdStatusRegister(hsd->Instance);
2912 if(errorstate != HAL_SD_ERROR_NONE)
2914 hsd->ErrorCode |= HAL_SD_ERROR_NONE;
2919 while(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND))
2921 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF))
2923 for(count = 0U; count < 8U; count++)
2925 *pData = SDIO_ReadFIFO(hsd->Instance);
2930 if((
HAL_GetTick() - tickstart) >= SDMMC_SWDATATIMEOUT)
2932 return HAL_SD_ERROR_TIMEOUT;
2936#if defined(SDIO_STA_STBITERR)
2937 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT) || (__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_STBITERR)))
2939 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT))
2942 return HAL_SD_ERROR_DATA_TIMEOUT;
2944 else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL))
2946 return HAL_SD_ERROR_DATA_CRC_FAIL;
2948 else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR))
2950 return HAL_SD_ERROR_RX_OVERRUN;
2957 while ((__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXDAVL)))
2959 *pData = SDIO_ReadFIFO(hsd->Instance);
2962 if((
HAL_GetTick() - tickstart) >= SDMMC_SWDATATIMEOUT)
2964 return HAL_SD_ERROR_TIMEOUT;
2969 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
2971 return HAL_SD_ERROR_NONE;
2981static uint32_t SD_SendStatus(SD_HandleTypeDef *hsd, uint32_t *pCardStatus)
2983 uint32_t errorstate;
2985 if(pCardStatus == NULL)
2987 return HAL_SD_ERROR_PARAM;
2991 errorstate = SDMMC_CmdSendStatus(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
2992 if(errorstate != HAL_SD_ERROR_NONE)
2998 *pCardStatus = SDIO_GetResponse(hsd->Instance, SDIO_RESP1);
3000 return HAL_SD_ERROR_NONE;
3008static uint32_t SD_WideBus_Enable(SD_HandleTypeDef *hsd)
3010 uint32_t scr[2U] = {0U, 0U};
3011 uint32_t errorstate;
3013 if((SDIO_GetResponse(hsd->Instance, SDIO_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
3015 return HAL_SD_ERROR_LOCK_UNLOCK_FAILED;
3019 errorstate = SD_FindSCR(hsd, scr);
3020 if(errorstate != HAL_SD_ERROR_NONE)
3026 if((scr[1U] & SDMMC_WIDE_BUS_SUPPORT) != SDMMC_ALLZERO)
3029 errorstate = SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
3030 if(errorstate != HAL_SD_ERROR_NONE)
3036 errorstate = SDMMC_CmdBusWidth(hsd->Instance, 2U);
3037 if(errorstate != HAL_SD_ERROR_NONE)
3042 return HAL_SD_ERROR_NONE;
3046 return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
3055static uint32_t SD_WideBus_Disable(SD_HandleTypeDef *hsd)
3057 uint32_t scr[2U] = {0U, 0U};
3058 uint32_t errorstate;
3060 if((SDIO_GetResponse(hsd->Instance, SDIO_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
3062 return HAL_SD_ERROR_LOCK_UNLOCK_FAILED;
3066 errorstate = SD_FindSCR(hsd, scr);
3067 if(errorstate != HAL_SD_ERROR_NONE)
3073 if((scr[1U] & SDMMC_SINGLE_BUS_SUPPORT) != SDMMC_ALLZERO)
3076 errorstate = SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
3077 if(errorstate != HAL_SD_ERROR_NONE)
3083 errorstate = SDMMC_CmdBusWidth(hsd->Instance, 0U);
3084 if(errorstate != HAL_SD_ERROR_NONE)
3089 return HAL_SD_ERROR_NONE;
3093 return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
3104static uint32_t SD_FindSCR(SD_HandleTypeDef *hsd, uint32_t *pSCR)
3106 SDIO_DataInitTypeDef config;
3107 uint32_t errorstate;
3109 uint32_t index = 0U;
3110 uint32_t tempscr[2U] = {0U, 0U};
3111 uint32_t *scr = pSCR;
3114 errorstate = SDMMC_CmdBlockLength(hsd->Instance, 8U);
3115 if(errorstate != HAL_SD_ERROR_NONE)
3121 errorstate = SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)((hsd->SdCard.RelCardAdd) << 16U));
3122 if(errorstate != HAL_SD_ERROR_NONE)
3127 config.DataTimeOut = SDMMC_DATATIMEOUT;
3128 config.DataLength = 8U;
3129 config.DataBlockSize = SDIO_DATABLOCK_SIZE_8B;
3130 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
3131 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
3132 config.DPSM = SDIO_DPSM_ENABLE;
3133 (void)SDIO_ConfigData(hsd->Instance, &config);
3136 errorstate = SDMMC_CmdSendSCR(hsd->Instance);
3137 if(errorstate != HAL_SD_ERROR_NONE)
3142 while(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT))
3144 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXDAVL))
3146 *(tempscr + index) = SDIO_ReadFIFO(hsd->Instance);
3149 else if(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXACT))
3154 if((
HAL_GetTick() - tickstart) >= SDMMC_SWDATATIMEOUT)
3156 return HAL_SD_ERROR_TIMEOUT;
3160#if defined(SDIO_STA_STBITERR)
3161 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT) || (__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_STBITERR)))
3163 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT))
3166 __HAL_SD_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT);
3168 return HAL_SD_ERROR_DATA_TIMEOUT;
3170 else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL))
3172 __HAL_SD_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL);
3174 return HAL_SD_ERROR_DATA_CRC_FAIL;
3176 else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR))
3178 __HAL_SD_CLEAR_FLAG(hsd, SDIO_FLAG_RXOVERR);
3180 return HAL_SD_ERROR_RX_OVERRUN;
3186 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
3188 *scr = (((tempscr[1] & SDMMC_0TO7BITS) << 24) | ((tempscr[1] & SDMMC_8TO15BITS) << 8) |\
3189 ((tempscr[1] & SDMMC_16TO23BITS) >> 8) | ((tempscr[1] & SDMMC_24TO31BITS) >> 24));
3191 *scr = (((tempscr[0] & SDMMC_0TO7BITS) << 24) | ((tempscr[0] & SDMMC_8TO15BITS) << 8) |\
3192 ((tempscr[0] & SDMMC_16TO23BITS) >> 8) | ((tempscr[0] & SDMMC_24TO31BITS) >> 24));
3196 return HAL_SD_ERROR_NONE;
3205static void SD_Read_IT(SD_HandleTypeDef *hsd)
3207 uint32_t count, data, dataremaining;
3210 tmp = hsd->pRxBuffPtr;
3211 dataremaining = hsd->RxXferSize;
3213 if (dataremaining > 0U)
3216 for(count = 0U; count < 8U; count++)
3218 data = SDIO_ReadFIFO(hsd->Instance);
3219 *tmp = (uint8_t)(data & 0xFFU);
3222 *tmp = (uint8_t)((data >> 8U) & 0xFFU);
3225 *tmp = (uint8_t)((data >> 16U) & 0xFFU);
3228 *tmp = (uint8_t)((data >> 24U) & 0xFFU);
3233 hsd->pRxBuffPtr = tmp;
3234 hsd->RxXferSize = dataremaining;
3244static void SD_Write_IT(SD_HandleTypeDef *hsd)
3246 uint32_t count, data, dataremaining;
3249 tmp = hsd->pTxBuffPtr;
3250 dataremaining = hsd->TxXferSize;
3252 if (dataremaining > 0U)
3255 for(count = 0U; count < 8U; count++)
3257 data = (uint32_t)(*tmp);
3260 data |= ((uint32_t)(*tmp) << 8U);
3263 data |= ((uint32_t)(*tmp) << 16U);
3266 data |= ((uint32_t)(*tmp) << 24U);
3269 (void)SDIO_WriteFIFO(hsd->Instance, &data);
3272 hsd->pTxBuffPtr = tmp;
3273 hsd->TxXferSize = dataremaining;
#define DMA_MEMORY_TO_PERIPH
#define DMA_PERIPH_TO_MEMORY
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma)
struct __DMA_HandleTypeDef DMA_HandleTypeDef
DMA handle Structure definition.
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 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__)