263#if defined (SDMMC1) || defined (SDMMC2)
264#ifdef HAL_SD_MODULE_ENABLED
272#define SD_INIT_FREQ 400000U
273#define SD_NORMAL_SPEED_FREQ 25000000U
274#define SD_HIGH_SPEED_FREQ 50000000U
276#if defined (DLYB_SDMMC1) && defined (DLYB_SDMMC2)
277#define SD_GET_DLYB_INSTANCE(SDMMC_INSTANCE) (((SDMMC_INSTANCE) == SDMMC1)? \
278 DLYB_SDMMC1 : DLYB_SDMMC2 )
279#elif defined (DLYB_SDMMC1)
280#define SD_GET_DLYB_INSTANCE(SDMMC_INSTANCE) ( DLYB_SDMMC1 )
293static uint32_t SD_InitCard(SD_HandleTypeDef *hsd);
294static uint32_t SD_PowerON(SD_HandleTypeDef *hsd);
295static uint32_t SD_SendSDStatus(SD_HandleTypeDef *hsd, uint32_t *pSDstatus);
296static uint32_t SD_SendStatus(SD_HandleTypeDef *hsd, uint32_t *pCardStatus);
297static uint32_t SD_WideBus_Enable(SD_HandleTypeDef *hsd);
298static uint32_t SD_WideBus_Disable(SD_HandleTypeDef *hsd);
299static uint32_t SD_FindSCR(SD_HandleTypeDef *hsd, uint32_t *pSCR);
300static void SD_PowerOFF(SD_HandleTypeDef *hsd);
301static void SD_Write_IT(SD_HandleTypeDef *hsd);
302static void SD_Read_IT(SD_HandleTypeDef *hsd);
303static uint32_t SD_SwitchSpeed(SD_HandleTypeDef *hsd, uint32_t SwitchSpeedMode);
304#if (USE_SD_TRANSCEIVER != 0U)
305static uint32_t SD_UltraHighSpeed(SD_HandleTypeDef *hsd, uint32_t UltraHighSpeedMode);
306static uint32_t SD_DDR_Mode(SD_HandleTypeDef *hsd);
340 HAL_SD_CardStatusTypeDef CardStatus;
354 assert_param(IS_SDMMC_CLOCK_POWER_SAVE(hsd->Init.ClockPowerSave));
356 assert_param(IS_SDMMC_HARDWARE_FLOW_CONTROL(hsd->Init.HardwareFlowControl));
359 if (hsd->State == HAL_SD_STATE_RESET)
364#if (USE_SD_TRANSCEIVER != 0U)
366 if (hsd->Init.TranceiverPresent == SDMMC_TRANSCEIVER_UNKNOWN)
368 hsd->Init.TranceiverPresent = SDMMC_TRANSCEIVER_PRESENT;
371#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
373 hsd->TxCpltCallback = HAL_SD_TxCpltCallback;
374 hsd->RxCpltCallback = HAL_SD_RxCpltCallback;
375 hsd->ErrorCallback = HAL_SD_ErrorCallback;
376 hsd->AbortCpltCallback = HAL_SD_AbortCallback;
377 hsd->Read_DMADblBuf0CpltCallback = HAL_SDEx_Read_DMADoubleBuf0CpltCallback;
378 hsd->Read_DMADblBuf1CpltCallback = HAL_SDEx_Read_DMADoubleBuf1CpltCallback;
379 hsd->Write_DMADblBuf0CpltCallback = HAL_SDEx_Write_DMADoubleBuf0CpltCallback;
380 hsd->Write_DMADblBuf1CpltCallback = HAL_SDEx_Write_DMADoubleBuf1CpltCallback;
381#if (USE_SD_TRANSCEIVER != 0U)
382 if (hsd->Init.TranceiverPresent == SDMMC_TRANSCEIVER_PRESENT)
384 hsd->DriveTransceiver_1_8V_Callback = HAL_SD_DriveTransceiver_1_8V_Callback;
388 if (hsd->MspInitCallback ==
NULL)
390 hsd->MspInitCallback = HAL_SD_MspInit;
394 hsd->MspInitCallback(hsd);
401 hsd->State = HAL_SD_STATE_PROGRAMMING;
404 if (HAL_SD_InitCard(hsd) !=
HAL_OK)
409 if (HAL_SD_GetCardStatus(hsd, &CardStatus) !=
HAL_OK)
414 speedgrade = CardStatus.UhsSpeedGrade;
415 unitsize = CardStatus.UhsAllocationUnitSize;
416 if ((hsd->SdCard.CardType == CARD_SDHC_SDXC) && ((speedgrade != 0U) || (unitsize != 0U)))
418 hsd->SdCard.CardSpeed = CARD_ULTRA_HIGH_SPEED;
422 if (hsd->SdCard.CardType == CARD_SDHC_SDXC)
424 hsd->SdCard.CardSpeed = CARD_HIGH_SPEED;
428 hsd->SdCard.CardSpeed = CARD_NORMAL_SPEED;
433 if (HAL_SD_ConfigWideBusOperation(hsd, hsd->Init.BusWide) !=
HAL_OK)
440 while ((HAL_SD_GetCardState(hsd) != HAL_SD_CARD_TRANSFER))
442 if ((
HAL_GetTick() - tickstart) >= SDMMC_SWDATATIMEOUT)
444 hsd->ErrorCode = HAL_SD_ERROR_TIMEOUT;
445 hsd->State = HAL_SD_STATE_READY;
451 hsd->ErrorCode = HAL_SD_ERROR_NONE;
454 hsd->Context = SD_CONTEXT_NONE;
457 hsd->State = HAL_SD_STATE_READY;
472 SD_InitTypeDef Init = {0U};
476 Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING;
477 Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE;
478 Init.BusWide = SDMMC_BUS_WIDE_1B;
479 Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;
485 hsd->State = HAL_SD_STATE_READY;
486 hsd->ErrorCode = SDMMC_ERROR_INVALID_PARAMETER;
489 if (sdmmc_clk <= SD_INIT_FREQ)
495 Init.ClockDiv = (sdmmc_clk / (2U * SD_INIT_FREQ)) + 1U;
498#if (USE_SD_TRANSCEIVER != 0U)
499 Init.TranceiverPresent = hsd->Init.TranceiverPresent;
501 if (hsd->Init.TranceiverPresent == SDMMC_TRANSCEIVER_PRESENT)
506#elif defined (USE_SD_DIRPOL)
512 (void)SDMMC_Init(hsd->Instance, Init);
515 (void)SDMMC_PowerState_ON(hsd->Instance);
519 if (Init.ClockDiv != 0U)
521 sdmmc_clk = sdmmc_clk / (2U * Init.ClockDiv);
526 HAL_Delay(1U + (74U * 1000U / (sdmmc_clk)));
530 errorstate = SD_PowerON(hsd);
531 if (errorstate != HAL_SD_ERROR_NONE)
533 hsd->State = HAL_SD_STATE_READY;
534 hsd->ErrorCode |= errorstate;
539 errorstate = SD_InitCard(hsd);
540 if (errorstate != HAL_SD_ERROR_NONE)
542 hsd->State = HAL_SD_STATE_READY;
543 hsd->ErrorCode |= errorstate;
548 errorstate = SDMMC_CmdBlockLength(hsd->Instance, BLOCKSIZE);
549 if (errorstate != HAL_SD_ERROR_NONE)
552 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
553 hsd->ErrorCode |= errorstate;
554 hsd->State = HAL_SD_STATE_READY;
577 hsd->State = HAL_SD_STATE_BUSY;
579#if (USE_SD_TRANSCEIVER != 0U)
581 if (hsd->Init.TranceiverPresent == SDMMC_TRANSCEIVER_PRESENT)
583#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
584 if (hsd->DriveTransceiver_1_8V_Callback ==
NULL)
586 hsd->DriveTransceiver_1_8V_Callback = HAL_SD_DriveTransceiver_1_8V_Callback;
588 hsd->DriveTransceiver_1_8V_Callback(
RESET);
590 HAL_SD_DriveTransceiver_1_8V_Callback(
RESET);
598#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
599 if (hsd->MspDeInitCallback ==
NULL)
601 hsd->MspDeInitCallback = HAL_SD_MspDeInit;
605 hsd->MspDeInitCallback(hsd);
608 HAL_SD_MspDeInit(hsd);
611 hsd->ErrorCode = HAL_SD_ERROR_NONE;
612 hsd->State = HAL_SD_STATE_RESET;
622__weak
void HAL_SD_MspInit(SD_HandleTypeDef *hsd)
637__weak
void HAL_SD_MspDeInit(SD_HandleTypeDef *hsd)
678HAL_StatusTypeDef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks,
681 SDMMC_DataInitTypeDef
config;
686 uint32_t dataremaining;
687 uint32_t add = BlockAdd;
688 uint8_t *tempbuff = pData;
692 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
696 if (hsd->State == HAL_SD_STATE_READY)
698 hsd->ErrorCode = HAL_SD_ERROR_NONE;
700 if ((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
702 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
706 hsd->State = HAL_SD_STATE_BUSY;
709 hsd->Instance->DCTRL = 0U;
711 if (hsd->SdCard.CardType != CARD_SDHC_SDXC)
717 config.DataTimeOut = SDMMC_DATATIMEOUT;
718 config.DataLength = NumberOfBlocks * BLOCKSIZE;
719 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
720 config.TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
721 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
722 config.DPSM = SDMMC_DPSM_DISABLE;
723 (void)SDMMC_ConfigData(hsd->Instance, &
config);
724 __SDMMC_CMDTRANS_ENABLE(hsd->Instance);
727 if (NumberOfBlocks > 1U)
729 hsd->Context = SD_CONTEXT_READ_MULTIPLE_BLOCK;
732 errorstate = SDMMC_CmdReadMultiBlock(hsd->Instance, add);
736 hsd->Context = SD_CONTEXT_READ_SINGLE_BLOCK;
739 errorstate = SDMMC_CmdReadSingleBlock(hsd->Instance, add);
741 if (errorstate != HAL_SD_ERROR_NONE)
744 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
745 hsd->ErrorCode |= errorstate;
746 hsd->State = HAL_SD_STATE_READY;
747 hsd->Context = SD_CONTEXT_NONE;
752 dataremaining =
config.DataLength;
753 while (!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DATAEND))
755 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXFIFOHF) && (dataremaining >= SDMMC_FIFO_SIZE))
760 data = SDMMC_ReadFIFO(hsd->Instance);
761 *tempbuff = (uint8_t)(data & 0xFFU);
763 *tempbuff = (uint8_t)((data >> 8U) & 0xFFU);
765 *tempbuff = (uint8_t)((data >> 16U) & 0xFFU);
767 *tempbuff = (uint8_t)((data >> 24U) & 0xFFU);
770 dataremaining -= SDMMC_FIFO_SIZE;
773 if (((
HAL_GetTick() - tickstart) >= Timeout) || (Timeout == 0U))
776 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
777 hsd->ErrorCode |= HAL_SD_ERROR_TIMEOUT;
778 hsd->State = HAL_SD_STATE_READY;
779 hsd->Context = SD_CONTEXT_NONE;
783 __SDMMC_CMDTRANS_DISABLE(hsd->Instance);
786 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DATAEND) && (NumberOfBlocks > 1U))
788 if (hsd->SdCard.CardType != CARD_SECURED)
791 errorstate = SDMMC_CmdStopTransfer(hsd->Instance);
792 if (errorstate != HAL_SD_ERROR_NONE)
795 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
796 hsd->ErrorCode |= errorstate;
797 hsd->State = HAL_SD_STATE_READY;
798 hsd->Context = SD_CONTEXT_NONE;
805 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DTIMEOUT))
808 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
809 hsd->ErrorCode |= HAL_SD_ERROR_DATA_TIMEOUT;
810 hsd->State = HAL_SD_STATE_READY;
811 hsd->Context = SD_CONTEXT_NONE;
814 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DCRCFAIL))
817 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
818 hsd->ErrorCode |= HAL_SD_ERROR_DATA_CRC_FAIL;
819 hsd->State = HAL_SD_STATE_READY;
820 hsd->Context = SD_CONTEXT_NONE;
823 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR))
826 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
827 hsd->ErrorCode |= HAL_SD_ERROR_RX_OVERRUN;
828 hsd->State = HAL_SD_STATE_READY;
829 hsd->Context = SD_CONTEXT_NONE;
838 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
840 hsd->State = HAL_SD_STATE_READY;
846 hsd->ErrorCode |= HAL_SD_ERROR_BUSY;
863HAL_StatusTypeDef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd,
const uint8_t *pData, uint32_t BlockAdd,
864 uint32_t NumberOfBlocks, uint32_t Timeout)
866 SDMMC_DataInitTypeDef
config;
871 uint32_t dataremaining;
872 uint32_t add = BlockAdd;
873 const uint8_t *tempbuff = pData;
877 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
881 if (hsd->State == HAL_SD_STATE_READY)
883 hsd->ErrorCode = HAL_SD_ERROR_NONE;
885 if ((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
887 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
891 hsd->State = HAL_SD_STATE_BUSY;
894 hsd->Instance->DCTRL = 0U;
896 if (hsd->SdCard.CardType != CARD_SDHC_SDXC)
902 config.DataTimeOut = SDMMC_DATATIMEOUT;
903 config.DataLength = NumberOfBlocks * BLOCKSIZE;
904 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
905 config.TransferDir = SDMMC_TRANSFER_DIR_TO_CARD;
906 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
907 config.DPSM = SDMMC_DPSM_DISABLE;
908 (void)SDMMC_ConfigData(hsd->Instance, &
config);
909 __SDMMC_CMDTRANS_ENABLE(hsd->Instance);
912 if (NumberOfBlocks > 1U)
914 hsd->Context = SD_CONTEXT_WRITE_MULTIPLE_BLOCK;
917 errorstate = SDMMC_CmdWriteMultiBlock(hsd->Instance, add);
921 hsd->Context = SD_CONTEXT_WRITE_SINGLE_BLOCK;
924 errorstate = SDMMC_CmdWriteSingleBlock(hsd->Instance, add);
926 if (errorstate != HAL_SD_ERROR_NONE)
929 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
930 hsd->ErrorCode |= errorstate;
931 hsd->State = HAL_SD_STATE_READY;
932 hsd->Context = SD_CONTEXT_NONE;
937 dataremaining =
config.DataLength;
938 while (!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_TXUNDERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT |
941 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_TXFIFOHE) && (dataremaining >= SDMMC_FIFO_SIZE))
946 data = (uint32_t)(*tempbuff);
948 data |= ((uint32_t)(*tempbuff) << 8U);
950 data |= ((uint32_t)(*tempbuff) << 16U);
952 data |= ((uint32_t)(*tempbuff) << 24U);
954 (void)SDMMC_WriteFIFO(hsd->Instance, &data);
956 dataremaining -= SDMMC_FIFO_SIZE;
959 if (((
HAL_GetTick() - tickstart) >= Timeout) || (Timeout == 0U))
962 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
963 hsd->ErrorCode |= errorstate;
964 hsd->State = HAL_SD_STATE_READY;
965 hsd->Context = SD_CONTEXT_NONE;
969 __SDMMC_CMDTRANS_DISABLE(hsd->Instance);
972 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DATAEND) && (NumberOfBlocks > 1U))
974 if (hsd->SdCard.CardType != CARD_SECURED)
977 errorstate = SDMMC_CmdStopTransfer(hsd->Instance);
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;
991 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DTIMEOUT))
994 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
995 hsd->ErrorCode |= HAL_SD_ERROR_DATA_TIMEOUT;
996 hsd->State = HAL_SD_STATE_READY;
997 hsd->Context = SD_CONTEXT_NONE;
1000 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DCRCFAIL))
1003 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1004 hsd->ErrorCode |= HAL_SD_ERROR_DATA_CRC_FAIL;
1005 hsd->State = HAL_SD_STATE_READY;
1006 hsd->Context = SD_CONTEXT_NONE;
1009 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_TXUNDERR))
1012 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1013 hsd->ErrorCode |= HAL_SD_ERROR_TX_UNDERRUN;
1014 hsd->State = HAL_SD_STATE_READY;
1015 hsd->Context = SD_CONTEXT_NONE;
1024 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
1026 hsd->State = HAL_SD_STATE_READY;
1032 hsd->ErrorCode |= HAL_SD_ERROR_BUSY;
1050HAL_StatusTypeDef HAL_SD_ReadBlocks_IT(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd,
1051 uint32_t NumberOfBlocks)
1053 SDMMC_DataInitTypeDef
config;
1054 uint32_t errorstate;
1055 uint32_t add = BlockAdd;
1059 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
1063 if (hsd->State == HAL_SD_STATE_READY)
1065 hsd->ErrorCode = HAL_SD_ERROR_NONE;
1067 if ((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
1069 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
1073 hsd->State = HAL_SD_STATE_BUSY;
1076 hsd->Instance->DCTRL = 0U;
1078 hsd->pRxBuffPtr = pData;
1079 hsd->RxXferSize = BLOCKSIZE * NumberOfBlocks;
1081 if (hsd->SdCard.CardType != CARD_SDHC_SDXC)
1087 config.DataTimeOut = SDMMC_DATATIMEOUT;
1088 config.DataLength = BLOCKSIZE * NumberOfBlocks;
1089 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
1090 config.TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
1091 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
1092 config.DPSM = SDMMC_DPSM_DISABLE;
1093 (void)SDMMC_ConfigData(hsd->Instance, &
config);
1094 __SDMMC_CMDTRANS_ENABLE(hsd->Instance);
1097 if (NumberOfBlocks > 1U)
1099 hsd->Context = (SD_CONTEXT_READ_MULTIPLE_BLOCK | SD_CONTEXT_IT);
1102 errorstate = SDMMC_CmdReadMultiBlock(hsd->Instance, add);
1106 hsd->Context = (SD_CONTEXT_READ_SINGLE_BLOCK | SD_CONTEXT_IT);
1109 errorstate = SDMMC_CmdReadSingleBlock(hsd->Instance, add);
1111 if (errorstate != HAL_SD_ERROR_NONE)
1114 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1115 hsd->ErrorCode |= errorstate;
1116 hsd->State = HAL_SD_STATE_READY;
1117 hsd->Context = SD_CONTEXT_NONE;
1121 __HAL_SD_ENABLE_IT(hsd, (SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | SDMMC_IT_RXOVERR | SDMMC_IT_DATAEND |
1122 SDMMC_FLAG_RXFIFOHF));
1145HAL_StatusTypeDef HAL_SD_WriteBlocks_IT(SD_HandleTypeDef *hsd,
const uint8_t *pData, uint32_t BlockAdd,
1146 uint32_t NumberOfBlocks)
1148 SDMMC_DataInitTypeDef
config;
1149 uint32_t errorstate;
1150 uint32_t add = BlockAdd;
1154 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
1158 if (hsd->State == HAL_SD_STATE_READY)
1160 hsd->ErrorCode = HAL_SD_ERROR_NONE;
1162 if ((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
1164 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
1168 hsd->State = HAL_SD_STATE_BUSY;
1171 hsd->Instance->DCTRL = 0U;
1173 hsd->pTxBuffPtr = pData;
1174 hsd->TxXferSize = BLOCKSIZE * NumberOfBlocks;
1176 if (hsd->SdCard.CardType != CARD_SDHC_SDXC)
1182 config.DataTimeOut = SDMMC_DATATIMEOUT;
1183 config.DataLength = BLOCKSIZE * NumberOfBlocks;
1184 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
1185 config.TransferDir = SDMMC_TRANSFER_DIR_TO_CARD;
1186 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
1187 config.DPSM = SDMMC_DPSM_DISABLE;
1188 (void)SDMMC_ConfigData(hsd->Instance, &
config);
1190 __SDMMC_CMDTRANS_ENABLE(hsd->Instance);
1193 if (NumberOfBlocks > 1U)
1195 hsd->Context = (SD_CONTEXT_WRITE_MULTIPLE_BLOCK | SD_CONTEXT_IT);
1198 errorstate = SDMMC_CmdWriteMultiBlock(hsd->Instance, add);
1202 hsd->Context = (SD_CONTEXT_WRITE_SINGLE_BLOCK | SD_CONTEXT_IT);
1205 errorstate = SDMMC_CmdWriteSingleBlock(hsd->Instance, add);
1207 if (errorstate != HAL_SD_ERROR_NONE)
1210 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1211 hsd->ErrorCode |= errorstate;
1212 hsd->State = HAL_SD_STATE_READY;
1213 hsd->Context = SD_CONTEXT_NONE;
1218 __HAL_SD_ENABLE_IT(hsd, (SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | SDMMC_IT_TXUNDERR | SDMMC_IT_DATAEND |
1219 SDMMC_FLAG_TXFIFOHE));
1242HAL_StatusTypeDef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd,
1243 uint32_t NumberOfBlocks)
1245 SDMMC_DataInitTypeDef
config;
1246 uint32_t errorstate;
1247 uint32_t add = BlockAdd;
1251 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
1255 if (hsd->State == HAL_SD_STATE_READY)
1257 hsd->ErrorCode = HAL_SD_ERROR_NONE;
1259 if ((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
1261 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
1265 hsd->State = HAL_SD_STATE_BUSY;
1268 hsd->Instance->DCTRL = 0U;
1270 hsd->pRxBuffPtr = pData;
1271 hsd->RxXferSize = BLOCKSIZE * NumberOfBlocks;
1273 if (hsd->SdCard.CardType != CARD_SDHC_SDXC)
1279 config.DataTimeOut = SDMMC_DATATIMEOUT;
1280 config.DataLength = BLOCKSIZE * NumberOfBlocks;
1281 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
1282 config.TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
1283 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
1284 config.DPSM = SDMMC_DPSM_DISABLE;
1285 (void)SDMMC_ConfigData(hsd->Instance, &
config);
1287 __SDMMC_CMDTRANS_ENABLE(hsd->Instance);
1288 hsd->Instance->IDMABASE0 = (uint32_t) pData ;
1289 hsd->Instance->IDMACTRL = SDMMC_ENABLE_IDMA_SINGLE_BUFF;
1292 if (NumberOfBlocks > 1U)
1294 hsd->Context = (SD_CONTEXT_READ_MULTIPLE_BLOCK | SD_CONTEXT_DMA);
1297 errorstate = SDMMC_CmdReadMultiBlock(hsd->Instance, add);
1301 hsd->Context = (SD_CONTEXT_READ_SINGLE_BLOCK | SD_CONTEXT_DMA);
1304 errorstate = SDMMC_CmdReadSingleBlock(hsd->Instance, add);
1306 if (errorstate != HAL_SD_ERROR_NONE)
1309 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1310 hsd->ErrorCode |= errorstate;
1311 hsd->State = HAL_SD_STATE_READY;
1312 hsd->Context = SD_CONTEXT_NONE;
1317 __HAL_SD_ENABLE_IT(hsd, (SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | SDMMC_IT_RXOVERR | SDMMC_IT_DATAEND));
1340HAL_StatusTypeDef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd,
const uint8_t *pData, uint32_t BlockAdd,
1341 uint32_t NumberOfBlocks)
1343 SDMMC_DataInitTypeDef
config;
1344 uint32_t errorstate;
1345 uint32_t add = BlockAdd;
1349 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
1353 if (hsd->State == HAL_SD_STATE_READY)
1355 hsd->ErrorCode = HAL_SD_ERROR_NONE;
1357 if ((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
1359 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
1363 hsd->State = HAL_SD_STATE_BUSY;
1366 hsd->Instance->DCTRL = 0U;
1368 hsd->pTxBuffPtr = pData;
1369 hsd->TxXferSize = BLOCKSIZE * NumberOfBlocks;
1371 if (hsd->SdCard.CardType != CARD_SDHC_SDXC)
1377 config.DataTimeOut = SDMMC_DATATIMEOUT;
1378 config.DataLength = BLOCKSIZE * NumberOfBlocks;
1379 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
1380 config.TransferDir = SDMMC_TRANSFER_DIR_TO_CARD;
1381 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
1382 config.DPSM = SDMMC_DPSM_DISABLE;
1383 (void)SDMMC_ConfigData(hsd->Instance, &
config);
1385 __SDMMC_CMDTRANS_ENABLE(hsd->Instance);
1387 hsd->Instance->IDMABASE0 = (uint32_t) pData ;
1388 hsd->Instance->IDMACTRL = SDMMC_ENABLE_IDMA_SINGLE_BUFF;
1391 if (NumberOfBlocks > 1U)
1393 hsd->Context = (SD_CONTEXT_WRITE_MULTIPLE_BLOCK | SD_CONTEXT_DMA);
1396 errorstate = SDMMC_CmdWriteMultiBlock(hsd->Instance, add);
1400 hsd->Context = (SD_CONTEXT_WRITE_SINGLE_BLOCK | SD_CONTEXT_DMA);
1403 errorstate = SDMMC_CmdWriteSingleBlock(hsd->Instance, add);
1405 if (errorstate != HAL_SD_ERROR_NONE)
1408 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1409 hsd->ErrorCode |= errorstate;
1410 hsd->State = HAL_SD_STATE_READY;
1411 hsd->Context = SD_CONTEXT_NONE;
1416 __HAL_SD_ENABLE_IT(hsd, (SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | SDMMC_IT_TXUNDERR | SDMMC_IT_DATAEND));
1435HAL_StatusTypeDef HAL_SD_Erase(SD_HandleTypeDef *hsd, uint32_t BlockStartAdd, uint32_t BlockEndAdd)
1437 uint32_t errorstate;
1438 uint32_t start_add = BlockStartAdd;
1439 uint32_t end_add = BlockEndAdd;
1441 if (hsd->State == HAL_SD_STATE_READY)
1443 hsd->ErrorCode = HAL_SD_ERROR_NONE;
1445 if (end_add < start_add)
1447 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
1451 if (end_add > (hsd->SdCard.LogBlockNbr))
1453 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
1457 hsd->State = HAL_SD_STATE_BUSY;
1460 if (((hsd->SdCard.Class) & SDMMC_CCCC_ERASE) == 0U)
1463 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1464 hsd->ErrorCode |= HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
1465 hsd->State = HAL_SD_STATE_READY;
1469 if ((SDMMC_GetResponse(hsd->Instance, SDMMC_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
1472 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1473 hsd->ErrorCode |= HAL_SD_ERROR_LOCK_UNLOCK_FAILED;
1474 hsd->State = HAL_SD_STATE_READY;
1479 if (hsd->SdCard.CardType != CARD_SDHC_SDXC)
1481 start_add *= BLOCKSIZE;
1482 end_add *= BLOCKSIZE;
1486 if (hsd->SdCard.CardType != CARD_SECURED)
1489 errorstate = SDMMC_CmdSDEraseStartAdd(hsd->Instance, start_add);
1490 if (errorstate != HAL_SD_ERROR_NONE)
1493 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1494 hsd->ErrorCode |= errorstate;
1495 hsd->State = HAL_SD_STATE_READY;
1500 errorstate = SDMMC_CmdSDEraseEndAdd(hsd->Instance, end_add);
1501 if (errorstate != HAL_SD_ERROR_NONE)
1504 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1505 hsd->ErrorCode |= errorstate;
1506 hsd->State = HAL_SD_STATE_READY;
1512 errorstate = SDMMC_CmdErase(hsd->Instance, 0UL);
1513 if (errorstate != HAL_SD_ERROR_NONE)
1516 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1517 hsd->ErrorCode |= errorstate;
1518 hsd->State = HAL_SD_STATE_READY;
1522 hsd->State = HAL_SD_STATE_READY;
1537void HAL_SD_IRQHandler(SD_HandleTypeDef *hsd)
1539 uint32_t errorstate;
1540 uint32_t context = hsd->Context;
1543 if ((__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXFIFOHF) !=
RESET) && ((context & SD_CONTEXT_IT) != 0U))
1548 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DATAEND) !=
RESET)
1550 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DATAEND);
1552 __HAL_SD_DISABLE_IT(hsd, SDMMC_IT_DATAEND | SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | \
1553 SDMMC_IT_TXUNDERR | SDMMC_IT_RXOVERR | SDMMC_IT_TXFIFOHE | \
1556 __HAL_SD_DISABLE_IT(hsd, SDMMC_IT_IDMABTC);
1557 __SDMMC_CMDTRANS_DISABLE(hsd->Instance);
1559 if ((context & SD_CONTEXT_IT) != 0U)
1561 if (((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U) || ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
1563 errorstate = SDMMC_CmdStopTransfer(hsd->Instance);
1564 if (errorstate != HAL_SD_ERROR_NONE)
1566 hsd->ErrorCode |= errorstate;
1567#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1568 hsd->ErrorCallback(hsd);
1570 HAL_SD_ErrorCallback(hsd);
1576 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
1578 hsd->State = HAL_SD_STATE_READY;
1579 hsd->Context = SD_CONTEXT_NONE;
1580 if (((context & SD_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
1582#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1583 hsd->RxCpltCallback(hsd);
1585 HAL_SD_RxCpltCallback(hsd);
1590#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1591 hsd->TxCpltCallback(hsd);
1593 HAL_SD_TxCpltCallback(hsd);
1597 else if ((context & SD_CONTEXT_DMA) != 0U)
1599 hsd->Instance->DLEN = 0;
1600 hsd->Instance->DCTRL = 0;
1601 hsd->Instance->IDMACTRL = SDMMC_DISABLE_IDMA;
1604 if (((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U) || ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
1606 errorstate = SDMMC_CmdStopTransfer(hsd->Instance);
1607 if (errorstate != HAL_SD_ERROR_NONE)
1609 hsd->ErrorCode |= errorstate;
1610#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1611 hsd->ErrorCallback(hsd);
1613 HAL_SD_ErrorCallback(hsd);
1618 hsd->State = HAL_SD_STATE_READY;
1619 hsd->Context = SD_CONTEXT_NONE;
1620 if (((context & SD_CONTEXT_WRITE_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
1622#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1623 hsd->TxCpltCallback(hsd);
1625 HAL_SD_TxCpltCallback(hsd);
1628 if (((context & SD_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
1630#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1631 hsd->RxCpltCallback(hsd);
1633 HAL_SD_RxCpltCallback(hsd);
1643 else if ((__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_TXFIFOHE) !=
RESET) && ((context & SD_CONTEXT_IT) != 0U))
1648 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_RXOVERR |
1649 SDMMC_FLAG_TXUNDERR) !=
RESET)
1652 if (__HAL_SD_GET_FLAG(hsd, SDMMC_IT_DCRCFAIL) !=
RESET)
1654 hsd->ErrorCode |= HAL_SD_ERROR_DATA_CRC_FAIL;
1656 if (__HAL_SD_GET_FLAG(hsd, SDMMC_IT_DTIMEOUT) !=
RESET)
1658 hsd->ErrorCode |= HAL_SD_ERROR_DATA_TIMEOUT;
1660 if (__HAL_SD_GET_FLAG(hsd, SDMMC_IT_RXOVERR) !=
RESET)
1662 hsd->ErrorCode |= HAL_SD_ERROR_RX_OVERRUN;
1664 if (__HAL_SD_GET_FLAG(hsd, SDMMC_IT_TXUNDERR) !=
RESET)
1666 hsd->ErrorCode |= HAL_SD_ERROR_TX_UNDERRUN;
1670 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
1673 __HAL_SD_DISABLE_IT(hsd, SDMMC_IT_DATAEND | SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | \
1674 SDMMC_IT_TXUNDERR | SDMMC_IT_RXOVERR);
1676 __SDMMC_CMDTRANS_DISABLE(hsd->Instance);
1679 hsd->ErrorCode |= SDMMC_CmdStopTransfer(hsd->Instance);
1681 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DABORT);
1683 if ((context & SD_CONTEXT_IT) != 0U)
1686 hsd->State = HAL_SD_STATE_READY;
1687 hsd->Context = SD_CONTEXT_NONE;
1688#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1689 hsd->ErrorCallback(hsd);
1691 HAL_SD_ErrorCallback(hsd);
1694 else if ((context & SD_CONTEXT_DMA) != 0U)
1696 if (hsd->ErrorCode != HAL_SD_ERROR_NONE)
1699 __HAL_SD_DISABLE_IT(hsd, SDMMC_IT_IDMABTC);
1700 hsd->Instance->IDMACTRL = SDMMC_DISABLE_IDMA;
1703 hsd->State = HAL_SD_STATE_READY;
1704#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1705 hsd->ErrorCallback(hsd);
1707 HAL_SD_ErrorCallback(hsd);
1717 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_IDMABTC) !=
RESET)
1719 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_IDMABTC);
1723 if ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U)
1725#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1726 hsd->Write_DMADblBuf1CpltCallback(hsd);
1728 HAL_SDEx_Write_DMADoubleBuf1CpltCallback(hsd);
1733#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1734 hsd->Read_DMADblBuf1CpltCallback(hsd);
1736 HAL_SDEx_Read_DMADoubleBuf1CpltCallback(hsd);
1743 if ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U)
1745#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1746 hsd->Write_DMADblBuf0CpltCallback(hsd);
1748 HAL_SDEx_Write_DMADoubleBuf0CpltCallback(hsd);
1753#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1754 hsd->Read_DMADblBuf0CpltCallback(hsd);
1756 HAL_SDEx_Read_DMADoubleBuf0CpltCallback(hsd);
1772HAL_SD_StateTypeDef HAL_SD_GetState(
const SD_HandleTypeDef *hsd)
1783uint32_t HAL_SD_GetError(
const SD_HandleTypeDef *hsd)
1785 return hsd->ErrorCode;
1793__weak
void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)
1808__weak
void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)
1823__weak
void HAL_SD_ErrorCallback(SD_HandleTypeDef *hsd)
1838__weak
void HAL_SD_AbortCallback(SD_HandleTypeDef *hsd)
1848#if (USE_SD_TRANSCEIVER != 0U)
1854__weak
void HAL_SD_DriveTransceiver_1_8V_Callback(
FlagStatus status)
1864#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1887HAL_StatusTypeDef HAL_SD_RegisterCallback(SD_HandleTypeDef *hsd, HAL_SD_CallbackIDTypeDef CallbackID,
1888 pSD_CallbackTypeDef pCallback)
1892 if (pCallback ==
NULL)
1895 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1899 if (hsd->State == HAL_SD_STATE_READY)
1903 case HAL_SD_TX_CPLT_CB_ID :
1904 hsd->TxCpltCallback = pCallback;
1906 case HAL_SD_RX_CPLT_CB_ID :
1907 hsd->RxCpltCallback = pCallback;
1909 case HAL_SD_ERROR_CB_ID :
1910 hsd->ErrorCallback = pCallback;
1912 case HAL_SD_ABORT_CB_ID :
1913 hsd->AbortCpltCallback = pCallback;
1915 case HAL_SD_READ_DMA_DBL_BUF0_CPLT_CB_ID :
1916 hsd->Read_DMADblBuf0CpltCallback = pCallback;
1918 case HAL_SD_READ_DMA_DBL_BUF1_CPLT_CB_ID :
1919 hsd->Read_DMADblBuf1CpltCallback = pCallback;
1921 case HAL_SD_WRITE_DMA_DBL_BUF0_CPLT_CB_ID :
1922 hsd->Write_DMADblBuf0CpltCallback = pCallback;
1924 case HAL_SD_WRITE_DMA_DBL_BUF1_CPLT_CB_ID :
1925 hsd->Write_DMADblBuf1CpltCallback = pCallback;
1927 case HAL_SD_MSP_INIT_CB_ID :
1928 hsd->MspInitCallback = pCallback;
1930 case HAL_SD_MSP_DEINIT_CB_ID :
1931 hsd->MspDeInitCallback = pCallback;
1935 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1941 else if (hsd->State == HAL_SD_STATE_RESET)
1945 case HAL_SD_MSP_INIT_CB_ID :
1946 hsd->MspInitCallback = pCallback;
1948 case HAL_SD_MSP_DEINIT_CB_ID :
1949 hsd->MspDeInitCallback = pCallback;
1953 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1962 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1991HAL_StatusTypeDef HAL_SD_UnRegisterCallback(SD_HandleTypeDef *hsd, HAL_SD_CallbackIDTypeDef CallbackID)
1995 if (hsd->State == HAL_SD_STATE_READY)
1999 case HAL_SD_TX_CPLT_CB_ID :
2000 hsd->TxCpltCallback = HAL_SD_TxCpltCallback;
2002 case HAL_SD_RX_CPLT_CB_ID :
2003 hsd->RxCpltCallback = HAL_SD_RxCpltCallback;
2005 case HAL_SD_ERROR_CB_ID :
2006 hsd->ErrorCallback = HAL_SD_ErrorCallback;
2008 case HAL_SD_ABORT_CB_ID :
2009 hsd->AbortCpltCallback = HAL_SD_AbortCallback;
2011 case HAL_SD_READ_DMA_DBL_BUF0_CPLT_CB_ID :
2012 hsd->Read_DMADblBuf0CpltCallback = HAL_SDEx_Read_DMADoubleBuf0CpltCallback;
2014 case HAL_SD_READ_DMA_DBL_BUF1_CPLT_CB_ID :
2015 hsd->Read_DMADblBuf1CpltCallback = HAL_SDEx_Read_DMADoubleBuf1CpltCallback;
2017 case HAL_SD_WRITE_DMA_DBL_BUF0_CPLT_CB_ID :
2018 hsd->Write_DMADblBuf0CpltCallback = HAL_SDEx_Write_DMADoubleBuf0CpltCallback;
2020 case HAL_SD_WRITE_DMA_DBL_BUF1_CPLT_CB_ID :
2021 hsd->Write_DMADblBuf1CpltCallback = HAL_SDEx_Write_DMADoubleBuf1CpltCallback;
2023 case HAL_SD_MSP_INIT_CB_ID :
2024 hsd->MspInitCallback = HAL_SD_MspInit;
2026 case HAL_SD_MSP_DEINIT_CB_ID :
2027 hsd->MspDeInitCallback = HAL_SD_MspDeInit;
2031 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
2037 else if (hsd->State == HAL_SD_STATE_RESET)
2041 case HAL_SD_MSP_INIT_CB_ID :
2042 hsd->MspInitCallback = HAL_SD_MspInit;
2044 case HAL_SD_MSP_DEINIT_CB_ID :
2045 hsd->MspDeInitCallback = HAL_SD_MspDeInit;
2049 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
2058 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
2066#if (USE_SD_TRANSCEIVER != 0U)
2074HAL_StatusTypeDef HAL_SD_RegisterTransceiverCallback(SD_HandleTypeDef *hsd, pSD_TransceiverCallbackTypeDef pCallback)
2078 if (pCallback ==
NULL)
2081 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
2088 if (hsd->State == HAL_SD_STATE_READY)
2090 hsd->DriveTransceiver_1_8V_Callback = pCallback;
2095 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
2118 if (hsd->State == HAL_SD_STATE_READY)
2120 hsd->DriveTransceiver_1_8V_Callback = HAL_SD_DriveTransceiver_1_8V_Callback;
2125 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
2164HAL_StatusTypeDef HAL_SD_GetCardCID(
const SD_HandleTypeDef *hsd, HAL_SD_CardCIDTypeDef *pCID)
2166 pCID->ManufacturerID = (uint8_t)((hsd->CID[0] & 0xFF000000U) >> 24U);
2168 pCID->OEM_AppliID = (uint16_t)((hsd->CID[0] & 0x00FFFF00U) >> 8U);
2170 pCID->ProdName1 = (((hsd->CID[0] & 0x000000FFU) << 24U) | ((hsd->CID[1] & 0xFFFFFF00U) >> 8U));
2172 pCID->ProdName2 = (uint8_t)(hsd->CID[1] & 0x000000FFU);
2174 pCID->ProdRev = (uint8_t)((hsd->CID[2] & 0xFF000000U) >> 24U);
2176 pCID->ProdSN = (((hsd->CID[2] & 0x00FFFFFFU) << 8U) | ((hsd->CID[3] & 0xFF000000U) >> 24U));
2178 pCID->Reserved1 = (uint8_t)((hsd->CID[3] & 0x00F00000U) >> 20U);
2180 pCID->ManufactDate = (uint16_t)((hsd->CID[3] & 0x000FFF00U) >> 8U);
2182 pCID->CID_CRC = (uint8_t)((hsd->CID[3] & 0x000000FEU) >> 1U);
2184 pCID->Reserved2 = 1U;
2197HAL_StatusTypeDef HAL_SD_GetCardCSD(SD_HandleTypeDef *hsd, HAL_SD_CardCSDTypeDef *pCSD)
2199 pCSD->CSDStruct = (uint8_t)((hsd->CSD[0] & 0xC0000000U) >> 30U);
2201 pCSD->SysSpecVersion = (uint8_t)((hsd->CSD[0] & 0x3C000000U) >> 26U);
2203 pCSD->Reserved1 = (uint8_t)((hsd->CSD[0] & 0x03000000U) >> 24U);
2205 pCSD->TAAC = (uint8_t)((hsd->CSD[0] & 0x00FF0000U) >> 16U);
2207 pCSD->NSAC = (uint8_t)((hsd->CSD[0] & 0x0000FF00U) >> 8U);
2209 pCSD->MaxBusClkFrec = (uint8_t)(hsd->CSD[0] & 0x000000FFU);
2211 pCSD->CardComdClasses = (uint16_t)((hsd->CSD[1] & 0xFFF00000U) >> 20U);
2213 pCSD->RdBlockLen = (uint8_t)((hsd->CSD[1] & 0x000F0000U) >> 16U);
2215 pCSD->PartBlockRead = (uint8_t)((hsd->CSD[1] & 0x00008000U) >> 15U);
2217 pCSD->WrBlockMisalign = (uint8_t)((hsd->CSD[1] & 0x00004000U) >> 14U);
2219 pCSD->RdBlockMisalign = (uint8_t)((hsd->CSD[1] & 0x00002000U) >> 13U);
2221 pCSD->DSRImpl = (uint8_t)((hsd->CSD[1] & 0x00001000U) >> 12U);
2223 pCSD->Reserved2 = 0U;
2225 if (hsd->SdCard.CardType == CARD_SDSC)
2227 pCSD->DeviceSize = (((hsd->CSD[1] & 0x000003FFU) << 2U) | ((hsd->CSD[2] & 0xC0000000U) >> 30U));
2229 pCSD->MaxRdCurrentVDDMin = (uint8_t)((hsd->CSD[2] & 0x38000000U) >> 27U);
2231 pCSD->MaxRdCurrentVDDMax = (uint8_t)((hsd->CSD[2] & 0x07000000U) >> 24U);
2233 pCSD->MaxWrCurrentVDDMin = (uint8_t)((hsd->CSD[2] & 0x00E00000U) >> 21U);
2235 pCSD->MaxWrCurrentVDDMax = (uint8_t)((hsd->CSD[2] & 0x001C0000U) >> 18U);
2237 pCSD->DeviceSizeMul = (uint8_t)((hsd->CSD[2] & 0x00038000U) >> 15U);
2239 hsd->SdCard.BlockNbr = (pCSD->DeviceSize + 1U) ;
2240 hsd->SdCard.BlockNbr *= (1UL << ((pCSD->DeviceSizeMul & 0x07U) + 2U));
2241 hsd->SdCard.BlockSize = (1UL << (pCSD->RdBlockLen & 0x0FU));
2243 hsd->SdCard.LogBlockNbr = (hsd->SdCard.BlockNbr) * ((hsd->SdCard.BlockSize) / BLOCKSIZE);
2244 hsd->SdCard.LogBlockSize = BLOCKSIZE;
2246 else if (hsd->SdCard.CardType == CARD_SDHC_SDXC)
2249 pCSD->DeviceSize = (((hsd->CSD[1] & 0x0000003FU) << 16U) | ((hsd->CSD[2] & 0xFFFF0000U) >> 16U));
2251 hsd->SdCard.BlockNbr = ((pCSD->DeviceSize + 1U) * 1024U);
2252 hsd->SdCard.LogBlockNbr = hsd->SdCard.BlockNbr;
2253 hsd->SdCard.BlockSize = BLOCKSIZE;
2254 hsd->SdCard.LogBlockSize = hsd->SdCard.BlockSize;
2259 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
2260 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2261 hsd->State = HAL_SD_STATE_READY;
2265 pCSD->EraseGrSize = (uint8_t)((hsd->CSD[2] & 0x00004000U) >> 14U);
2267 pCSD->EraseGrMul = (uint8_t)((hsd->CSD[2] & 0x00003F80U) >> 7U);
2269 pCSD->WrProtectGrSize = (uint8_t)(hsd->CSD[2] & 0x0000007FU);
2271 pCSD->WrProtectGrEnable = (uint8_t)((hsd->CSD[3] & 0x80000000U) >> 31U);
2273 pCSD->ManDeflECC = (uint8_t)((hsd->CSD[3] & 0x60000000U) >> 29U);
2275 pCSD->WrSpeedFact = (uint8_t)((hsd->CSD[3] & 0x1C000000U) >> 26U);
2277 pCSD->MaxWrBlockLen = (uint8_t)((hsd->CSD[3] & 0x03C00000U) >> 22U);
2279 pCSD->WriteBlockPaPartial = (uint8_t)((hsd->CSD[3] & 0x00200000U) >> 21U);
2281 pCSD->Reserved3 = 0;
2283 pCSD->ContentProtectAppli = (uint8_t)((hsd->CSD[3] & 0x00010000U) >> 16U);
2285 pCSD->FileFormatGroup = (uint8_t)((hsd->CSD[3] & 0x00008000U) >> 15U);
2287 pCSD->CopyFlag = (uint8_t)((hsd->CSD[3] & 0x00004000U) >> 14U);
2289 pCSD->PermWrProtect = (uint8_t)((hsd->CSD[3] & 0x00002000U) >> 13U);
2291 pCSD->TempWrProtect = (uint8_t)((hsd->CSD[3] & 0x00001000U) >> 12U);
2293 pCSD->FileFormat = (uint8_t)((hsd->CSD[3] & 0x00000C00U) >> 10U);
2295 pCSD->ECC = (uint8_t)((hsd->CSD[3] & 0x00000300U) >> 8U);
2297 pCSD->CSD_CRC = (uint8_t)((hsd->CSD[3] & 0x000000FEU) >> 1U);
2299 pCSD->Reserved4 = 1;
2311HAL_StatusTypeDef HAL_SD_GetCardStatus(SD_HandleTypeDef *hsd, HAL_SD_CardStatusTypeDef *pStatus)
2313 uint32_t sd_status[16];
2314 uint32_t errorstate;
2317 if (hsd->State == HAL_SD_STATE_BUSY)
2322 errorstate = SD_SendSDStatus(hsd, sd_status);
2323 if (errorstate != HAL_SD_ERROR_NONE)
2326 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
2327 hsd->ErrorCode |= errorstate;
2328 hsd->State = HAL_SD_STATE_READY;
2333 pStatus->DataBusWidth = (uint8_t)((sd_status[0] & 0xC0U) >> 6U);
2335 pStatus->SecuredMode = (uint8_t)((sd_status[0] & 0x20U) >> 5U);
2337 pStatus->CardType = (uint16_t)(((sd_status[0] & 0x00FF0000U) >> 8U) | ((sd_status[0] & 0xFF000000U) >> 24U));
2339 pStatus->ProtectedAreaSize = (((sd_status[1] & 0xFFU) << 24U) | ((sd_status[1] & 0xFF00U) << 8U) |
2340 ((sd_status[1] & 0xFF0000U) >> 8U) | ((sd_status[1] & 0xFF000000U) >> 24U));
2342 pStatus->SpeedClass = (uint8_t)(sd_status[2] & 0xFFU);
2344 pStatus->PerformanceMove = (uint8_t)((sd_status[2] & 0xFF00U) >> 8U);
2346 pStatus->AllocationUnitSize = (uint8_t)((sd_status[2] & 0xF00000U) >> 20U);
2348 pStatus->EraseSize = (uint16_t)(((sd_status[2] & 0xFF000000U) >> 16U) | (sd_status[3] & 0xFFU));
2350 pStatus->EraseTimeout = (uint8_t)((sd_status[3] & 0xFC00U) >> 10U);
2352 pStatus->EraseOffset = (uint8_t)((sd_status[3] & 0x0300U) >> 8U);
2354 pStatus->UhsSpeedGrade = (uint8_t)((sd_status[3] & 0x00F0U) >> 4U);
2355 pStatus->UhsAllocationUnitSize = (uint8_t)(sd_status[3] & 0x000FU) ;
2356 pStatus->VideoSpeedClass = (uint8_t)((sd_status[4] & 0xFF000000U) >> 24U);
2360 errorstate = SDMMC_CmdBlockLength(hsd->Instance, BLOCKSIZE);
2361 if (errorstate != HAL_SD_ERROR_NONE)
2364 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
2365 hsd->ErrorCode = errorstate;
2366 hsd->State = HAL_SD_STATE_READY;
2380HAL_StatusTypeDef HAL_SD_GetCardInfo(
const SD_HandleTypeDef *hsd, HAL_SD_CardInfoTypeDef *pCardInfo)
2382 pCardInfo->CardType = (uint32_t)(hsd->SdCard.CardType);
2383 pCardInfo->CardVersion = (uint32_t)(hsd->SdCard.CardVersion);
2384 pCardInfo->Class = (uint32_t)(hsd->SdCard.Class);
2385 pCardInfo->RelCardAdd = (uint32_t)(hsd->SdCard.RelCardAdd);
2386 pCardInfo->BlockNbr = (uint32_t)(hsd->SdCard.BlockNbr);
2387 pCardInfo->BlockSize = (uint32_t)(hsd->SdCard.BlockSize);
2388 pCardInfo->LogBlockNbr = (uint32_t)(hsd->SdCard.LogBlockNbr);
2389 pCardInfo->LogBlockSize = (uint32_t)(hsd->SdCard.LogBlockSize);
2405HAL_StatusTypeDef HAL_SD_ConfigWideBusOperation(SD_HandleTypeDef *hsd, uint32_t WideMode)
2407 SDMMC_InitTypeDef Init;
2408 uint32_t errorstate;
2417 hsd->State = HAL_SD_STATE_BUSY;
2419 if (hsd->SdCard.CardType != CARD_SECURED)
2421 if (WideMode == SDMMC_BUS_WIDE_8B)
2423 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2425 else if (WideMode == SDMMC_BUS_WIDE_4B)
2427 errorstate = SD_WideBus_Enable(hsd);
2429 hsd->ErrorCode |= errorstate;
2431 else if (WideMode == SDMMC_BUS_WIDE_1B)
2433 errorstate = SD_WideBus_Disable(hsd);
2435 hsd->ErrorCode |= errorstate;
2440 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
2446 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2449 if (hsd->ErrorCode != HAL_SD_ERROR_NONE)
2452 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
2458 if (sdmmc_clk != 0U)
2461 Init.ClockEdge = hsd->Init.ClockEdge;
2462 Init.ClockPowerSave = hsd->Init.ClockPowerSave;
2463 Init.BusWide = WideMode;
2464 Init.HardwareFlowControl = hsd->Init.HardwareFlowControl;
2467 if (hsd->Init.ClockDiv >= (sdmmc_clk / (2U * SD_NORMAL_SPEED_FREQ)))
2469 Init.ClockDiv = hsd->Init.ClockDiv;
2471 else if (hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED)
2474 Init.ClockDiv = hsd->Init.ClockDiv;
2476 else if (hsd->SdCard.CardSpeed == CARD_HIGH_SPEED)
2479 if (hsd->Init.ClockDiv == 0U)
2481 if (sdmmc_clk > SD_HIGH_SPEED_FREQ)
2483 Init.ClockDiv = sdmmc_clk / (2U * SD_HIGH_SPEED_FREQ);
2487 Init.ClockDiv = hsd->Init.ClockDiv;
2492 if ((sdmmc_clk / (2U * hsd->Init.ClockDiv)) > SD_HIGH_SPEED_FREQ)
2494 Init.ClockDiv = sdmmc_clk / (2U * SD_HIGH_SPEED_FREQ);
2498 Init.ClockDiv = hsd->Init.ClockDiv;
2505 if (hsd->Init.ClockDiv == 0U)
2507 if (sdmmc_clk > SD_NORMAL_SPEED_FREQ)
2509 Init.ClockDiv = sdmmc_clk / (2U * SD_NORMAL_SPEED_FREQ);
2513 Init.ClockDiv = hsd->Init.ClockDiv;
2518 if ((sdmmc_clk / (2U * hsd->Init.ClockDiv)) > SD_NORMAL_SPEED_FREQ)
2520 Init.ClockDiv = sdmmc_clk / (2U * SD_NORMAL_SPEED_FREQ);
2524 Init.ClockDiv = hsd->Init.ClockDiv;
2529#if (USE_SD_TRANSCEIVER != 0U)
2530 Init.TranceiverPresent = hsd->Init.TranceiverPresent;
2533 (void)SDMMC_Init(hsd->Instance, Init);
2537 hsd->ErrorCode |= SDMMC_ERROR_INVALID_PARAMETER;
2543 errorstate = SDMMC_CmdBlockLength(hsd->Instance, BLOCKSIZE);
2544 if (errorstate != HAL_SD_ERROR_NONE)
2547 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
2548 hsd->ErrorCode |= errorstate;
2553 hsd->State = HAL_SD_STATE_READY;
2570HAL_StatusTypeDef HAL_SD_ConfigSpeedBusOperation(SD_HandleTypeDef *hsd, uint32_t SpeedMode)
2573 uint32_t errorstate;
2579 hsd->State = HAL_SD_STATE_BUSY;
2581#if (USE_SD_TRANSCEIVER != 0U)
2582 if (hsd->Init.TranceiverPresent == SDMMC_TRANSCEIVER_PRESENT)
2586 case SDMMC_SPEED_MODE_AUTO:
2588 if ((hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED) ||
2589 (hsd->SdCard.CardType == CARD_SDHC_SDXC))
2593 if (SD_UltraHighSpeed(hsd, SDMMC_SDR104_SWITCH_PATTERN) != HAL_SD_ERROR_NONE)
2595 if (SD_SwitchSpeed(hsd, SDMMC_SDR25_SWITCH_PATTERN) != HAL_SD_ERROR_NONE)
2597 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2602 else if (hsd->SdCard.CardSpeed == CARD_HIGH_SPEED)
2605 if (SD_SwitchSpeed(hsd, SDMMC_SDR25_SWITCH_PATTERN) != HAL_SD_ERROR_NONE)
2607 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2617 case SDMMC_SPEED_MODE_ULTRA_SDR104:
2619 if ((hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED) ||
2620 (hsd->SdCard.CardType == CARD_SDHC_SDXC))
2623 if (SD_UltraHighSpeed(hsd, SDMMC_SDR104_SWITCH_PATTERN) != HAL_SD_ERROR_NONE)
2625 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2632 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2637 case SDMMC_SPEED_MODE_ULTRA_SDR50:
2639 if ((hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED) ||
2640 (hsd->SdCard.CardType == CARD_SDHC_SDXC))
2643 if (SD_UltraHighSpeed(hsd, SDMMC_SDR50_SWITCH_PATTERN) != HAL_SD_ERROR_NONE)
2645 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2652 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2657 case SDMMC_SPEED_MODE_DDR:
2659 if ((hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED) ||
2660 (hsd->SdCard.CardType == CARD_SDHC_SDXC))
2663 if (SD_DDR_Mode(hsd) != HAL_SD_ERROR_NONE)
2665 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2672 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2677 case SDMMC_SPEED_MODE_HIGH:
2679 if ((hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED) ||
2680 (hsd->SdCard.CardSpeed == CARD_HIGH_SPEED) ||
2681 (hsd->SdCard.CardType == CARD_SDHC_SDXC))
2684 if (SD_SwitchSpeed(hsd, SDMMC_SDR25_SWITCH_PATTERN) != HAL_SD_ERROR_NONE)
2686 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2692 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2697 case SDMMC_SPEED_MODE_DEFAULT:
2700 if (SD_SwitchSpeed(hsd, SDMMC_SDR12_SWITCH_PATTERN) != HAL_SD_ERROR_NONE)
2702 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2709 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
2718 case SDMMC_SPEED_MODE_AUTO:
2720 if ((hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED) ||
2721 (hsd->SdCard.CardSpeed == CARD_HIGH_SPEED) ||
2722 (hsd->SdCard.CardType == CARD_SDHC_SDXC))
2725 if (SD_SwitchSpeed(hsd, SDMMC_SDR25_SWITCH_PATTERN) != HAL_SD_ERROR_NONE)
2727 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2737 case SDMMC_SPEED_MODE_HIGH:
2739 if ((hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED) ||
2740 (hsd->SdCard.CardSpeed == CARD_HIGH_SPEED) ||
2741 (hsd->SdCard.CardType == CARD_SDHC_SDXC))
2744 if (SD_SwitchSpeed(hsd, SDMMC_SDR25_SWITCH_PATTERN) != HAL_SD_ERROR_NONE)
2746 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2752 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2757 case SDMMC_SPEED_MODE_DEFAULT:
2760 if (SD_SwitchSpeed(hsd, SDMMC_SDR12_SWITCH_PATTERN) != HAL_SD_ERROR_NONE)
2762 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2768 case SDMMC_SPEED_MODE_ULTRA:
2770 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
2778 case SDMMC_SPEED_MODE_AUTO:
2780 if ((hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED) ||
2781 (hsd->SdCard.CardSpeed == CARD_HIGH_SPEED) ||
2782 (hsd->SdCard.CardType == CARD_SDHC_SDXC))
2785 if (SD_SwitchSpeed(hsd, SDMMC_SDR25_SWITCH_PATTERN) != HAL_SD_ERROR_NONE)
2787 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2797 case SDMMC_SPEED_MODE_HIGH:
2799 if ((hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED) ||
2800 (hsd->SdCard.CardSpeed == CARD_HIGH_SPEED) ||
2801 (hsd->SdCard.CardType == CARD_SDHC_SDXC))
2804 if (SD_SwitchSpeed(hsd, SDMMC_SDR25_SWITCH_PATTERN) != HAL_SD_ERROR_NONE)
2806 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2812 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2817 case SDMMC_SPEED_MODE_DEFAULT:
2820 if (SD_SwitchSpeed(hsd, SDMMC_SDR12_SWITCH_PATTERN) != HAL_SD_ERROR_NONE)
2822 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2828 case SDMMC_SPEED_MODE_ULTRA:
2830 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
2838 while ((HAL_SD_GetCardState(hsd) != HAL_SD_CARD_TRANSFER))
2840 if ((
HAL_GetTick() - tickstart) >= SDMMC_SWDATATIMEOUT)
2842 hsd->ErrorCode = HAL_SD_ERROR_TIMEOUT;
2843 hsd->State = HAL_SD_STATE_READY;
2849 errorstate = SDMMC_CmdBlockLength(hsd->Instance, BLOCKSIZE);
2850 if (errorstate != HAL_SD_ERROR_NONE)
2853 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
2854 hsd->ErrorCode |= errorstate;
2859 hsd->State = HAL_SD_STATE_READY;
2868HAL_SD_CardStateTypeDef HAL_SD_GetCardState(SD_HandleTypeDef *hsd)
2871 uint32_t errorstate;
2874 errorstate = SD_SendStatus(hsd, &resp1);
2875 if (errorstate != HAL_SD_ERROR_NONE)
2877 hsd->ErrorCode |= errorstate;
2880 cardstate = ((resp1 >> 9U) & 0x0FU);
2882 return (HAL_SD_CardStateTypeDef)cardstate;
2893 uint32_t error_code;
2896 if (hsd->State == HAL_SD_STATE_BUSY)
2899 __HAL_SD_DISABLE_IT(hsd, SDMMC_IT_DATAEND | SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | \
2900 SDMMC_IT_TXUNDERR | SDMMC_IT_RXOVERR);
2901 __SDMMC_CMDTRANS_DISABLE(hsd->Instance);
2909 hsd->ErrorCode = SDMMC_CmdStopTransfer(hsd->Instance);
2910 error_code = hsd->ErrorCode;
2911 if ((error_code != HAL_SD_ERROR_NONE) && (error_code != HAL_SD_ERROR_CMD_RSP_TIMEOUT))
2919 if (hsd->ErrorCode == HAL_SD_ERROR_NONE)
2921 while (!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DABORT | SDMMC_FLAG_BUSYD0END))
2923 if ((
HAL_GetTick() - tickstart) >= SDMMC_SWDATATIMEOUT)
2925 hsd->ErrorCode = HAL_SD_ERROR_TIMEOUT;
2926 hsd->State = HAL_SD_STATE_READY;
2932 if (hsd->ErrorCode == HAL_SD_ERROR_CMD_RSP_TIMEOUT)
2934 while (!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DATAEND))
2936 if ((
HAL_GetTick() - tickstart) >= SDMMC_SWDATATIMEOUT)
2938 hsd->ErrorCode = HAL_SD_ERROR_TIMEOUT;
2939 hsd->State = HAL_SD_STATE_READY;
2945 else if ((hsd->Instance->DCTRL &
SDMMC_DCTRL_DTDIR) == SDMMC_TRANSFER_DIR_TO_SDMMC)
2947 while (!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DABORT | SDMMC_FLAG_DATAEND))
2949 if ((
HAL_GetTick() - tickstart) >= SDMMC_SWDATATIMEOUT)
2951 hsd->ErrorCode = HAL_SD_ERROR_TIMEOUT;
2952 hsd->State = HAL_SD_STATE_READY;
2968 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_BUSYD0END);
2969 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
2971 hsd->Instance->IDMACTRL = SDMMC_DISABLE_IDMA;
2973 hsd->State = HAL_SD_STATE_READY;
2976 hsd->Context = SD_CONTEXT_NONE;
2989 HAL_SD_CardStateTypeDef CardState;
2992 __HAL_SD_DISABLE_IT(hsd, SDMMC_IT_DATAEND | SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | \
2993 SDMMC_IT_TXUNDERR | SDMMC_IT_RXOVERR);
2996 hsd->Instance->IDMACTRL = SDMMC_DISABLE_IDMA;
2999 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
3001 CardState = HAL_SD_GetCardState(hsd);
3002 hsd->State = HAL_SD_STATE_READY;
3004 if ((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING))
3006 hsd->ErrorCode = SDMMC_CmdStopTransfer(hsd->Instance);
3009 if (hsd->ErrorCode != HAL_SD_ERROR_NONE)
3015#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
3016 hsd->AbortCpltCallback(hsd);
3018 HAL_SD_AbortCallback(hsd);
3043static uint32_t SD_InitCard(SD_HandleTypeDef *hsd)
3045 HAL_SD_CardCSDTypeDef CSD;
3046 uint32_t errorstate;
3047 uint16_t sd_rca = 0U;
3051 if (SDMMC_GetPowerState(hsd->Instance) == 0U)
3054 return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
3057 if (hsd->SdCard.CardType != CARD_SECURED)
3060 errorstate = SDMMC_CmdSendCID(hsd->Instance);
3061 if (errorstate != HAL_SD_ERROR_NONE)
3068 hsd->CID[0U] = SDMMC_GetResponse(hsd->Instance, SDMMC_RESP1);
3069 hsd->CID[1U] = SDMMC_GetResponse(hsd->Instance, SDMMC_RESP2);
3070 hsd->CID[2U] = SDMMC_GetResponse(hsd->Instance, SDMMC_RESP3);
3071 hsd->CID[3U] = SDMMC_GetResponse(hsd->Instance, SDMMC_RESP4);
3075 if (hsd->SdCard.CardType != CARD_SECURED)
3079 while (sd_rca == 0U)
3081 errorstate = SDMMC_CmdSetRelAdd(hsd->Instance, &sd_rca);
3082 if (errorstate != HAL_SD_ERROR_NONE)
3086 if ((
HAL_GetTick() - tickstart) >= SDMMC_CMDTIMEOUT)
3088 return HAL_SD_ERROR_TIMEOUT;
3092 if (hsd->SdCard.CardType != CARD_SECURED)
3095 hsd->SdCard.RelCardAdd = sd_rca;
3098 errorstate = SDMMC_CmdSendCSD(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
3099 if (errorstate != HAL_SD_ERROR_NONE)
3106 hsd->CSD[0U] = SDMMC_GetResponse(hsd->Instance, SDMMC_RESP1);
3107 hsd->CSD[1U] = SDMMC_GetResponse(hsd->Instance, SDMMC_RESP2);
3108 hsd->CSD[2U] = SDMMC_GetResponse(hsd->Instance, SDMMC_RESP3);
3109 hsd->CSD[3U] = SDMMC_GetResponse(hsd->Instance, SDMMC_RESP4);
3114 hsd->SdCard.Class = (SDMMC_GetResponse(hsd->Instance, SDMMC_RESP2) >> 20U);
3117 if (HAL_SD_GetCardCSD(hsd, &CSD) !=
HAL_OK)
3119 return HAL_SD_ERROR_UNSUPPORTED_FEATURE;
3123 errorstate = SDMMC_CmdSelDesel(hsd->Instance, (uint32_t)(((uint32_t)hsd->SdCard.RelCardAdd) << 16U));
3124 if (errorstate != HAL_SD_ERROR_NONE)
3130 return HAL_SD_ERROR_NONE;
3140static uint32_t SD_PowerON(SD_HandleTypeDef *hsd)
3143 uint32_t response = 0U;
3144 uint32_t validvoltage = 0U;
3145 uint32_t errorstate;
3146#if (USE_SD_TRANSCEIVER != 0U)
3151 errorstate = SDMMC_CmdGoIdleState(hsd->Instance);
3152 if (errorstate != HAL_SD_ERROR_NONE)
3158 errorstate = SDMMC_CmdOperCond(hsd->Instance);
3159 if (errorstate == SDMMC_ERROR_CMD_RSP_TIMEOUT)
3161 hsd->SdCard.CardVersion = CARD_V1_X;
3163 errorstate = SDMMC_CmdGoIdleState(hsd->Instance);
3164 if (errorstate != HAL_SD_ERROR_NONE)
3172 hsd->SdCard.CardVersion = CARD_V2_X;
3175 if (hsd->SdCard.CardVersion == CARD_V2_X)
3178 errorstate = SDMMC_CmdAppCommand(hsd->Instance, 0);
3179 if (errorstate != HAL_SD_ERROR_NONE)
3181 return HAL_SD_ERROR_UNSUPPORTED_FEATURE;
3186 while ((
count < SDMMC_MAX_VOLT_TRIAL) && (validvoltage == 0U))
3189 errorstate = SDMMC_CmdAppCommand(hsd->Instance, 0);
3190 if (errorstate != HAL_SD_ERROR_NONE)
3196 errorstate = SDMMC_CmdAppOperCommand(hsd->Instance, SDMMC_VOLTAGE_WINDOW_SD | SDMMC_HIGH_CAPACITY |
3197 SD_SWITCH_1_8V_CAPACITY);
3198 if (errorstate != HAL_SD_ERROR_NONE)
3200 return HAL_SD_ERROR_UNSUPPORTED_FEATURE;
3204 response = SDMMC_GetResponse(hsd->Instance, SDMMC_RESP1);
3207 validvoltage = (((response >> 31U) == 1U) ? 1U : 0U);
3212 if (
count >= SDMMC_MAX_VOLT_TRIAL)
3214 return HAL_SD_ERROR_INVALID_VOLTRANGE;
3218 hsd->SdCard.CardType = CARD_SDSC;
3220 if ((response & SDMMC_HIGH_CAPACITY) == SDMMC_HIGH_CAPACITY)
3222 hsd->SdCard.CardType = CARD_SDHC_SDXC;
3223#if (USE_SD_TRANSCEIVER != 0U)
3224 if (hsd->Init.TranceiverPresent == SDMMC_TRANSCEIVER_PRESENT)
3226 if ((response & SD_SWITCH_1_8V_CAPACITY) == SD_SWITCH_1_8V_CAPACITY)
3228 hsd->SdCard.CardSpeed = CARD_ULTRA_HIGH_SPEED;
3234 errorstate = SDMMC_CmdVoltageSwitch(hsd->Instance);
3235 if (errorstate != HAL_SD_ERROR_NONE)
3241 while ((hsd->Instance->STA & SDMMC_FLAG_CKSTOP) != SDMMC_FLAG_CKSTOP)
3243 if ((
HAL_GetTick() - tickstart) >= SDMMC_SWDATATIMEOUT)
3245 return HAL_SD_ERROR_TIMEOUT;
3250 hsd->Instance->ICR = SDMMC_FLAG_CKSTOP;
3253 if ((hsd->Instance->STA & SDMMC_FLAG_BUSYD0) != SDMMC_FLAG_BUSYD0)
3256 return SDMMC_ERROR_UNSUPPORTED_FEATURE;
3261#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
3262 hsd->DriveTransceiver_1_8V_Callback(
SET);
3264 HAL_SD_DriveTransceiver_1_8V_Callback(
SET);
3271 while ((hsd->Instance->STA & SDMMC_FLAG_VSWEND) != SDMMC_FLAG_VSWEND)
3273 if ((
HAL_GetTick() - tickstart) >= SDMMC_SWDATATIMEOUT)
3275 return HAL_SD_ERROR_TIMEOUT;
3280 hsd->Instance->ICR = SDMMC_FLAG_VSWEND;
3283 if ((hsd->Instance->STA & SDMMC_FLAG_BUSYD0) == SDMMC_FLAG_BUSYD0)
3286 return HAL_SD_ERROR_INVALID_VOLTRANGE;
3291 hsd->Instance->POWER = 0x13U;
3294 hsd->Instance->ICR = 0xFFFFFFFFU;
3301 return HAL_SD_ERROR_NONE;
3309static void SD_PowerOFF(SD_HandleTypeDef *hsd)
3312 (void)SDMMC_PowerState_OFF(hsd->Instance);
3322static uint32_t SD_SendSDStatus(SD_HandleTypeDef *hsd, uint32_t *pSDstatus)
3324 SDMMC_DataInitTypeDef
config;
3325 uint32_t errorstate;
3328 uint32_t *pData = pSDstatus;
3331 if ((SDMMC_GetResponse(hsd->Instance, SDMMC_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
3333 return HAL_SD_ERROR_LOCK_UNLOCK_FAILED;
3337 errorstate = SDMMC_CmdBlockLength(hsd->Instance, 64U);
3338 if (errorstate != HAL_SD_ERROR_NONE)
3340 hsd->ErrorCode |= HAL_SD_ERROR_NONE;
3345 errorstate = SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
3346 if (errorstate != HAL_SD_ERROR_NONE)
3348 hsd->ErrorCode |= HAL_SD_ERROR_NONE;
3353 config.DataTimeOut = SDMMC_DATATIMEOUT;
3355 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_64B;
3356 config.TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
3357 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
3358 config.DPSM = SDMMC_DPSM_ENABLE;
3359 (void)SDMMC_ConfigData(hsd->Instance, &
config);
3362 errorstate = SDMMC_CmdStatusRegister(hsd->Instance);
3363 if (errorstate != HAL_SD_ERROR_NONE)
3365 hsd->ErrorCode |= HAL_SD_ERROR_NONE;
3370 while (!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DATAEND))
3372 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXFIFOHF))
3376 *pData = SDMMC_ReadFIFO(hsd->Instance);
3381 if ((
HAL_GetTick() - tickstart) >= SDMMC_SWDATATIMEOUT)
3383 return HAL_SD_ERROR_TIMEOUT;
3387 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DTIMEOUT))
3389 return HAL_SD_ERROR_DATA_TIMEOUT;
3391 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DCRCFAIL))
3393 return HAL_SD_ERROR_DATA_CRC_FAIL;
3395 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR))
3397 return HAL_SD_ERROR_RX_OVERRUN;
3404 while ((__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DPSMACT)))
3406 *pData = SDMMC_ReadFIFO(hsd->Instance);
3409 if ((
HAL_GetTick() - tickstart) >= SDMMC_SWDATATIMEOUT)
3411 return HAL_SD_ERROR_TIMEOUT;
3416 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
3418 return HAL_SD_ERROR_NONE;
3428static uint32_t SD_SendStatus(SD_HandleTypeDef *hsd, uint32_t *pCardStatus)
3430 uint32_t errorstate;
3432 if (pCardStatus ==
NULL)
3434 return HAL_SD_ERROR_PARAM;
3438 errorstate = SDMMC_CmdSendStatus(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
3439 if (errorstate != HAL_SD_ERROR_NONE)
3445 *pCardStatus = SDMMC_GetResponse(hsd->Instance, SDMMC_RESP1);
3447 return HAL_SD_ERROR_NONE;
3455static uint32_t SD_WideBus_Enable(SD_HandleTypeDef *hsd)
3457 uint32_t scr[2U] = {0UL, 0UL};
3458 uint32_t errorstate;
3460 if ((SDMMC_GetResponse(hsd->Instance, SDMMC_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
3462 return HAL_SD_ERROR_LOCK_UNLOCK_FAILED;
3466 errorstate = SD_FindSCR(hsd, scr);
3467 if (errorstate != HAL_SD_ERROR_NONE)
3473 if ((scr[1U] & SDMMC_WIDE_BUS_SUPPORT) != SDMMC_ALLZERO)
3476 errorstate = SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
3477 if (errorstate != HAL_SD_ERROR_NONE)
3483 errorstate = SDMMC_CmdBusWidth(hsd->Instance, 2U);
3484 if (errorstate != HAL_SD_ERROR_NONE)
3489 return HAL_SD_ERROR_NONE;
3493 return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
3502static uint32_t SD_WideBus_Disable(SD_HandleTypeDef *hsd)
3504 uint32_t scr[2U] = {0UL, 0UL};
3505 uint32_t errorstate;
3507 if ((SDMMC_GetResponse(hsd->Instance, SDMMC_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
3509 return HAL_SD_ERROR_LOCK_UNLOCK_FAILED;
3513 errorstate = SD_FindSCR(hsd, scr);
3514 if (errorstate != HAL_SD_ERROR_NONE)
3520 if ((scr[1U] & SDMMC_SINGLE_BUS_SUPPORT) != SDMMC_ALLZERO)
3523 errorstate = SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
3524 if (errorstate != HAL_SD_ERROR_NONE)
3530 errorstate = SDMMC_CmdBusWidth(hsd->Instance, 0U);
3531 if (errorstate != HAL_SD_ERROR_NONE)
3536 return HAL_SD_ERROR_NONE;
3540 return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
3550static uint32_t SD_FindSCR(SD_HandleTypeDef *hsd, uint32_t *pSCR)
3552 SDMMC_DataInitTypeDef
config;
3553 uint32_t errorstate;
3555 uint32_t index = 0U;
3556 uint32_t tempscr[2U] = {0UL, 0UL};
3557 uint32_t *scr = pSCR;
3560 errorstate = SDMMC_CmdBlockLength(hsd->Instance, 8U);
3561 if (errorstate != HAL_SD_ERROR_NONE)
3567 errorstate = SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)((hsd->SdCard.RelCardAdd) << 16U));
3568 if (errorstate != HAL_SD_ERROR_NONE)
3573 config.DataTimeOut = SDMMC_DATATIMEOUT;
3575 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_8B;
3576 config.TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
3577 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
3578 config.DPSM = SDMMC_DPSM_ENABLE;
3579 (void)SDMMC_ConfigData(hsd->Instance, &
config);
3582 errorstate = SDMMC_CmdSendSCR(hsd->Instance);
3583 if (errorstate != HAL_SD_ERROR_NONE)
3588 while (!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DBCKEND |
3589 SDMMC_FLAG_DATAEND))
3591 if ((!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXFIFOE)) && (index == 0U))
3593 tempscr[0] = SDMMC_ReadFIFO(hsd->Instance);
3594 tempscr[1] = SDMMC_ReadFIFO(hsd->Instance);
3598 if ((
HAL_GetTick() - tickstart) >= SDMMC_SWDATATIMEOUT)
3600 return HAL_SD_ERROR_TIMEOUT;
3604 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DTIMEOUT))
3606 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DTIMEOUT);
3608 return HAL_SD_ERROR_DATA_TIMEOUT;
3610 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DCRCFAIL))
3612 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DCRCFAIL);
3614 return HAL_SD_ERROR_DATA_CRC_FAIL;
3616 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR))
3618 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_RXOVERR);
3620 return HAL_SD_ERROR_RX_OVERRUN;
3626 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
3628 *scr = (((tempscr[1] & SDMMC_0TO7BITS) << 24U) | ((tempscr[1] & SDMMC_8TO15BITS) << 8U) | \
3629 ((tempscr[1] & SDMMC_16TO23BITS) >> 8U) | ((tempscr[1] & SDMMC_24TO31BITS) >> 24U));
3631 *scr = (((tempscr[0] & SDMMC_0TO7BITS) << 24U) | ((tempscr[0] & SDMMC_8TO15BITS) << 8U) | \
3632 ((tempscr[0] & SDMMC_16TO23BITS) >> 8U) | ((tempscr[0] & SDMMC_24TO31BITS) >> 24U));
3636 return HAL_SD_ERROR_NONE;
3645static void SD_Read_IT(SD_HandleTypeDef *hsd)
3651 tmp = hsd->pRxBuffPtr;
3653 if (hsd->RxXferSize >= SDMMC_FIFO_SIZE)
3658 data = SDMMC_ReadFIFO(hsd->Instance);
3659 *tmp = (uint8_t)(data & 0xFFU);
3661 *tmp = (uint8_t)((data >> 8U) & 0xFFU);
3663 *tmp = (uint8_t)((data >> 16U) & 0xFFU);
3665 *tmp = (uint8_t)((data >> 24U) & 0xFFU);
3669 hsd->pRxBuffPtr = tmp;
3670 hsd->RxXferSize -= SDMMC_FIFO_SIZE;
3680static void SD_Write_IT(SD_HandleTypeDef *hsd)
3686 tmp = hsd->pTxBuffPtr;
3688 if (hsd->TxXferSize >= SDMMC_FIFO_SIZE)
3693 data = (uint32_t)(*tmp);
3695 data |= ((uint32_t)(*tmp) << 8U);
3697 data |= ((uint32_t)(*tmp) << 16U);
3699 data |= ((uint32_t)(*tmp) << 24U);
3701 (void)SDMMC_WriteFIFO(hsd->Instance, &data);
3704 hsd->pTxBuffPtr = tmp;
3705 hsd->TxXferSize -= SDMMC_FIFO_SIZE;
3718uint32_t SD_SwitchSpeed(SD_HandleTypeDef *hsd, uint32_t SwitchSpeedMode)
3720 uint32_t errorstate = HAL_SD_ERROR_NONE;
3721 SDMMC_DataInitTypeDef sdmmc_datainitstructure;
3722 uint32_t SD_hs[16] = {0};
3727 if (hsd->SdCard.CardSpeed == CARD_NORMAL_SPEED)
3730 return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
3733 if (hsd->SdCard.CardSpeed >= CARD_HIGH_SPEED)
3736 hsd->Instance->DCTRL = 0;
3737 errorstate = SDMMC_CmdBlockLength(hsd->Instance, 64U);
3739 if (errorstate != HAL_SD_ERROR_NONE)
3745 sdmmc_datainitstructure.DataTimeOut = SDMMC_DATATIMEOUT;
3746 sdmmc_datainitstructure.DataLength = 64U;
3747 sdmmc_datainitstructure.DataBlockSize = SDMMC_DATABLOCK_SIZE_64B ;
3748 sdmmc_datainitstructure.TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
3749 sdmmc_datainitstructure.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
3750 sdmmc_datainitstructure.DPSM = SDMMC_DPSM_ENABLE;
3752 (void)SDMMC_ConfigData(hsd->Instance, &sdmmc_datainitstructure);
3754 errorstate = SDMMC_CmdSwitch(hsd->Instance, SwitchSpeedMode);
3755 if (errorstate != HAL_SD_ERROR_NONE)
3760 while (!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DBCKEND |
3761 SDMMC_FLAG_DATAEND))
3763 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXFIFOHF))
3767 SD_hs[(8U *
loop) +
count] = SDMMC_ReadFIFO(hsd->Instance);
3771 if ((
HAL_GetTick() - Timeout) >= SDMMC_SWDATATIMEOUT)
3773 hsd->ErrorCode = HAL_SD_ERROR_TIMEOUT;
3774 hsd->State = HAL_SD_STATE_READY;
3775 return HAL_SD_ERROR_TIMEOUT;
3779 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DTIMEOUT))
3781 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DTIMEOUT);
3785 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DCRCFAIL))
3787 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DCRCFAIL);
3789 errorstate = SDMMC_ERROR_DATA_CRC_FAIL;
3793 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR))
3795 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_RXOVERR);
3797 errorstate = SDMMC_ERROR_RX_OVERRUN;
3807 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
3810 if ((((uint8_t *)SD_hs)[13] & 2U) != 2U)
3812 errorstate = SDMMC_ERROR_UNSUPPORTED_FEATURE;
3820#if (USE_SD_TRANSCEIVER != 0U)
3830static uint32_t SD_UltraHighSpeed(SD_HandleTypeDef *hsd, uint32_t UltraHighSpeedMode)
3832 uint32_t errorstate = HAL_SD_ERROR_NONE;
3833 SDMMC_DataInitTypeDef sdmmc_datainitstructure;
3834 uint32_t SD_hs[16] = {0};
3839 if (hsd->SdCard.CardSpeed == CARD_NORMAL_SPEED)
3842 return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
3845 if (hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED)
3848 hsd->Instance->DCTRL = 0;
3849 errorstate = SDMMC_CmdBlockLength(hsd->Instance, 64U);
3851 if (errorstate != HAL_SD_ERROR_NONE)
3857 sdmmc_datainitstructure.DataTimeOut = SDMMC_DATATIMEOUT;
3858 sdmmc_datainitstructure.DataLength = 64U;
3859 sdmmc_datainitstructure.DataBlockSize = SDMMC_DATABLOCK_SIZE_64B ;
3860 sdmmc_datainitstructure.TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
3861 sdmmc_datainitstructure.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
3862 sdmmc_datainitstructure.DPSM = SDMMC_DPSM_ENABLE;
3864 if (SDMMC_ConfigData(hsd->Instance, &sdmmc_datainitstructure) !=
HAL_OK)
3866 return (HAL_SD_ERROR_GENERAL_UNKNOWN_ERR);
3869 errorstate = SDMMC_CmdSwitch(hsd->Instance, UltraHighSpeedMode);
3870 if (errorstate != HAL_SD_ERROR_NONE)
3875 while (!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DBCKEND |
3876 SDMMC_FLAG_DATAEND))
3878 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXFIFOHF))
3882 SD_hs[(8U *
loop) +
count] = SDMMC_ReadFIFO(hsd->Instance);
3887 if ((
HAL_GetTick() - Timeout) >= SDMMC_SWDATATIMEOUT)
3889 hsd->ErrorCode = HAL_SD_ERROR_TIMEOUT;
3890 hsd->State = HAL_SD_STATE_READY;
3891 return HAL_SD_ERROR_TIMEOUT;
3895 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DTIMEOUT))
3897 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DTIMEOUT);
3901 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DCRCFAIL))
3903 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DCRCFAIL);
3905 errorstate = SDMMC_ERROR_DATA_CRC_FAIL;
3909 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR))
3911 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_RXOVERR);
3913 errorstate = SDMMC_ERROR_RX_OVERRUN;
3923 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
3926 if ((((uint8_t *)SD_hs)[13] & 2U) != 2U)
3928 errorstate = SDMMC_ERROR_UNSUPPORTED_FEATURE;
3932#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
3933 hsd->DriveTransceiver_1_8V_Callback(
SET);
3935 HAL_SD_DriveTransceiver_1_8V_Callback(
SET);
3937#if defined (DLYB_SDMMC1) || defined (DLYB_SDMMC2)
3943 return (HAL_SD_ERROR_GENERAL_UNKNOWN_ERR);
3960static uint32_t SD_DDR_Mode(SD_HandleTypeDef *hsd)
3962 uint32_t errorstate = HAL_SD_ERROR_NONE;
3963 SDMMC_DataInitTypeDef sdmmc_datainitstructure;
3964 uint32_t SD_hs[16] = {0};
3969 if (hsd->SdCard.CardSpeed == CARD_NORMAL_SPEED)
3972 return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
3975 if (hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED)
3978 hsd->Instance->DCTRL = 0;
3979 errorstate = SDMMC_CmdBlockLength(hsd->Instance, 64U);
3981 if (errorstate != HAL_SD_ERROR_NONE)
3987 sdmmc_datainitstructure.DataTimeOut = SDMMC_DATATIMEOUT;
3988 sdmmc_datainitstructure.DataLength = 64U;
3989 sdmmc_datainitstructure.DataBlockSize = SDMMC_DATABLOCK_SIZE_64B ;
3990 sdmmc_datainitstructure.TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
3991 sdmmc_datainitstructure.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
3992 sdmmc_datainitstructure.DPSM = SDMMC_DPSM_ENABLE;
3994 if (SDMMC_ConfigData(hsd->Instance, &sdmmc_datainitstructure) !=
HAL_OK)
3996 return (HAL_SD_ERROR_GENERAL_UNKNOWN_ERR);
3999 errorstate = SDMMC_CmdSwitch(hsd->Instance, SDMMC_DDR50_SWITCH_PATTERN);
4000 if (errorstate != HAL_SD_ERROR_NONE)
4005 while (!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DBCKEND |
4006 SDMMC_FLAG_DATAEND))
4008 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXFIFOHF))
4012 SD_hs[(8U *
loop) +
count] = SDMMC_ReadFIFO(hsd->Instance);
4017 if ((
HAL_GetTick() - Timeout) >= SDMMC_SWDATATIMEOUT)
4019 hsd->ErrorCode = HAL_SD_ERROR_TIMEOUT;
4020 hsd->State = HAL_SD_STATE_READY;
4021 return HAL_SD_ERROR_TIMEOUT;
4025 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DTIMEOUT))
4027 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DTIMEOUT);
4031 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DCRCFAIL))
4033 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DCRCFAIL);
4035 errorstate = SDMMC_ERROR_DATA_CRC_FAIL;
4039 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR))
4041 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_RXOVERR);
4043 errorstate = SDMMC_ERROR_RX_OVERRUN;
4053 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
4056 if ((((uint8_t *)SD_hs)[13] & 2U) != 2U)
4058 errorstate = SDMMC_ERROR_UNSUPPORTED_FEATURE;
4062#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
4063 hsd->DriveTransceiver_1_8V_Callback(
SET);
4065 HAL_SD_DriveTransceiver_1_8V_Callback(
SET);
4067#if defined (DLYB_SDMMC1) || defined (DLYB_SDMMC2)
4073 return (HAL_SD_ERROR_GENERAL_UNKNOWN_ERR);
4089__weak
void HAL_SDEx_Read_DMADoubleBuf0CpltCallback(SD_HandleTypeDef *hsd)
4104__weak
void HAL_SDEx_Read_DMADoubleBuf1CpltCallback(SD_HandleTypeDef *hsd)
4119__weak
void HAL_SDEx_Write_DMADoubleBuf0CpltCallback(SD_HandleTypeDef *hsd)
4134__weak
void HAL_SDEx_Write_DMADoubleBuf1CpltCallback(SD_HandleTypeDef *hsd)
#define __IO
Defines 'read / write' permissions.
#define MODIFY_REG(REG, CLEARMASK, SETMASK)
#define READ_BIT(REG, BIT)
#define IS_SDMMC_ALL_INSTANCE(_INSTANCE_)
HAL_StatusTypeDef DelayBlock_Enable(DLYB_TypeDef *DLYBx)
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 SDMMC_CLKCR_DDR
Data rate signaling selection.
#define SDMMC_CLKCR_SELCLKRX
SELCLKRX[1:0] bits (Receive clock selection).
#define SDMMC_CLKCR_SELCLKRX_0
0x00100000
#define SDMMC_POWER_VSWITCHEN
Voltage switch procedure enable.
#define SDMMC_POWER_DIRPOL
Data and Command direction signals polarity selection.
#define SDMMC_POWER_VSWITCH
Voltage switch sequence start.
#define SDMMC_CLKCR_BUSSPEED
Bus speed mode selection.
#define SDMMC_DCTRL_DTDIR
Data transfer direction selection.
#define SDMMC_IDMA_IDMABACT
Uses buffer 1 when double buffer mode is selected.
#define SDMMC_CLKCR_SELCLKRX_1
0x00200000
#define SDMMC_CMD_CMDSTOP
CPSM Treats command as a Stop.
#define SDMMC_DCTRL_FIFORST
FIFO reset.
uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint64_t PeriphClk)
#define RCC_PERIPHCLK_SDMMC
static const idle_config_t config
size_type count(const key_type &key) const
This file contains all the functions prototypes for the HAL module driver.
#define assert_param(expr)
Uncomment the line below to expanse the "assert_param" macro in the HAL drivers code.
HAL_StatusTypeDef
HAL Status structures definition.
#define __HAL_UNLOCK(__HANDLE__)
#define __HAL_LOCK(__HANDLE__)