284 #ifdef HAL_SD_MODULE_ENABLED 313 #if !defined(STM32L4R5xx) && !defined(STM32L4R7xx) && !defined(STM32L4R9xx) && !defined(STM32L4S5xx) && !defined(STM32L4S7xx) && !defined(STM32L4S9xx) 356 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 358 uint32_t speedgrade, unitsize;
371 #if !defined(STM32L4R5xx) && !defined(STM32L4R7xx) && !defined(STM32L4R9xx) && !defined(STM32L4S5xx) && !defined(STM32L4S7xx) && !defined(STM32L4S9xx) 372 assert_param(IS_SDMMC_CLOCK_BYPASS(hsd->Init.ClockBypass));
374 assert_param(IS_SDMMC_CLOCK_POWER_SAVE(hsd->Init.ClockPowerSave));
376 assert_param(IS_SDMMC_HARDWARE_FLOW_CONTROL(hsd->Init.HardwareFlowControl));
379 if(hsd->State == HAL_SD_STATE_RESET)
383 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 389 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 397 if(hsd->MspInitCallback == NULL)
403 hsd->MspInitCallback(hsd);
410 hsd->State = HAL_SD_STATE_BUSY;
418 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 426 if ((hsd->SdCard.CardType == CARD_SDHC_SDXC) && ((speedgrade != 0U) || (unitsize != 0U)))
428 hsd->SdCard.CardSpeed = CARD_ULTRA_HIGH_SPEED;
432 if (hsd->SdCard.CardType == CARD_SDHC_SDXC)
434 hsd->SdCard.CardSpeed = CARD_HIGH_SPEED;
438 hsd->SdCard.CardSpeed = CARD_NORMAL_SPEED;
454 hsd->ErrorCode = HAL_SD_ERROR_TIMEOUT;
455 hsd->State= HAL_SD_STATE_READY;
462 hsd->ErrorCode = HAL_SD_ERROR_NONE;
465 hsd->Context = SD_CONTEXT_NONE;
468 hsd->State = HAL_SD_STATE_READY;
483 HAL_StatusTypeDef status;
487 Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING;
488 #if !defined(STM32L4R5xx) && !defined(STM32L4R7xx) && !defined(STM32L4R9xx) && !defined(STM32L4S5xx) && !defined(STM32L4S7xx) && !defined(STM32L4S9xx) 489 Init.ClockBypass = SDMMC_CLOCK_BYPASS_DISABLE;
491 Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE;
492 Init.BusWide = SDMMC_BUS_WIDE_1B;
493 Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;
494 Init.ClockDiv = SDMMC_INIT_CLK_DIV;
496 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 497 if(hsd->Init.Transceiver == SDMMC_TRANSCEIVER_ENABLE)
500 hsd->Instance->POWER |= SDMMC_POWER_DIRPOL;
511 #if !defined(STM32L4R5xx) && !defined(STM32L4R7xx) && !defined(STM32L4R9xx) && !defined(STM32L4S5xx) && !defined(STM32L4S7xx) && !defined(STM32L4S9xx) 513 __HAL_SD_DISABLE(hsd);
523 #if !defined(STM32L4R5xx) && !defined(STM32L4R7xx) && !defined(STM32L4R9xx) && !defined(STM32L4S5xx) && !defined(STM32L4S7xx) && !defined(STM32L4S9xx) 525 __HAL_SD_ENABLE(hsd);
530 if(errorstate != HAL_SD_ERROR_NONE)
532 hsd->State = HAL_SD_STATE_READY;
533 hsd->ErrorCode |= errorstate;
539 if(errorstate != HAL_SD_ERROR_NONE)
541 hsd->State = HAL_SD_STATE_READY;
542 hsd->ErrorCode |= errorstate;
565 hsd->State = HAL_SD_STATE_BUSY;
567 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 569 if(hsd->Init.Transceiver == SDMMC_TRANSCEIVER_ENABLE)
571 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 572 if(hsd->DriveTransceiver_1_8V_Callback == NULL)
576 hsd->DriveTransceiver_1_8V_Callback(RESET);
586 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 587 if(hsd->MspDeInitCallback == NULL)
593 hsd->MspDeInitCallback(hsd);
599 hsd->ErrorCode = HAL_SD_ERROR_NONE;
600 hsd->State = HAL_SD_STATE_RESET;
672 uint32_t count, data, dataremaining;
673 uint32_t add = BlockAdd;
674 uint8_t *tempbuff = pData;
678 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
682 if(hsd->State == HAL_SD_STATE_READY)
684 hsd->ErrorCode = HAL_SD_ERROR_NONE;
686 if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
688 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
692 hsd->State = HAL_SD_STATE_BUSY;
695 hsd->Instance->DCTRL = 0U;
697 if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
704 if(errorstate != HAL_SD_ERROR_NONE)
707 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
708 hsd->ErrorCode |= errorstate;
709 hsd->State = HAL_SD_STATE_READY;
715 config.
DataLength = NumberOfBlocks * BLOCKSIZE;
719 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 720 config.
DPSM = SDMMC_DPSM_DISABLE;
722 config.
DPSM = SDMMC_DPSM_ENABLE;
725 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 726 __SDMMC_CMDTRANS_ENABLE( hsd->Instance);
730 if(NumberOfBlocks > 1U)
732 hsd->Context = SD_CONTEXT_READ_MULTIPLE_BLOCK;
739 hsd->Context = SD_CONTEXT_READ_SINGLE_BLOCK;
744 if(errorstate != HAL_SD_ERROR_NONE)
747 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
748 hsd->ErrorCode |= errorstate;
749 hsd->State = HAL_SD_STATE_READY;
750 hsd->Context = SD_CONTEXT_NONE;
756 while(!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DATAEND))
758 if(__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXFIFOHF) && (dataremaining > 0U))
761 for(count = 0U; count < 8U; count++)
764 *tempbuff = (uint8_t)(data & 0xFFU);
767 *tempbuff = (uint8_t)((data >> 8U) & 0xFFU);
770 *tempbuff = (uint8_t)((data >> 16U) & 0xFFU);
773 *tempbuff = (uint8_t)((data >> 24U) & 0xFFU);
779 if(((
HAL_GetTick()-tickstart) >= Timeout) || (Timeout == 0U))
782 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
783 hsd->ErrorCode |= HAL_SD_ERROR_TIMEOUT;
784 hsd->State= HAL_SD_STATE_READY;
785 hsd->Context = SD_CONTEXT_NONE;
789 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 790 __SDMMC_CMDTRANS_DISABLE( hsd->Instance);
794 if(__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DATAEND) && (NumberOfBlocks > 1U))
796 if(hsd->SdCard.CardType != CARD_SECURED)
800 if(errorstate != HAL_SD_ERROR_NONE)
803 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
804 hsd->ErrorCode |= errorstate;
805 hsd->State = HAL_SD_STATE_READY;
806 hsd->Context = SD_CONTEXT_NONE;
813 if(__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DTIMEOUT))
816 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
817 hsd->ErrorCode |= HAL_SD_ERROR_DATA_TIMEOUT;
818 hsd->State = HAL_SD_STATE_READY;
819 hsd->Context = SD_CONTEXT_NONE;
822 else if(__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DCRCFAIL))
825 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
826 hsd->ErrorCode |= HAL_SD_ERROR_DATA_CRC_FAIL;
827 hsd->State = HAL_SD_STATE_READY;
828 hsd->Context = SD_CONTEXT_NONE;
831 else if(__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR))
834 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
835 hsd->ErrorCode |= HAL_SD_ERROR_RX_OVERRUN;
836 hsd->State = HAL_SD_STATE_READY;
837 hsd->Context = SD_CONTEXT_NONE;
845 #if !defined(STM32L4R5xx) && !defined(STM32L4R7xx) && !defined(STM32L4R9xx) && !defined(STM32L4S5xx) && !defined(STM32L4S7xx) && !defined(STM32L4S9xx) 847 while ((__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXDAVL)) && (dataremaining > 0U))
850 *tempbuff = (uint8_t)(data & 0xFFU);
853 *tempbuff = (uint8_t)((data >> 8U) & 0xFFU);
856 *tempbuff = (uint8_t)((data >> 16U) & 0xFFU);
859 *tempbuff = (uint8_t)((data >> 24U) & 0xFFU);
863 if(((
HAL_GetTick()-tickstart) >= Timeout) || (Timeout == 0U))
866 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
867 hsd->ErrorCode |= HAL_SD_ERROR_TIMEOUT;
868 hsd->State= HAL_SD_STATE_READY;
869 hsd->Context = SD_CONTEXT_NONE;
876 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
878 hsd->State = HAL_SD_STATE_READY;
884 hsd->ErrorCode |= HAL_SD_ERROR_BUSY;
906 uint32_t count, data, dataremaining;
907 uint32_t add = BlockAdd;
908 uint8_t *tempbuff = pData;
912 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
916 if(hsd->State == HAL_SD_STATE_READY)
918 hsd->ErrorCode = HAL_SD_ERROR_NONE;
920 if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
922 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
926 hsd->State = HAL_SD_STATE_BUSY;
929 hsd->Instance->DCTRL = 0U;
931 if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
938 if(errorstate != HAL_SD_ERROR_NONE)
941 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
942 hsd->ErrorCode |= errorstate;
943 hsd->State = HAL_SD_STATE_READY;
949 config.
DataLength = NumberOfBlocks * BLOCKSIZE;
953 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 954 config.
DPSM = SDMMC_DPSM_DISABLE;
956 config.
DPSM = SDMMC_DPSM_ENABLE;
959 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 960 __SDMMC_CMDTRANS_ENABLE( hsd->Instance);
964 if(NumberOfBlocks > 1U)
966 hsd->Context = SD_CONTEXT_WRITE_MULTIPLE_BLOCK;
973 hsd->Context = SD_CONTEXT_WRITE_SINGLE_BLOCK;
978 if(errorstate != HAL_SD_ERROR_NONE)
981 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
982 hsd->ErrorCode |= errorstate;
983 hsd->State = HAL_SD_STATE_READY;
984 hsd->Context = SD_CONTEXT_NONE;
990 while(!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_TXUNDERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DATAEND))
992 if(__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_TXFIFOHE) && (dataremaining > 0U))
995 for(count = 0U; count < 8U; count++)
997 data = (uint32_t)(*tempbuff);
1000 data |= ((uint32_t)(*tempbuff) << 8U);
1003 data |= ((uint32_t)(*tempbuff) << 16U);
1006 data |= ((uint32_t)(*tempbuff) << 24U);
1013 if(((
HAL_GetTick()-tickstart) >= Timeout) || (Timeout == 0U))
1016 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1017 hsd->ErrorCode |= errorstate;
1018 hsd->State = HAL_SD_STATE_READY;
1019 hsd->Context = SD_CONTEXT_NONE;
1023 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 1024 __SDMMC_CMDTRANS_DISABLE( hsd->Instance);
1028 if(__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DATAEND) && (NumberOfBlocks > 1U))
1030 if(hsd->SdCard.CardType != CARD_SECURED)
1034 if(errorstate != HAL_SD_ERROR_NONE)
1037 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1038 hsd->ErrorCode |= errorstate;
1039 hsd->State = HAL_SD_STATE_READY;
1040 hsd->Context = SD_CONTEXT_NONE;
1047 if(__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DTIMEOUT))
1050 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1051 hsd->ErrorCode |= HAL_SD_ERROR_DATA_TIMEOUT;
1052 hsd->State = HAL_SD_STATE_READY;
1053 hsd->Context = SD_CONTEXT_NONE;
1056 else if(__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DCRCFAIL))
1059 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1060 hsd->ErrorCode |= HAL_SD_ERROR_DATA_CRC_FAIL;
1061 hsd->State = HAL_SD_STATE_READY;
1062 hsd->Context = SD_CONTEXT_NONE;
1065 else if(__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_TXUNDERR))
1068 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1069 hsd->ErrorCode |= HAL_SD_ERROR_TX_UNDERRUN;
1070 hsd->State = HAL_SD_STATE_READY;
1071 hsd->Context = SD_CONTEXT_NONE;
1080 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
1082 hsd->State = HAL_SD_STATE_READY;
1088 hsd->ErrorCode |= HAL_SD_ERROR_BUSY;
1109 uint32_t errorstate;
1110 uint32_t add = BlockAdd;
1114 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
1118 if(hsd->State == HAL_SD_STATE_READY)
1120 hsd->ErrorCode = HAL_SD_ERROR_NONE;
1122 if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
1124 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
1128 hsd->State = HAL_SD_STATE_BUSY;
1131 hsd->Instance->DCTRL = 0U;
1133 hsd->pRxBuffPtr = pData;
1134 hsd->RxXferSize = BLOCKSIZE * NumberOfBlocks;
1136 __HAL_SD_ENABLE_IT(hsd, (SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | SDMMC_IT_RXOVERR | SDMMC_IT_DATAEND | SDMMC_FLAG_RXFIFOHF));
1138 if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
1145 if(errorstate != HAL_SD_ERROR_NONE)
1148 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1149 hsd->ErrorCode |= errorstate;
1150 hsd->State = HAL_SD_STATE_READY;
1156 config.
DataLength = BLOCKSIZE * NumberOfBlocks;
1160 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 1161 config.
DPSM = SDMMC_DPSM_DISABLE;
1163 config.
DPSM = SDMMC_DPSM_ENABLE;
1166 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 1167 __SDMMC_CMDTRANS_ENABLE( hsd->Instance);
1171 if(NumberOfBlocks > 1U)
1173 hsd->Context = (SD_CONTEXT_READ_MULTIPLE_BLOCK | SD_CONTEXT_IT);
1180 hsd->Context = (SD_CONTEXT_READ_SINGLE_BLOCK | SD_CONTEXT_IT);
1185 if(errorstate != HAL_SD_ERROR_NONE)
1188 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1189 hsd->ErrorCode |= errorstate;
1190 hsd->State = HAL_SD_STATE_READY;
1191 hsd->Context = SD_CONTEXT_NONE;
1219 uint32_t errorstate;
1220 uint32_t add = BlockAdd;
1224 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
1228 if(hsd->State == HAL_SD_STATE_READY)
1230 hsd->ErrorCode = HAL_SD_ERROR_NONE;
1232 if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
1234 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
1238 hsd->State = HAL_SD_STATE_BUSY;
1241 hsd->Instance->DCTRL = 0U;
1243 hsd->pTxBuffPtr = pData;
1244 hsd->TxXferSize = BLOCKSIZE * NumberOfBlocks;
1247 __HAL_SD_ENABLE_IT(hsd, (SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | SDMMC_IT_TXUNDERR | SDMMC_IT_DATAEND | SDMMC_FLAG_TXFIFOHE));
1249 if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
1256 if(errorstate != HAL_SD_ERROR_NONE)
1259 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1260 hsd->ErrorCode |= errorstate;
1261 hsd->State = HAL_SD_STATE_READY;
1265 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 1268 config.
DataLength = BLOCKSIZE * NumberOfBlocks;
1272 config.
DPSM = SDMMC_DPSM_DISABLE;
1275 __SDMMC_CMDTRANS_ENABLE( hsd->Instance);
1279 if(NumberOfBlocks > 1U)
1281 hsd->Context = (SD_CONTEXT_WRITE_MULTIPLE_BLOCK| SD_CONTEXT_IT);
1288 hsd->Context = (SD_CONTEXT_WRITE_SINGLE_BLOCK | SD_CONTEXT_IT);
1293 if(errorstate != HAL_SD_ERROR_NONE)
1296 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1297 hsd->ErrorCode |= errorstate;
1298 hsd->State = HAL_SD_STATE_READY;
1299 hsd->Context = SD_CONTEXT_NONE;
1303 #if !defined(STM32L4R5xx) && !defined(STM32L4R7xx) && !defined(STM32L4R9xx) && !defined(STM32L4S5xx) && !defined(STM32L4S7xx) && !defined(STM32L4S9xx) 1306 config.
DataLength = BLOCKSIZE * NumberOfBlocks;
1310 config.
DPSM = SDMMC_DPSM_ENABLE;
1338 uint32_t errorstate;
1339 uint32_t add = BlockAdd;
1343 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
1347 if(hsd->State == HAL_SD_STATE_READY)
1349 hsd->ErrorCode = HAL_SD_ERROR_NONE;
1351 if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
1353 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
1357 hsd->State = HAL_SD_STATE_BUSY;
1360 hsd->Instance->DCTRL = 0U;
1362 #if !defined(STM32L4R5xx) && !defined(STM32L4R7xx) && !defined(STM32L4R9xx) && !defined(STM32L4S5xx) && !defined(STM32L4S7xx) && !defined(STM32L4S9xx) 1363 __HAL_SD_ENABLE_IT(hsd, (SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | SDMMC_IT_RXOVERR | SDMMC_IT_DATAEND));
1372 hsd->hdmarx->XferAbortCallback = NULL;
1375 if(
HAL_DMA_Start_IT(hsd->hdmarx, (uint32_t)&hsd->Instance->FIFO, (uint32_t)pData, (uint32_t)(BLOCKSIZE * NumberOfBlocks)/4U) !=
HAL_OK)
1377 __HAL_SD_DISABLE_IT(hsd, (SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | SDMMC_IT_RXOVERR | SDMMC_IT_DATAEND));
1378 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1379 hsd->ErrorCode |= HAL_SD_ERROR_DMA;
1380 hsd->State = HAL_SD_STATE_READY;
1386 __HAL_SD_DMA_ENABLE(hsd);
1388 hsd->pRxBuffPtr = pData;
1389 hsd->RxXferSize = BLOCKSIZE * NumberOfBlocks;
1392 if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
1399 if(errorstate != HAL_SD_ERROR_NONE)
1402 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1403 hsd->ErrorCode |= errorstate;
1404 hsd->State = HAL_SD_STATE_READY;
1410 config.
DataLength = BLOCKSIZE * NumberOfBlocks;
1414 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 1415 config.
DPSM = SDMMC_DPSM_DISABLE;
1417 config.
DPSM = SDMMC_DPSM_ENABLE;
1421 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 1423 __HAL_SD_ENABLE_IT(hsd, (SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | SDMMC_IT_RXOVERR | SDMMC_IT_DATAEND));
1425 __SDMMC_CMDTRANS_ENABLE( hsd->Instance);
1426 hsd->Instance->IDMABASE0 = (uint32_t) pData ;
1427 hsd->Instance->IDMACTRL = SDMMC_ENABLE_IDMA_SINGLE_BUFF;
1431 if(NumberOfBlocks > 1U)
1433 hsd->Context = (SD_CONTEXT_READ_MULTIPLE_BLOCK | SD_CONTEXT_DMA);
1440 hsd->Context = (SD_CONTEXT_READ_SINGLE_BLOCK | SD_CONTEXT_DMA);
1445 if(errorstate != HAL_SD_ERROR_NONE)
1448 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1449 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 1450 __HAL_SD_DISABLE_IT(hsd, (SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | SDMMC_IT_RXOVERR | SDMMC_IT_DATAEND));
1452 hsd->ErrorCode |= errorstate;
1453 hsd->State = HAL_SD_STATE_READY;
1454 hsd->Context = SD_CONTEXT_NONE;
1459 #if !defined(STM32L4R5xx) && !defined(STM32L4R7xx) && !defined(STM32L4R9xx) && !defined(STM32L4S5xx) && !defined(STM32L4S7xx) && !defined(STM32L4S9xx) 1485 uint32_t errorstate;
1486 uint32_t add = BlockAdd;
1490 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
1494 if(hsd->State == HAL_SD_STATE_READY)
1496 hsd->ErrorCode = HAL_SD_ERROR_NONE;
1498 if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
1500 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
1504 hsd->State = HAL_SD_STATE_BUSY;
1507 hsd->Instance->DCTRL = 0U;
1509 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 1510 hsd->pTxBuffPtr = pData;
1511 hsd->TxXferSize = BLOCKSIZE * NumberOfBlocks;
1514 __HAL_SD_ENABLE_IT(hsd, (SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | SDMMC_IT_TXUNDERR));
1523 hsd->hdmatx->XferAbortCallback = NULL;
1526 if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
1533 if(errorstate != HAL_SD_ERROR_NONE)
1536 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1537 hsd->ErrorCode |= errorstate;
1538 hsd->State = HAL_SD_STATE_READY;
1541 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 1544 config.
DataLength = BLOCKSIZE * NumberOfBlocks;
1548 config.
DPSM = SDMMC_DPSM_DISABLE;
1552 __HAL_SD_ENABLE_IT(hsd, (SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | SDMMC_IT_TXUNDERR | SDMMC_IT_DATAEND));
1554 __SDMMC_CMDTRANS_ENABLE( hsd->Instance);
1556 hsd->Instance->IDMABASE0 = (uint32_t) pData ;
1557 hsd->Instance->IDMACTRL = SDMMC_ENABLE_IDMA_SINGLE_BUFF;
1561 if(NumberOfBlocks > 1U)
1563 hsd->Context = (SD_CONTEXT_WRITE_MULTIPLE_BLOCK | SD_CONTEXT_DMA);
1570 hsd->Context = (SD_CONTEXT_WRITE_SINGLE_BLOCK | SD_CONTEXT_DMA);
1575 if(errorstate != HAL_SD_ERROR_NONE)
1578 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1579 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 1580 __HAL_SD_DISABLE_IT(hsd, (SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | SDMMC_IT_TXUNDERR | SDMMC_IT_DATAEND));
1582 hsd->ErrorCode |= errorstate;
1583 hsd->State = HAL_SD_STATE_READY;
1584 hsd->Context = SD_CONTEXT_NONE;
1588 #if !defined(STM32L4R5xx) && !defined(STM32L4R7xx) && !defined(STM32L4R9xx) && !defined(STM32L4S5xx) && !defined(STM32L4S7xx) && !defined(STM32L4S9xx) 1590 __HAL_SD_DMA_ENABLE(hsd);
1593 if(
HAL_DMA_Start_IT(hsd->hdmatx, (uint32_t)pData, (uint32_t)&hsd->Instance->FIFO, (uint32_t)(BLOCKSIZE * NumberOfBlocks)/4U) !=
HAL_OK)
1595 __HAL_SD_DISABLE_IT(hsd, (SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | SDMMC_IT_TXUNDERR));
1596 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1597 hsd->ErrorCode |= HAL_SD_ERROR_DMA;
1598 hsd->State = HAL_SD_STATE_READY;
1599 hsd->Context = SD_CONTEXT_NONE;
1606 config.
DataLength = BLOCKSIZE * NumberOfBlocks;
1610 config.
DPSM = SDMMC_DPSM_ENABLE;
1615 #if !defined(STM32L4R5xx) && !defined(STM32L4R7xx) && !defined(STM32L4R9xx) && !defined(STM32L4S5xx) && !defined(STM32L4S7xx) && !defined(STM32L4S9xx) 1636 uint32_t errorstate;
1637 uint32_t start_add = BlockStartAdd;
1638 uint32_t end_add = BlockEndAdd;
1640 if(hsd->State == HAL_SD_STATE_READY)
1642 hsd->ErrorCode = HAL_SD_ERROR_NONE;
1644 if(end_add < start_add)
1646 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
1650 if(end_add > (hsd->SdCard.LogBlockNbr))
1652 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
1656 hsd->State = HAL_SD_STATE_BUSY;
1659 if(((hsd->SdCard.Class) & SDMMC_CCCC_ERASE) == 0U)
1662 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1663 hsd->ErrorCode |= HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
1664 hsd->State = HAL_SD_STATE_READY;
1668 if((
SDMMC_GetResponse(hsd->Instance, SDMMC_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
1671 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1672 hsd->ErrorCode |= HAL_SD_ERROR_LOCK_UNLOCK_FAILED;
1673 hsd->State = HAL_SD_STATE_READY;
1678 if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
1685 if(hsd->SdCard.CardType != CARD_SECURED)
1689 if(errorstate != HAL_SD_ERROR_NONE)
1692 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1693 hsd->ErrorCode |= errorstate;
1694 hsd->State = HAL_SD_STATE_READY;
1700 if(errorstate != HAL_SD_ERROR_NONE)
1703 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1704 hsd->ErrorCode |= errorstate;
1705 hsd->State = HAL_SD_STATE_READY;
1712 if(errorstate != HAL_SD_ERROR_NONE)
1715 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1716 hsd->ErrorCode |= errorstate;
1717 hsd->State = HAL_SD_STATE_READY;
1721 hsd->State = HAL_SD_STATE_READY;
1738 uint32_t errorstate;
1739 uint32_t context = hsd->Context;
1742 if((__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXFIFOHF) != RESET) && ((context & SD_CONTEXT_IT) != 0U))
1747 else if(__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DATAEND) != RESET)
1749 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DATAEND);
1751 __HAL_SD_DISABLE_IT(hsd, SDMMC_IT_DATAEND | SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT |\
1752 SDMMC_IT_TXUNDERR | SDMMC_IT_RXOVERR | SDMMC_IT_TXFIFOHE |\
1755 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 1756 __HAL_SD_DISABLE_IT(hsd, SDMMC_IT_IDMABTC);
1757 __SDMMC_CMDTRANS_DISABLE( hsd->Instance);
1759 hsd->Instance->DCTRL &= ~(SDMMC_DCTRL_DTEN);
1762 if((context & SD_CONTEXT_IT) != 0U)
1764 if(((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U) || ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
1767 if(errorstate != HAL_SD_ERROR_NONE)
1769 hsd->ErrorCode |= errorstate;
1770 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 1771 hsd->ErrorCallback(hsd);
1779 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
1781 hsd->State = HAL_SD_STATE_READY;
1782 hsd->Context = SD_CONTEXT_NONE;
1783 if(((context & SD_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
1785 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 1786 hsd->RxCpltCallback(hsd);
1793 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 1794 hsd->TxCpltCallback(hsd);
1800 else if((context & SD_CONTEXT_DMA) != 0U)
1802 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 1803 hsd->Instance->DLEN = 0;
1804 hsd->Instance->DCTRL = 0;
1805 hsd->Instance->IDMACTRL = SDMMC_DISABLE_IDMA;
1808 if(((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U) || ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
1811 if(errorstate != HAL_SD_ERROR_NONE)
1813 hsd->ErrorCode |= errorstate;
1814 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 1815 hsd->ErrorCallback(hsd);
1822 hsd->State = HAL_SD_STATE_READY;
1823 hsd->Context = SD_CONTEXT_NONE;
1824 if(((context & SD_CONTEXT_WRITE_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
1826 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 1827 hsd->TxCpltCallback(hsd);
1832 if(((context & SD_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
1834 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 1835 hsd->RxCpltCallback(hsd);
1841 if((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U)
1844 if(errorstate != HAL_SD_ERROR_NONE)
1846 hsd->ErrorCode |= errorstate;
1847 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 1848 hsd->ErrorCallback(hsd);
1854 if(((context & SD_CONTEXT_READ_SINGLE_BLOCK) == 0U) && ((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) == 0U))
1858 hsd->Instance->DCTRL &= (uint32_t)~((uint32_t)SDMMC_DCTRL_DMAEN);
1860 hsd->State = HAL_SD_STATE_READY;
1862 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 1863 hsd->TxCpltCallback(hsd);
1876 else if((__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_TXFIFOHE) != RESET) && ((context & SD_CONTEXT_IT) != 0U))
1881 else if(__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_RXOVERR | SDMMC_FLAG_TXUNDERR) != RESET)
1884 if(__HAL_SD_GET_FLAG(hsd, SDMMC_IT_DCRCFAIL) != RESET)
1886 hsd->ErrorCode |= HAL_SD_ERROR_DATA_CRC_FAIL;
1888 if(__HAL_SD_GET_FLAG(hsd, SDMMC_IT_DTIMEOUT) != RESET)
1890 hsd->ErrorCode |= HAL_SD_ERROR_DATA_TIMEOUT;
1892 if(__HAL_SD_GET_FLAG(hsd, SDMMC_IT_RXOVERR) != RESET)
1894 hsd->ErrorCode |= HAL_SD_ERROR_RX_OVERRUN;
1896 if(__HAL_SD_GET_FLAG(hsd, SDMMC_IT_TXUNDERR) != RESET)
1898 hsd->ErrorCode |= HAL_SD_ERROR_TX_UNDERRUN;
1902 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
1905 __HAL_SD_DISABLE_IT(hsd, SDMMC_IT_DATAEND | SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT|\
1906 SDMMC_IT_TXUNDERR| SDMMC_IT_RXOVERR);
1908 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 1909 __SDMMC_CMDTRANS_DISABLE( hsd->Instance);
1910 hsd->Instance->DCTRL |= SDMMC_DCTRL_FIFORST;
1911 hsd->Instance->CMD |= SDMMC_CMD_CMDSTOP;
1914 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 1915 hsd->Instance->CMD &= ~(SDMMC_CMD_CMDSTOP);
1916 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DABORT);
1919 if((context & SD_CONTEXT_IT) != 0U)
1922 hsd->State = HAL_SD_STATE_READY;
1923 hsd->Context = SD_CONTEXT_NONE;
1924 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 1925 hsd->ErrorCallback(hsd);
1930 else if((context & SD_CONTEXT_DMA) != 0U)
1932 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 1933 if(hsd->ErrorCode != HAL_SD_ERROR_NONE)
1936 __HAL_SD_DISABLE_IT(hsd, SDMMC_IT_IDMABTC);
1937 hsd->Instance->IDMACTRL = SDMMC_DISABLE_IDMA;
1940 hsd->State = HAL_SD_STATE_READY;
1941 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 1942 hsd->ErrorCallback(hsd);
1949 if(((context & SD_CONTEXT_WRITE_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
1959 else if(((context & SD_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
1971 hsd->ErrorCode = HAL_SD_ERROR_NONE;
1972 hsd->State = HAL_SD_STATE_READY;
1973 hsd->Context = SD_CONTEXT_NONE;
1974 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 1975 hsd->AbortCpltCallback(hsd);
1988 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 1989 else if(__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_IDMABTC) != RESET)
1991 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_IDMABTC);
1992 if(READ_BIT(hsd->Instance->IDMACTRL, SDMMC_IDMA_IDMABACT) == 0U)
1995 if((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U)
1997 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 1998 hsd->Write_DMADblBuf1CpltCallback(hsd);
2005 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 2006 hsd->Read_DMADblBuf1CpltCallback(hsd);
2015 if((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U)
2017 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 2018 hsd->Write_DMADblBuf0CpltCallback(hsd);
2025 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 2026 hsd->Read_DMADblBuf0CpltCallback(hsd);
2058 return hsd->ErrorCode;
2121 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 2143 HAL_StatusTypeDef status =
HAL_OK;
2145 if(pCallback == NULL)
2148 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
2155 if(hsd->State == HAL_SD_STATE_READY)
2160 hsd->TxCpltCallback = pCallback;
2163 hsd->RxCpltCallback = pCallback;
2166 hsd->ErrorCallback = pCallback;
2169 hsd->AbortCpltCallback = pCallback;
2171 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 2173 hsd->Read_DMADblBuf0CpltCallback = pCallback;
2176 hsd->Read_DMADblBuf1CpltCallback = pCallback;
2179 hsd->Write_DMADblBuf0CpltCallback = pCallback;
2182 hsd->Write_DMADblBuf1CpltCallback = pCallback;
2186 hsd->MspInitCallback = pCallback;
2189 hsd->MspDeInitCallback = pCallback;
2193 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
2199 else if (hsd->State == HAL_SD_STATE_RESET)
2204 hsd->MspInitCallback = pCallback;
2207 hsd->MspDeInitCallback = pCallback;
2211 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
2220 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
2250 HAL_StatusTypeDef status =
HAL_OK;
2255 if(hsd->State == HAL_SD_STATE_READY)
2271 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 2293 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
2299 else if (hsd->State == HAL_SD_STATE_RESET)
2311 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
2320 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
2330 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 2340 HAL_StatusTypeDef status =
HAL_OK;
2342 if(pCallback == NULL)
2345 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
2352 if(hsd->State == HAL_SD_STATE_READY)
2354 hsd->DriveTransceiver_1_8V_Callback = pCallback;
2359 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
2377 HAL_StatusTypeDef status =
HAL_OK;
2382 if(hsd->State == HAL_SD_STATE_READY)
2389 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
2430 pCID->
ManufacturerID = (uint8_t)((hsd->CID[0] & 0xFF000000U) >> 24U);
2432 pCID->
OEM_AppliID = (uint16_t)((hsd->CID[0] & 0x00FFFF00U) >> 8U);
2434 pCID->
ProdName1 = (((hsd->CID[0] & 0x000000FFU) << 24U) | ((hsd->CID[1] & 0xFFFFFF00U) >> 8U));
2436 pCID->
ProdName2 = (uint8_t)(hsd->CID[1] & 0x000000FFU);
2438 pCID->
ProdRev = (uint8_t)((hsd->CID[2] & 0xFF000000U) >> 24U);
2440 pCID->
ProdSN = (((hsd->CID[2] & 0x00FFFFFFU) << 8U) | ((hsd->CID[3] & 0xFF000000U) >> 24U));
2442 pCID->
Reserved1 = (uint8_t)((hsd->CID[3] & 0x00F00000U) >> 20U);
2444 pCID->
ManufactDate = (uint16_t)((hsd->CID[3] & 0x000FFF00U) >> 8U);
2446 pCID->
CID_CRC = (uint8_t)((hsd->CID[3] & 0x000000FEU) >> 1U);
2463 pCSD->
CSDStruct = (uint8_t)((hsd->CSD[0] & 0xC0000000U) >> 30U);
2465 pCSD->
SysSpecVersion = (uint8_t)((hsd->CSD[0] & 0x3C000000U) >> 26U);
2467 pCSD->
Reserved1 = (uint8_t)((hsd->CSD[0] & 0x03000000U) >> 24U);
2469 pCSD->
TAAC = (uint8_t)((hsd->CSD[0] & 0x00FF0000U) >> 16U);
2471 pCSD->
NSAC = (uint8_t)((hsd->CSD[0] & 0x0000FF00U) >> 8U);
2475 pCSD->
CardComdClasses = (uint16_t)((hsd->CSD[1] & 0xFFF00000U) >> 20U);
2477 pCSD->
RdBlockLen = (uint8_t)((hsd->CSD[1] & 0x000F0000U) >> 16U);
2479 pCSD->
PartBlockRead = (uint8_t)((hsd->CSD[1] & 0x00008000U) >> 15U);
2481 pCSD->
WrBlockMisalign = (uint8_t)((hsd->CSD[1] & 0x00004000U) >> 14U);
2483 pCSD->
RdBlockMisalign = (uint8_t)((hsd->CSD[1] & 0x00002000U) >> 13U);
2485 pCSD->
DSRImpl = (uint8_t)((hsd->CSD[1] & 0x00001000U) >> 12U);
2489 if(hsd->SdCard.CardType == CARD_SDSC)
2491 pCSD->
DeviceSize = (((hsd->CSD[1] & 0x000003FFU) << 2U) | ((hsd->CSD[2] & 0xC0000000U) >> 30U));
2501 pCSD->
DeviceSizeMul = (uint8_t)((hsd->CSD[2] & 0x00038000U) >> 15U);
2503 hsd->SdCard.BlockNbr = (pCSD->
DeviceSize + 1U) ;
2504 hsd->SdCard.BlockNbr *= (1UL << ((pCSD->
DeviceSizeMul & 0x07U) + 2U));
2505 hsd->SdCard.BlockSize = (1UL << (pCSD->
RdBlockLen & 0x0FU));
2507 hsd->SdCard.LogBlockNbr = (hsd->SdCard.BlockNbr) * ((hsd->SdCard.BlockSize) / 512U);
2508 hsd->SdCard.LogBlockSize = 512U;
2510 else if(hsd->SdCard.CardType == CARD_SDHC_SDXC)
2513 pCSD->
DeviceSize = (((hsd->CSD[1] & 0x0000003FU) << 16U) | ((hsd->CSD[2] & 0xFFFF0000U) >> 16U));
2515 hsd->SdCard.BlockNbr = ((pCSD->
DeviceSize + 1U) * 1024U);
2516 hsd->SdCard.LogBlockNbr = hsd->SdCard.BlockNbr;
2517 hsd->SdCard.BlockSize = 512U;
2518 hsd->SdCard.LogBlockSize = hsd->SdCard.BlockSize;
2523 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
2524 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2525 hsd->State = HAL_SD_STATE_READY;
2529 pCSD->
EraseGrSize = (uint8_t)((hsd->CSD[2] & 0x00004000U) >> 14U);
2531 pCSD->
EraseGrMul = (uint8_t)((hsd->CSD[2] & 0x00003F80U) >> 7U);
2537 pCSD->
ManDeflECC = (uint8_t)((hsd->CSD[3] & 0x60000000U) >> 29U);
2539 pCSD->
WrSpeedFact = (uint8_t)((hsd->CSD[3] & 0x1C000000U) >> 26U);
2541 pCSD->
MaxWrBlockLen= (uint8_t)((hsd->CSD[3] & 0x03C00000U) >> 22U);
2549 pCSD->
FileFormatGroup = (uint8_t)((hsd->CSD[3] & 0x00008000U) >> 15U);
2551 pCSD->
CopyFlag = (uint8_t)((hsd->CSD[3] & 0x00004000U) >> 14U);
2553 pCSD->
PermWrProtect = (uint8_t)((hsd->CSD[3] & 0x00002000U) >> 13U);
2555 pCSD->
TempWrProtect = (uint8_t)((hsd->CSD[3] & 0x00001000U) >> 12U);
2557 pCSD->
FileFormat = (uint8_t)((hsd->CSD[3] & 0x00000C00U) >> 10U);
2559 pCSD->
ECC= (uint8_t)((hsd->CSD[3] & 0x00000300U) >> 8U);
2561 pCSD->
CSD_CRC = (uint8_t)((hsd->CSD[3] & 0x000000FEU) >> 1U);
2577 uint32_t sd_status[16];
2578 uint32_t errorstate;
2581 if(errorstate != HAL_SD_ERROR_NONE)
2584 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
2585 hsd->ErrorCode |= errorstate;
2586 hsd->State = HAL_SD_STATE_READY;
2591 pStatus->
DataBusWidth = (uint8_t)((sd_status[0] & 0xC0U) >> 6U);
2593 pStatus->
SecuredMode = (uint8_t)((sd_status[0] & 0x20U) >> 5U);
2595 pStatus->
CardType = (uint16_t)(((sd_status[0] & 0x00FF0000U) >> 8U) | ((sd_status[0] & 0xFF000000U) >> 24U));
2597 pStatus->
ProtectedAreaSize = (((sd_status[1] & 0xFFU) << 24U) | ((sd_status[1] & 0xFF00U) << 8U) |
2598 ((sd_status[1] & 0xFF0000U) >> 8U) | ((sd_status[1] & 0xFF000000U) >> 24U));
2600 pStatus->
SpeedClass = (uint8_t)(sd_status[2] & 0xFFU);
2606 pStatus->
EraseSize = (uint16_t)(((sd_status[2] & 0xFF000000U) >> 16U) | (sd_status[3] & 0xFFU));
2608 pStatus->
EraseTimeout = (uint8_t)((sd_status[3] & 0xFC00U) >> 10U);
2610 pStatus->
EraseOffset = (uint8_t)((sd_status[3] & 0x0300U) >> 8U);
2612 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 2613 pStatus->
UhsSpeedGrade = (uint8_t)((sd_status[3] & 0x00F0U) >> 4U);
2615 pStatus->
VideoSpeedClass = (uint8_t)((sd_status[4] & 0xFF000000U) >> 24U);
2631 pCardInfo->
CardType = (uint32_t)(hsd->SdCard.CardType);
2632 pCardInfo->
CardVersion = (uint32_t)(hsd->SdCard.CardVersion);
2633 pCardInfo->
Class = (uint32_t)(hsd->SdCard.Class);
2634 pCardInfo->
RelCardAdd = (uint32_t)(hsd->SdCard.RelCardAdd);
2635 pCardInfo->
BlockNbr = (uint32_t)(hsd->SdCard.BlockNbr);
2636 pCardInfo->
BlockSize = (uint32_t)(hsd->SdCard.BlockSize);
2637 pCardInfo->
LogBlockNbr = (uint32_t)(hsd->SdCard.LogBlockNbr);
2638 pCardInfo->
LogBlockSize = (uint32_t)(hsd->SdCard.LogBlockSize);
2656 SDMMC_InitTypeDef
Init;
2657 uint32_t errorstate;
2663 hsd->State = HAL_SD_STATE_BUSY;
2665 if(hsd->SdCard.CardType != CARD_SECURED)
2667 if(WideMode == SDMMC_BUS_WIDE_8B)
2669 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2671 else if(WideMode == SDMMC_BUS_WIDE_4B)
2675 hsd->ErrorCode |= errorstate;
2677 else if(WideMode == SDMMC_BUS_WIDE_1B)
2681 hsd->ErrorCode |= errorstate;
2686 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
2692 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2695 if(hsd->ErrorCode != HAL_SD_ERROR_NONE)
2698 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
2699 hsd->State = HAL_SD_STATE_READY;
2705 Init.ClockEdge = hsd->Init.ClockEdge;
2706 #if !defined(STM32L4R5xx) && !defined(STM32L4R7xx) && !defined(STM32L4R9xx) && !defined(STM32L4S5xx) && !defined(STM32L4S7xx) && !defined(STM32L4S9xx) 2707 Init.ClockBypass = hsd->Init.ClockBypass;
2709 Init.ClockPowerSave = hsd->Init.ClockPowerSave;
2710 Init.BusWide = WideMode;
2711 Init.HardwareFlowControl = hsd->Init.HardwareFlowControl;
2713 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 2715 if(hsd->Init.ClockDiv >= SDMMC_NSpeed_CLK_DIV)
2717 Init.ClockDiv = hsd->Init.ClockDiv;
2719 else if (hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED)
2722 Init.ClockDiv = hsd->Init.ClockDiv;
2724 else if (hsd->SdCard.CardSpeed == CARD_HIGH_SPEED)
2727 Init.ClockDiv = SDMMC_HSpeed_CLK_DIV;
2732 Init.ClockDiv = SDMMC_NSpeed_CLK_DIV;
2735 Init.ClockDiv = hsd->Init.ClockDiv;
2742 hsd->State = HAL_SD_STATE_READY;
2747 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 2763 HAL_StatusTypeDef status =
HAL_OK;
2768 hsd->State = HAL_SD_STATE_BUSY;
2770 if(hsd->Init.Transceiver == SDMMC_TRANSCEIVER_ENABLE)
2774 case SDMMC_SPEED_MODE_AUTO:
2776 if ((hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED) ||
2777 (hsd->SdCard.CardType == CARD_SDHC_SDXC))
2779 hsd->Instance->CLKCR |= 0x00100000U;
2785 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2790 else if (hsd->SdCard.CardSpeed == CARD_HIGH_SPEED)
2795 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2805 case SDMMC_SPEED_MODE_ULTRA:
2807 if ((hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED) ||
2808 (hsd->SdCard.CardType == CARD_SDHC_SDXC))
2810 hsd->Instance->CLKCR |= 0x00100000U;
2814 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2820 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2825 case SDMMC_SPEED_MODE_DDR:
2827 if ((hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED) ||
2828 (hsd->SdCard.CardType == CARD_SDHC_SDXC))
2830 hsd->Instance->CLKCR |= 0x00100000U;
2834 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2840 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2845 case SDMMC_SPEED_MODE_HIGH:
2847 if ((hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED) ||
2848 (hsd->SdCard.CardSpeed == CARD_HIGH_SPEED) ||
2849 (hsd->SdCard.CardType == CARD_SDHC_SDXC))
2854 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2860 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2865 case SDMMC_SPEED_MODE_DEFAULT:
2868 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
2877 case SDMMC_SPEED_MODE_AUTO:
2879 if ((hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED) ||
2880 (hsd->SdCard.CardSpeed == CARD_HIGH_SPEED) ||
2881 (hsd->SdCard.CardType == CARD_SDHC_SDXC))
2886 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2896 case SDMMC_SPEED_MODE_HIGH:
2898 if ((hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED) ||
2899 (hsd->SdCard.CardSpeed == CARD_HIGH_SPEED) ||
2900 (hsd->SdCard.CardType == CARD_SDHC_SDXC))
2905 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2911 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2916 case SDMMC_SPEED_MODE_DEFAULT:
2918 case SDMMC_SPEED_MODE_ULTRA:
2920 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
2931 if ((
HAL_GetTick() - tickstart) >= SDMMC_DATATIMEOUT)
2933 hsd->ErrorCode = HAL_SD_ERROR_TIMEOUT;
2934 hsd->State = HAL_SD_STATE_READY;
2940 hsd->State = HAL_SD_STATE_READY;
2953 uint32_t errorstate;
2957 if(errorstate != HAL_SD_ERROR_NONE)
2959 hsd->ErrorCode |= errorstate;
2962 cardstate = ((resp1 >> 9U) & 0x0FU);
2976 #if !defined(STM32L4R5xx) && !defined(STM32L4R7xx) && !defined(STM32L4R9xx) && !defined(STM32L4S5xx) && !defined(STM32L4S7xx) && !defined(STM32L4S9xx) 2977 uint32_t context = hsd->Context;
2981 __HAL_SD_DISABLE_IT(hsd, SDMMC_IT_DATAEND | SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT|\
2982 SDMMC_IT_TXUNDERR| SDMMC_IT_RXOVERR);
2985 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
2987 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 2989 hsd->Instance->IDMACTRL = SDMMC_DISABLE_IDMA;
2991 CLEAR_BIT(hsd->Instance->DCTRL, SDMMC_DCTRL_DTEN);
2993 if ((context & SD_CONTEXT_DMA) != 0U)
2996 hsd->Instance->DCTRL &= (uint32_t)~((uint32_t)SDMMC_DCTRL_DMAEN);
2999 if (((context & SD_CONTEXT_WRITE_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
3003 hsd->ErrorCode |= HAL_SD_ERROR_DMA;
3007 else if (((context & SD_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
3011 hsd->ErrorCode |= HAL_SD_ERROR_DMA;
3021 hsd->State = HAL_SD_STATE_READY;
3024 hsd->Context = SD_CONTEXT_NONE;
3027 if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING))
3031 if(hsd->ErrorCode != HAL_SD_ERROR_NONE)
3047 #if !defined(STM32L4R5xx) && !defined(STM32L4R7xx) && !defined(STM32L4R9xx) && !defined(STM32L4S5xx) && !defined(STM32L4S7xx) && !defined(STM32L4S9xx) 3048 uint32_t context = hsd->Context;
3052 __HAL_SD_DISABLE_IT(hsd, SDMMC_IT_DATAEND | SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT|\
3053 SDMMC_IT_TXUNDERR| SDMMC_IT_RXOVERR);
3055 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 3057 hsd->Instance->IDMACTRL = SDMMC_DISABLE_IDMA;
3060 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
3063 hsd->State = HAL_SD_STATE_READY;
3065 if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING))
3070 if(hsd->ErrorCode != HAL_SD_ERROR_NONE)
3076 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 3077 hsd->AbortCpltCallback(hsd);
3083 CLEAR_BIT(hsd->Instance->DCTRL, SDMMC_DCTRL_DTEN);
3085 if ((context & SD_CONTEXT_DMA) != 0U)
3088 hsd->Instance->DCTRL &= (uint32_t)~((uint32_t)SDMMC_DCTRL_DMAEN);
3091 if (((context & SD_CONTEXT_WRITE_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
3100 else if (((context & SD_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
3117 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
3120 hsd->State = HAL_SD_STATE_READY;
3121 hsd->Context = SD_CONTEXT_NONE;
3122 if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING))
3126 if(hsd->ErrorCode != HAL_SD_ERROR_NONE)
3132 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 3133 hsd->AbortCpltCallback(hsd);
3157 #if !defined(STM32L4R5xx) && !defined(STM32L4R7xx) && !defined(STM32L4R9xx) && !defined(STM32L4S5xx) && !defined(STM32L4S7xx) && !defined(STM32L4S9xx) 3168 __HAL_SD_ENABLE_IT(hsd, (SDMMC_IT_DATAEND));
3179 uint32_t errorstate;
3182 if(hsd->Context == (SD_CONTEXT_READ_MULTIPLE_BLOCK | SD_CONTEXT_DMA))
3185 if(errorstate != HAL_SD_ERROR_NONE)
3187 hsd->ErrorCode |= errorstate;
3188 #if (USE_HAL_SD_REGISTER_CALLBACKS == 1) 3189 hsd->ErrorCallback(hsd);
3198 hsd->Instance->DCTRL &= (uint32_t)~((uint32_t)SDMMC_DCTRL_DMAEN);
3201 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
3203 hsd->State = HAL_SD_STATE_READY;
3204 hsd->Context = SD_CONTEXT_NONE;
3206 #if (USE_HAL_SD_REGISTER_CALLBACKS == 1) 3207 hsd->RxCpltCallback(hsd);
3222 uint32_t RxErrorCode, TxErrorCode;
3224 RxErrorCode = hsd->hdmarx->ErrorCode;
3225 TxErrorCode = hsd->hdmatx->ErrorCode;
3226 if((RxErrorCode == HAL_DMA_ERROR_TE) || (TxErrorCode == HAL_DMA_ERROR_TE))
3229 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
3232 __HAL_SD_DISABLE_IT(hsd, SDMMC_IT_DATAEND | SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT|\
3233 SDMMC_IT_TXUNDERR| SDMMC_IT_RXOVERR);
3235 hsd->ErrorCode |= HAL_SD_ERROR_DMA;
3237 if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING))
3242 hsd->State= HAL_SD_STATE_READY;
3243 hsd->Context = SD_CONTEXT_NONE;
3246 #if (USE_HAL_SD_REGISTER_CALLBACKS == 1) 3247 hsd->ErrorCallback(hsd);
3264 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
3267 hsd->State = HAL_SD_STATE_READY;
3268 hsd->Context = SD_CONTEXT_NONE;
3269 if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING))
3274 if(hsd->ErrorCode == HAL_SD_ERROR_NONE)
3276 #if (USE_HAL_SD_REGISTER_CALLBACKS == 1) 3277 hsd->AbortCpltCallback(hsd);
3284 #if (USE_HAL_SD_REGISTER_CALLBACKS == 1) 3285 hsd->ErrorCallback(hsd);
3303 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
3306 hsd->State = HAL_SD_STATE_READY;
3307 hsd->Context = SD_CONTEXT_NONE;
3308 if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING))
3313 if(hsd->ErrorCode == HAL_SD_ERROR_NONE)
3315 #if (USE_HAL_SD_REGISTER_CALLBACKS == 1) 3316 hsd->AbortCpltCallback(hsd);
3323 #if (USE_HAL_SD_REGISTER_CALLBACKS == 1) 3324 hsd->ErrorCallback(hsd);
3340 uint32_t errorstate;
3341 uint16_t sd_rca = 1U;
3347 return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
3350 if(hsd->SdCard.CardType != CARD_SECURED)
3354 if(errorstate != HAL_SD_ERROR_NONE)
3368 if(hsd->SdCard.CardType != CARD_SECURED)
3373 if(errorstate != HAL_SD_ERROR_NONE)
3378 if(hsd->SdCard.CardType != CARD_SECURED)
3381 hsd->SdCard.RelCardAdd = sd_rca;
3384 errorstate =
SDMMC_CmdSendCSD(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
3385 if(errorstate != HAL_SD_ERROR_NONE)
3405 return HAL_SD_ERROR_UNSUPPORTED_FEATURE;
3409 errorstate =
SDMMC_CmdSelDesel(hsd->Instance, (uint32_t)(((uint32_t)hsd->SdCard.RelCardAdd) << 16U));
3410 if(errorstate != HAL_SD_ERROR_NONE)
3415 #if !defined(STM32L4R5xx) && !defined(STM32L4R7xx) && !defined(STM32L4R9xx) && !defined(STM32L4S5xx) && !defined(STM32L4S7xx) && !defined(STM32L4S9xx) 3421 return HAL_SD_ERROR_NONE;
3433 __IO uint32_t count = 0U;
3434 uint32_t response = 0U, validvoltage = 0U;
3435 uint32_t errorstate;
3436 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 3442 if(errorstate != HAL_SD_ERROR_NONE)
3449 if(errorstate != HAL_SD_ERROR_NONE)
3451 hsd->SdCard.CardVersion = CARD_V1_X;
3454 if(errorstate != HAL_SD_ERROR_NONE)
3462 hsd->SdCard.CardVersion = CARD_V2_X;
3465 if( hsd->SdCard.CardVersion == CARD_V2_X)
3469 if(errorstate != HAL_SD_ERROR_NONE)
3471 return HAL_SD_ERROR_UNSUPPORTED_FEATURE;
3476 while((count < SDMMC_MAX_VOLT_TRIAL) && (validvoltage == 0U))
3480 if(errorstate != HAL_SD_ERROR_NONE)
3486 errorstate =
SDMMC_CmdAppOperCommand(hsd->Instance, SDMMC_VOLTAGE_WINDOW_SD | SDMMC_HIGH_CAPACITY | SD_SWITCH_1_8V_CAPACITY);
3487 if(errorstate != HAL_SD_ERROR_NONE)
3489 return HAL_SD_ERROR_UNSUPPORTED_FEATURE;
3496 validvoltage = (((response >> 31U) == 1U) ? 1U : 0U);
3501 if(count >= SDMMC_MAX_VOLT_TRIAL)
3503 return HAL_SD_ERROR_INVALID_VOLTRANGE;
3506 if((response & SDMMC_HIGH_CAPACITY) == SDMMC_HIGH_CAPACITY)
3508 hsd->SdCard.CardType = CARD_SDHC_SDXC;
3509 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 3510 if(hsd->Init.Transceiver == SDMMC_TRANSCEIVER_ENABLE)
3512 if((response & SD_SWITCH_1_8V_CAPACITY) == SD_SWITCH_1_8V_CAPACITY)
3514 hsd->SdCard.CardSpeed = CARD_ULTRA_HIGH_SPEED;
3517 hsd->Instance->POWER |= SDMMC_POWER_VSWITCHEN;
3521 if(errorstate != HAL_SD_ERROR_NONE)
3527 while(( hsd->Instance->STA & SDMMC_FLAG_CKSTOP) != SDMMC_FLAG_CKSTOP)
3529 if((
HAL_GetTick() - tickstart) >= SDMMC_DATATIMEOUT)
3531 return HAL_SD_ERROR_TIMEOUT;
3536 hsd->Instance->ICR = SDMMC_FLAG_CKSTOP;
3539 if(( hsd->Instance->STA & SDMMC_FLAG_BUSYD0) != SDMMC_FLAG_BUSYD0)
3542 return SDMMC_ERROR_UNSUPPORTED_FEATURE;
3547 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 3548 hsd->DriveTransceiver_1_8V_Callback(SET);
3554 hsd->Instance->POWER |= SDMMC_POWER_VSWITCH;
3557 while(( hsd->Instance->STA & SDMMC_FLAG_VSWEND) != SDMMC_FLAG_VSWEND)
3559 if((
HAL_GetTick() - tickstart) >= SDMMC_DATATIMEOUT)
3561 return HAL_SD_ERROR_TIMEOUT;
3566 hsd->Instance->ICR = SDMMC_FLAG_VSWEND;
3569 if(( hsd->Instance->STA & SDMMC_FLAG_BUSYD0) == SDMMC_FLAG_BUSYD0)
3572 return HAL_SD_ERROR_INVALID_VOLTRANGE;
3577 hsd->Instance->POWER = 0x13U;
3580 hsd->Instance->ICR = 0xFFFFFFFFU;
3583 hsd->SdCard.CardSpeed = CARD_ULTRA_HIGH_SPEED;
3590 hsd->SdCard.CardType = CARD_SDSC;
3594 return HAL_SD_ERROR_NONE;
3618 uint32_t errorstate;
3621 uint32_t *pData = pSDstatus;
3624 if((
SDMMC_GetResponse(hsd->Instance, SDMMC_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
3626 return HAL_SD_ERROR_LOCK_UNLOCK_FAILED;
3631 if(errorstate != HAL_SD_ERROR_NONE)
3633 hsd->ErrorCode |= HAL_SD_ERROR_NONE;
3638 errorstate =
SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
3639 if(errorstate != HAL_SD_ERROR_NONE)
3641 hsd->ErrorCode |= HAL_SD_ERROR_NONE;
3651 config.
DPSM = SDMMC_DPSM_ENABLE;
3656 if(errorstate != HAL_SD_ERROR_NONE)
3658 hsd->ErrorCode |= HAL_SD_ERROR_NONE;
3663 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 3664 while(!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DATAEND))
3666 while(!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DBCKEND))
3669 if(__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXFIFOHF))
3671 for(count = 0U; count < 8U; count++)
3678 if((
HAL_GetTick() - tickstart) >= SDMMC_DATATIMEOUT)
3680 return HAL_SD_ERROR_TIMEOUT;
3684 if(__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DTIMEOUT))
3686 return HAL_SD_ERROR_DATA_TIMEOUT;
3688 else if(__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DCRCFAIL))
3690 return HAL_SD_ERROR_DATA_CRC_FAIL;
3692 else if(__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR))
3694 return HAL_SD_ERROR_RX_OVERRUN;
3701 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 3702 while ((__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DPSMACT)))
3704 while ((__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXDAVL)))
3710 if((
HAL_GetTick() - tickstart) >= SDMMC_DATATIMEOUT)
3712 return HAL_SD_ERROR_TIMEOUT;
3717 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
3719 return HAL_SD_ERROR_NONE;
3731 uint32_t errorstate;
3733 if(pCardStatus == NULL)
3735 return HAL_SD_ERROR_PARAM;
3739 errorstate =
SDMMC_CmdSendStatus(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
3740 if(errorstate != HAL_SD_ERROR_NONE)
3748 return HAL_SD_ERROR_NONE;
3758 uint32_t scr[2U] = {0U, 0U};
3759 uint32_t errorstate;
3761 if((
SDMMC_GetResponse(hsd->Instance, SDMMC_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
3763 return HAL_SD_ERROR_LOCK_UNLOCK_FAILED;
3768 if(errorstate != HAL_SD_ERROR_NONE)
3774 if((scr[1U] & SDMMC_WIDE_BUS_SUPPORT) != SDMMC_ALLZERO)
3777 errorstate =
SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
3778 if(errorstate != HAL_SD_ERROR_NONE)
3785 if(errorstate != HAL_SD_ERROR_NONE)
3790 return HAL_SD_ERROR_NONE;
3794 return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
3805 uint32_t scr[2U] = {0U, 0U};
3806 uint32_t errorstate;
3808 if((
SDMMC_GetResponse(hsd->Instance, SDMMC_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
3810 return HAL_SD_ERROR_LOCK_UNLOCK_FAILED;
3815 if(errorstate != HAL_SD_ERROR_NONE)
3821 if((scr[1U] & SDMMC_SINGLE_BUS_SUPPORT) != SDMMC_ALLZERO)
3824 errorstate =
SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
3825 if(errorstate != HAL_SD_ERROR_NONE)
3832 if(errorstate != HAL_SD_ERROR_NONE)
3837 return HAL_SD_ERROR_NONE;
3841 return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
3855 uint32_t errorstate;
3857 uint32_t index = 0U;
3858 uint32_t tempscr[2U] = {0U, 0U};
3859 uint32_t *scr = pSCR;
3863 if(errorstate != HAL_SD_ERROR_NONE)
3869 errorstate =
SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)((hsd->SdCard.RelCardAdd) << 16U));
3870 if(errorstate != HAL_SD_ERROR_NONE)
3880 config.
DPSM = SDMMC_DPSM_ENABLE;
3885 if(errorstate != HAL_SD_ERROR_NONE)
3890 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 3891 while(!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DBCKEND | SDMMC_FLAG_DATAEND))
3893 if((!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXFIFOE)) && (index == 0U))
3901 if((
HAL_GetTick() - tickstart) >= SDMMC_DATATIMEOUT)
3903 return HAL_SD_ERROR_TIMEOUT;
3907 while(!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DBCKEND))
3909 if(__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXDAVL))
3915 if((
HAL_GetTick() - tickstart) >= SDMMC_DATATIMEOUT)
3917 return HAL_SD_ERROR_TIMEOUT;
3922 if(__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DTIMEOUT))
3924 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DTIMEOUT);
3926 return HAL_SD_ERROR_DATA_TIMEOUT;
3928 else if(__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DCRCFAIL))
3930 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DCRCFAIL);
3932 return HAL_SD_ERROR_DATA_CRC_FAIL;
3934 else if(__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR))
3936 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_RXOVERR);
3938 return HAL_SD_ERROR_RX_OVERRUN;
3944 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
3946 *scr = (((tempscr[1] & SDMMC_0TO7BITS) << 24) | ((tempscr[1] & SDMMC_8TO15BITS) << 8) |\
3947 ((tempscr[1] & SDMMC_16TO23BITS) >> 8) | ((tempscr[1] & SDMMC_24TO31BITS) >> 24));
3949 *scr = (((tempscr[0] & SDMMC_0TO7BITS) << 24) | ((tempscr[0] & SDMMC_8TO15BITS) << 8) |\
3950 ((tempscr[0] & SDMMC_16TO23BITS) >> 8) | ((tempscr[0] & SDMMC_24TO31BITS) >> 24));
3954 return HAL_SD_ERROR_NONE;
3965 uint32_t count, data, dataremaining;
3968 tmp = hsd->pRxBuffPtr;
3969 dataremaining = hsd->RxXferSize;
3971 if (dataremaining > 0U)
3974 for(count = 0U; count < 8U; count++)
3977 *tmp = (uint8_t)(data & 0xFFU);
3980 *tmp = (uint8_t)((data >> 8U) & 0xFFU);
3983 *tmp = (uint8_t)((data >> 16U) & 0xFFU);
3986 *tmp = (uint8_t)((data >> 24U) & 0xFFU);
3991 hsd->pRxBuffPtr = tmp;
3992 hsd->RxXferSize = dataremaining;
4004 uint32_t count, data, dataremaining;
4007 tmp = hsd->pTxBuffPtr;
4008 dataremaining = hsd->TxXferSize;
4010 if (dataremaining > 0U)
4013 for(count = 0U; count < 8U; count++)
4015 data = (uint32_t)(*tmp);
4018 data |= ((uint32_t)(*tmp) << 8U);
4021 data |= ((uint32_t)(*tmp) << 16U);
4024 data |= ((uint32_t)(*tmp) << 24U);
4030 hsd->pTxBuffPtr = tmp;
4031 hsd->TxXferSize = dataremaining;
4035 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) 4046 uint32_t errorstate = HAL_SD_ERROR_NONE;
4048 uint32_t SD_hs[16] = {0};
4049 uint32_t count, loop = 0 ;
4052 if(hsd->SdCard.CardSpeed == CARD_NORMAL_SPEED)
4055 return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
4058 if(hsd->SdCard.CardSpeed == CARD_HIGH_SPEED)
4061 hsd->Instance->DCTRL = 0;
4064 if (errorstate != HAL_SD_ERROR_NONE)
4070 sdmmc_datainitstructure.
DataTimeOut = SDMMC_DATATIMEOUT;
4072 sdmmc_datainitstructure.
DataBlockSize = SDMMC_DATABLOCK_SIZE_64B ;
4073 sdmmc_datainitstructure.
TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
4074 sdmmc_datainitstructure.
TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
4075 sdmmc_datainitstructure.
DPSM = SDMMC_DPSM_ENABLE;
4079 return (HAL_SD_ERROR_GENERAL_UNKNOWN_ERR);
4083 errorstate =
SDMMC_CmdSwitch(hsd->Instance,SDMMC_SDR25_SWITCH_PATTERN);
4084 if(errorstate != HAL_SD_ERROR_NONE)
4089 while(!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DBCKEND| SDMMC_FLAG_DATAEND ))
4091 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXFIFOHF))
4093 for (count = 0U; count < 8U; count++)
4102 hsd->ErrorCode = HAL_SD_ERROR_TIMEOUT;
4103 hsd->State= HAL_SD_STATE_READY;
4104 return HAL_SD_ERROR_TIMEOUT;
4108 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DTIMEOUT))
4110 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DTIMEOUT);
4116 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DCRCFAIL))
4118 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DCRCFAIL);
4120 errorstate = SDMMC_ERROR_DATA_CRC_FAIL;
4124 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR))
4126 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_RXOVERR);
4128 errorstate = SDMMC_ERROR_RX_OVERRUN;
4138 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
4141 if ((((uint8_t*)SD_hs)[13] & 2U) != 2U)
4143 errorstate = SDMMC_ERROR_UNSUPPORTED_FEATURE;
4161 uint32_t errorstate = HAL_SD_ERROR_NONE;
4163 uint32_t SD_hs[16] = {0};
4164 uint32_t count, loop = 0 ;
4167 if(hsd->SdCard.CardSpeed == CARD_NORMAL_SPEED)
4170 return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
4173 if((hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED) &&
4174 (hsd->Init.Transceiver == SDMMC_TRANSCEIVER_ENABLE))
4177 hsd->Instance->DCTRL = 0;
4180 if (errorstate != HAL_SD_ERROR_NONE)
4186 sdmmc_datainitstructure.
DataTimeOut = SDMMC_DATATIMEOUT;
4188 sdmmc_datainitstructure.
DataBlockSize = SDMMC_DATABLOCK_SIZE_64B ;
4189 sdmmc_datainitstructure.
TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
4190 sdmmc_datainitstructure.
TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
4191 sdmmc_datainitstructure.
DPSM = SDMMC_DPSM_ENABLE;
4195 return (HAL_SD_ERROR_GENERAL_UNKNOWN_ERR);
4198 errorstate =
SDMMC_CmdSwitch(hsd->Instance, SDMMC_SDR104_SWITCH_PATTERN);
4199 if(errorstate != HAL_SD_ERROR_NONE)
4204 while(!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DBCKEND| SDMMC_FLAG_DATAEND ))
4206 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXFIFOHF))
4208 for (count = 0U; count < 8U; count++)
4217 hsd->ErrorCode = HAL_SD_ERROR_TIMEOUT;
4218 hsd->State= HAL_SD_STATE_READY;
4219 return HAL_SD_ERROR_TIMEOUT;
4223 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DTIMEOUT))
4225 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DTIMEOUT);
4231 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DCRCFAIL))
4233 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DCRCFAIL);
4235 errorstate = SDMMC_ERROR_DATA_CRC_FAIL;
4239 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR))
4241 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_RXOVERR);
4243 errorstate = SDMMC_ERROR_RX_OVERRUN;
4253 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
4256 if ((((uint8_t*)SD_hs)[13] & 2U) != 2U)
4258 errorstate = SDMMC_ERROR_UNSUPPORTED_FEATURE;
4262 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 4263 hsd->DriveTransceiver_1_8V_Callback(SET);
4267 #if defined (DLYB_SDMMC1) || defined (DLYB_SDMMC2) 4270 MODIFY_REG(hsd->Instance->CLKCR, SDMMC_CLKCR_SELCLKRX,SDMMC_CLKCR_SELCLKRX_1);
4271 if (DelayBlock_Enable(SD_GET_DLYB_INSTANCE(hsd->Instance)) !=
HAL_OK)
4273 return (HAL_SD_ERROR_GENERAL_UNKNOWN_ERR);
4292 uint32_t errorstate = HAL_SD_ERROR_NONE;
4294 uint32_t SD_hs[16] = {0};
4295 uint32_t count, loop = 0 ;
4298 if(hsd->SdCard.CardSpeed == CARD_NORMAL_SPEED)
4301 return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
4304 if((hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED) &&
4305 (hsd->Init.Transceiver == SDMMC_TRANSCEIVER_ENABLE))
4308 hsd->Instance->DCTRL = 0;
4311 if (errorstate != HAL_SD_ERROR_NONE)
4317 sdmmc_datainitstructure.
DataTimeOut = SDMMC_DATATIMEOUT;
4319 sdmmc_datainitstructure.
DataBlockSize = SDMMC_DATABLOCK_SIZE_64B ;
4320 sdmmc_datainitstructure.
TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
4321 sdmmc_datainitstructure.
TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
4322 sdmmc_datainitstructure.
DPSM = SDMMC_DPSM_ENABLE;
4326 return (HAL_SD_ERROR_GENERAL_UNKNOWN_ERR);
4329 errorstate =
SDMMC_CmdSwitch(hsd->Instance, SDMMC_DDR50_SWITCH_PATTERN);
4330 if(errorstate != HAL_SD_ERROR_NONE)
4335 while(!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DBCKEND| SDMMC_FLAG_DATAEND ))
4337 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXFIFOHF))
4339 for (count = 0U; count < 8U; count++)
4348 hsd->ErrorCode = HAL_SD_ERROR_TIMEOUT;
4349 hsd->State= HAL_SD_STATE_READY;
4350 return HAL_SD_ERROR_TIMEOUT;
4354 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DTIMEOUT))
4356 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DTIMEOUT);
4362 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DCRCFAIL))
4364 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DCRCFAIL);
4366 errorstate = SDMMC_ERROR_DATA_CRC_FAIL;
4370 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR))
4372 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_RXOVERR);
4374 errorstate = SDMMC_ERROR_RX_OVERRUN;
4384 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
4387 if ((((uint8_t*)SD_hs)[13] & 2U) != 2U)
4389 errorstate = SDMMC_ERROR_UNSUPPORTED_FEATURE;
4393 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 4394 hsd->DriveTransceiver_1_8V_Callback(SET);
4398 #if defined (DLYB_SDMMC1) || defined (DLYB_SDMMC2) 4401 MODIFY_REG(hsd->Instance->CLKCR, SDMMC_CLKCR_SELCLKRX,SDMMC_CLKCR_SELCLKRX_1);
4402 if (DelayBlock_Enable(SD_GET_DLYB_INSTANCE(hsd->Instance)) !=
HAL_OK)
4404 return (HAL_SD_ERROR_GENERAL_UNKNOWN_ERR);
static void SD_DMAError(DMA_HandleTypeDef *hdma)
DMA SD communication error callback.
uint32_t SDMMC_CmdBlockLength(SDMMC_TypeDef *SDMMCx, uint32_t BlockSize)
Send the Data Block Lenght command and check the response.
uint32_t SDMMC_CmdOperCond(SDMMC_TypeDef *SDMMCx)
Send the Operating Condition command and check the response.
__IO uint8_t AllocationUnitSize
__IO uint32_t ProtectedAreaSize
__IO uint16_t CardComdClasses
__IO uint8_t PartBlockRead
static void SD_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
DMA SD receive process complete callback.
void(* pSD_TransceiverCallbackTypeDef)(FlagStatus status)
static uint32_t SD_DDR_Mode(SD_HandleTypeDef *hsd)
Switches the SD card to Double Data Rate (DDR) mode. This API must be used after "Transfer State"...
uint32_t SDMMC_CmdSelDesel(SDMMC_TypeDef *SDMMCx, uint64_t Addr)
Send the Select Deselect command and check the response.
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 SDMMC_CmdVoltageSwitch(SDMMC_TypeDef *SDMMCx)
Send the command asking the accessed card to send its operating condition register (OCR) ...
HAL_StatusTypeDef HAL_SD_UnRegisterTransceiverCallback(SD_HandleTypeDef *hsd)
Unregister a User SD Transceiver Callback SD Callback is redirected to the weak (surcharged) predefin...
void HAL_SD_MspInit(SD_HandleTypeDef *hsd)
Initializes the SD MSP.
__IO uint8_t MaxRdCurrentVDDMax
DMA handle Structure definition.
__IO uint8_t EraseTimeout
uint32_t SDMMC_CmdReadSingleBlock(SDMMC_TypeDef *SDMMCx, uint32_t ReadAdd)
Send the Read Single Block command and check the response.
HAL_StatusTypeDef HAL_SD_Erase(SD_HandleTypeDef *hsd, uint32_t BlockStartAdd, uint32_t BlockEndAdd)
Erases the specified memory area of the given SD card.
static uint32_t SD_WideBus_Disable(SD_HandleTypeDef *hsd)
Disables the SDMMC wide bus mode.
HAL_StatusTypeDef HAL_SD_GetCardStatus(SD_HandleTypeDef *hsd, HAL_SD_CardStatusTypeDef *pStatus)
Gets the SD status info.
__IO uint8_t VideoSpeedClass
uint32_t SDMMC_CmdWriteMultiBlock(SDMMC_TypeDef *SDMMCx, uint32_t WriteAdd)
Send the Write Multi Block command and check the response.
static uint32_t SD_WideBus_Enable(SD_HandleTypeDef *hsd)
Enables the SDMMC wide bus mode.
uint32_t SD_HighSpeed(SD_HandleTypeDef *hsd)
Switches the SD card to High Speed mode. This API must be used after "Transfer State".
void HAL_SD_ErrorCallback(SD_HandleTypeDef *hsd)
SD error callbacks.
This file contains all the functions prototypes for the HAL module driver.
HAL_StatusTypeDef HAL_SD_DeInit(SD_HandleTypeDef *hsd)
De-Initializes the SD card.
static uint32_t SD_UltraHighSpeed(SD_HandleTypeDef *hsd)
Switches the SD card to Ultra High Speed mode. This API must be used after "Transfer State"...
__IO uint8_t PermWrProtect
__IO uint8_t ContentProtectAppli
SDMMC Data Control structure.
__IO uint8_t MaxWrCurrentVDDMax
uint32_t SDMMC_CmdErase(SDMMC_TypeDef *SDMMCx)
Send the Erase command and check the response.
struct __SD_HandleTypeDef else typedef struct endif SD_HandleTypeDef
SD handle Structure definition.
__IO uint8_t DeviceSizeMul
uint32_t SDMMC_CmdSendStatus(SDMMC_TypeDef *SDMMCx, uint32_t Argument)
Send the Status command and check the response.
__IO uint8_t WriteBlockPaPartial
HAL_StatusTypeDef HAL_SD_ConfigWideBusOperation(SD_HandleTypeDef *hsd, uint32_t WideMode)
Enables wide bus operation for the requested card if supported by card.
uint32_t SDMMC_CmdSwitch(SDMMC_TypeDef *SDMMCx, uint32_t Argument)
Checks switchable function and switch card function. SDMMC_CMD_HS_SWITCH comand.
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
HAL_StatusTypeDef HAL_SD_ConfigSpeedBusOperation(SD_HandleTypeDef *hsd, uint32_t SpeedMode)
Configure the speed bus mode.
HAL_StatusTypeDef HAL_SD_InitCard(SD_HandleTypeDef *hsd)
Initializes the SD Card.
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...
HAL_SD_CardStateTypeDef HAL_SD_GetCardState(SD_HandleTypeDef *hsd)
Gets the current sd card data state.
__IO uint8_t MaxBusClkFrec
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
Aborts the DMA Transfer in Interrupt mode.
void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)
Rx Transfer completed callbacks.
static void SD_DMARxAbort(DMA_HandleTypeDef *hdma)
DMA SD Rx Abort callback.
static void SD_DMATxAbort(DMA_HandleTypeDef *hdma)
DMA SD Tx Abort callback.
__IO uint8_t DataBusWidth
uint32_t HAL_SD_GetError(SD_HandleTypeDef *hsd)
Return the SD error code.
HAL_StatusTypeDef HAL_SD_Init(SD_HandleTypeDef *hsd)
Initializes the SD according to the specified parameters in the SD_HandleTypeDef and create the assoc...
__IO uint8_t UhsAllocationUnitSize
uint32_t SDMMC_GetPowerState(SDMMC_TypeDef *SDMMCx)
Get SDMMC Power state.
uint32_t SDMMC_CmdSDEraseEndAdd(SDMMC_TypeDef *SDMMCx, uint32_t EndAdd)
Send the End Address Erase command for SD and check the response.
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.
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...
static uint32_t SD_SendSDStatus(SD_HandleTypeDef *hsd, uint32_t *pSDstatus)
Send Status info command.
void HAL_SDEx_Write_DMADoubleBuffer0CpltCallback(SD_HandleTypeDef *hsd)
Write DMA Buffer 0 Transfer completed callbacks.
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
uint32_t SDMMC_CmdSendCSD(SDMMC_TypeDef *SDMMCx, uint32_t Argument)
Send the Send CSD command and check the response.
uint32_t SDMMC_CmdStatusRegister(SDMMC_TypeDef *SDMMCx)
Send the Status register command and check the response.
__IO uint8_t SysSpecVersion
void(* pSD_CallbackTypeDef)(SD_HandleTypeDef *hsd)
void HAL_SDEx_Read_DMADoubleBuffer0CpltCallback(SD_HandleTypeDef *hsd)
Read DMA Buffer 0 Transfer completed callbacks.
__IO uint8_t WrProtectGrSize
SD Card Information Structure definition.
void HAL_SDEx_Write_DMADoubleBuffer1CpltCallback(SD_HandleTypeDef *hsd)
Write DMA Buffer 1 Transfer completed callbacks.
__IO uint8_t MaxRdCurrentVDDMin
__IO uint16_t ManufactDate
uint32_t SDMMC_ReadFIFO(SDMMC_TypeDef *SDMMCx)
Read data (word) from Rx FIFO in blocking mode (polling)
uint32_t SDMMC_CmdSetRelAdd(SDMMC_TypeDef *SDMMCx, uint16_t *pRCA)
Send the Send CSD command and check the response.
__IO uint8_t MaxWrCurrentVDDMin
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...
static uint32_t SD_PowerON(SD_HandleTypeDef *hsd)
Enquires cards about their operating voltage and configures clock controls and stores SD information ...
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...
__IO uint8_t UhsSpeedGrade
uint32_t SDMMC_CmdSendCID(SDMMC_TypeDef *SDMMCx)
Send the Send CID command and check the response.
static void SD_DMATransmitCplt(DMA_HandleTypeDef *hdma)
DMA SD transmit process complete callback.
static void SD_PowerOFF(SD_HandleTypeDef *hsd)
Turns the SDMMC output signals off.
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_DMA_Abort(DMA_HandleTypeDef *hdma)
Abort the DMA Transfer.
uint32_t SDMMC_GetResponse(SDMMC_TypeDef *SDMMCx, uint32_t Response)
Return the response received from the card for the last command.
HAL_StatusTypeDef HAL_SD_UnRegisterCallback(SD_HandleTypeDef *hsd, HAL_SD_CallbackIDTypeDef CallbackID)
Unregister a User SD Callback SD Callback is redirected to the weak (surcharged) predefined callback...
HAL_StatusTypeDef HAL_SD_RegisterCallback(SD_HandleTypeDef *hsd, HAL_SD_CallbackIDTypeDef CallbackID, pSD_CallbackTypeDef pCallback)
Register a User SD Callback To be used instead of the weak (surcharged) predefined callback...
__IO uint8_t FileFormatGroup
static void SD_Read_IT(SD_HandleTypeDef *hsd)
Wrap up reading in non-blocking mode.
HAL_StatusTypeDef HAL_SD_Abort(SD_HandleTypeDef *hsd)
Abort the current transfer and disable the SD.
uint32_t HAL_SD_CardStateTypeDef
uint32_t SDMMC_CmdWriteSingleBlock(SDMMC_TypeDef *SDMMCx, uint32_t WriteAdd)
Send the Write Single Block command and check the response.
uint32_t SDMMC_CmdStopTransfer(SDMMC_TypeDef *SDMMCx)
Send the Stop Transfer command and check the response.
__IO uint8_t RdBlockMisalign
void HAL_SD_AbortCallback(SD_HandleTypeDef *hsd)
SD Abort callbacks.
uint32_t SDMMC_CmdBusWidth(SDMMC_TypeDef *SDMMCx, uint32_t BusWidth)
Send the Bus Width command and check the response.
uint32_t SDMMC_CmdSendSCR(SDMMC_TypeDef *SDMMCx)
Send the Send SCR command and check the response.
__IO uint8_t ManufacturerID
__IO uint8_t MaxWrBlockLen
uint32_t SDMMC_CmdAppOperCommand(SDMMC_TypeDef *SDMMCx, uint32_t Argument)
Send the command asking the accessed card to send its operating condition register (OCR) ...
uint32_t SDMMC_CmdGoIdleState(SDMMC_TypeDef *SDMMCx)
Send the Go Idle State command and check the response.
void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)
Tx Transfer completed callbacks.
__IO uint8_t TempWrProtect
uint32_t SDMMC_CmdAppCommand(SDMMC_TypeDef *SDMMCx, uint32_t Argument)
Send the Application command to verify that that the next command is an application specific com-mand...
HAL_StatusTypeDef SDMMC_Init(SDMMC_TypeDef *SDMMCx, SDMMC_InitTypeDef Init)
Initializes the SDMMC according to the specified parameters in the SDMMC_InitTypeDef and create the a...
static uint32_t SD_SendStatus(SD_HandleTypeDef *hsd, uint32_t *pCardStatus)
Returns the current card's status.
MODIFY_REG(hrtc->Instance->CR, RTC_CR_WUCKSEL,(uint32_t) WakeUpClock)
uint32_t SDMMC_CmdReadMultiBlock(SDMMC_TypeDef *SDMMCx, uint32_t ReadAdd)
Send the Read Multi Block command and check the response.
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...
__IO uint8_t WrBlockMisalign
HAL_StatusTypeDef SDMMC_PowerState_ON(SDMMC_TypeDef *SDMMCx)
Set SDMMC Power state to ON.
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...
__IO uint16_t OEM_AppliID
HAL_StatusTypeDef HAL_SD_RegisterTransceiverCallback(SD_HandleTypeDef *hsd, pSD_TransceiverCallbackTypeDef pCallback)
Register a User SD Transceiver Callback To be used instead of the weak (surcharged) predefined callba...
void HAL_SDEx_Read_DMADoubleBuffer1CpltCallback(SD_HandleTypeDef *hsd)
Read DMA Buffer 1 Transfer completed callbacks.
void HAL_SD_MspDeInit(SD_HandleTypeDef *hsd)
De-Initialize SD MSP.
static void SD_Write_IT(SD_HandleTypeDef *hsd)
Wrap up writing in non-blocking mode.
HAL_StatusTypeDef SDMMC_WriteFIFO(SDMMC_TypeDef *SDMMCx, uint32_t *pWriteData)
Write data (word) to Tx FIFO in blocking mode (polling)
static uint32_t SD_InitCard(SD_HandleTypeDef *hsd)
Initializes the sd card.
HAL_StatusTypeDef HAL_SD_GetCardInfo(SD_HandleTypeDef *hsd, HAL_SD_CardInfoTypeDef *pCardInfo)
Gets the SD card info.
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
static uint32_t SD_FindSCR(SD_HandleTypeDef *hsd, uint32_t *pSCR)
Finds the SD card SCR register value.
uint32_t SDMMC_CmdSDEraseStartAdd(SDMMC_TypeDef *SDMMCx, uint32_t StartAdd)
Send the Start Address Erase command for SD and check the response.
void HAL_SDEx_DriveTransceiver_1_8V_Callback(FlagStatus status)
Enable/Disable the SD Transceiver 1.8V Mode Callback.
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))
HAL_StatusTypeDef HAL_SD_Abort_IT(SD_HandleTypeDef *hsd)
Abort the current transfer and disable the SD (IT mode).
HAL_StatusTypeDef SDMMC_PowerState_OFF(SDMMC_TypeDef *SDMMCx)
Set SDMMC Power state to OFF.
__IO uint8_t WrProtectGrEnable
HAL_StatusTypeDef SDMMC_ConfigData(SDMMC_TypeDef *SDMMCx, SDMMC_DataInitTypeDef *Data)
Configure the SDMMC data path according to the specified parameters in the SDMMC_DataInitTypeDef.
__IO uint8_t PerformanceMove