165#if defined (SDMMC1) || defined (SDMMC2)
166#if defined (HAL_SD_MODULE_ENABLED) || defined (HAL_MMC_MODULE_ENABLED) || defined (HAL_SDIO_MODULE_ENABLED)
208 assert_param(IS_SDMMC_CLOCK_POWER_SAVE(Init.ClockPowerSave));
210 assert_param(IS_SDMMC_HARDWARE_FLOW_CONTROL(Init.HardwareFlowControl));
214 tmpreg |= (Init.ClockEdge | \
215 Init.ClockPowerSave | \
217 Init.HardwareFlowControl | \
255 return (SDMMCx->
FIFO);
267 SDMMCx->
FIFO = *pWriteData;
363 SDMMCx->
ARG = Command->Argument;
366 tmpreg |= (uint32_t)(Command->CmdIndex | \
367 Command->Response | \
368 Command->WaitForInterrupt | \
384 return (uint8_t)(SDMMCx->
RESPCMD);
399uint32_t SDMMC_GetResponse(
const SDMMC_TypeDef *SDMMCx, uint32_t Response)
407 tmp = (uint32_t)(&(SDMMCx->
RESP1)) + Response;
409 return (*(
__IO uint32_t *) tmp);
428 assert_param(IS_SDMMC_TRANSFER_MODE(Data->TransferMode));
432 SDMMCx->
DTIMER = Data->DataTimeOut;
435 SDMMCx->
DLEN = Data->DataLength;
438 tmpreg |= (uint32_t)(Data->DataBlockSize | \
439 Data->TransferDir | \
440 Data->TransferMode | \
467 return (SDMMCx->
FIFO);
482 assert_param(IS_SDMMC_READWAIT_MODE(SDMMC_ReadWaitMode));
514uint32_t SDMMC_CmdBlockLength(
SDMMC_TypeDef *SDMMCx, uint32_t BlockSize)
516 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
520 sdmmc_cmdinit.Argument = (uint32_t)BlockSize;
521 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SET_BLOCKLEN;
522 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
523 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
524 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
525 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
528 errorstate = SDMMC_GetCmdResp1(SDMMCx, SDMMC_CMD_SET_BLOCKLEN, SDMMC_CMDTIMEOUT);
538uint32_t SDMMC_CmdBlockCount(
SDMMC_TypeDef *SDMMCx, uint32_t BlockCount)
540 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
544 sdmmc_cmdinit.Argument = (uint32_t)BlockCount;
545 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SET_BLOCK_COUNT;
546 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
547 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
548 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
549 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
552 errorstate = SDMMC_GetCmdResp1(SDMMCx, SDMMC_CMD_SET_BLOCK_COUNT, SDMMC_CMDTIMEOUT);
562uint32_t SDMMC_CmdReadSingleBlock(
SDMMC_TypeDef *SDMMCx, uint32_t ReadAdd)
564 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
568 sdmmc_cmdinit.Argument = (uint32_t)ReadAdd;
569 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_READ_SINGLE_BLOCK;
570 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
571 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
572 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
573 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
576 errorstate = SDMMC_GetCmdResp1(SDMMCx, SDMMC_CMD_READ_SINGLE_BLOCK, SDMMC_CMDTIMEOUT);
586uint32_t SDMMC_CmdReadMultiBlock(
SDMMC_TypeDef *SDMMCx, uint32_t ReadAdd)
588 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
592 sdmmc_cmdinit.Argument = (uint32_t)ReadAdd;
593 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_READ_MULT_BLOCK;
594 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
595 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
596 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
597 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
600 errorstate = SDMMC_GetCmdResp1(SDMMCx, SDMMC_CMD_READ_MULT_BLOCK, SDMMC_CMDTIMEOUT);
610uint32_t SDMMC_CmdWriteSingleBlock(
SDMMC_TypeDef *SDMMCx, uint32_t WriteAdd)
612 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
616 sdmmc_cmdinit.Argument = (uint32_t)WriteAdd;
617 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_WRITE_SINGLE_BLOCK;
618 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
619 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
620 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
621 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
624 errorstate = SDMMC_GetCmdResp1(SDMMCx, SDMMC_CMD_WRITE_SINGLE_BLOCK, SDMMC_CMDTIMEOUT);
634uint32_t SDMMC_CmdWriteMultiBlock(
SDMMC_TypeDef *SDMMCx, uint32_t WriteAdd)
636 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
640 sdmmc_cmdinit.Argument = (uint32_t)WriteAdd;
641 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_WRITE_MULT_BLOCK;
642 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
643 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
644 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
645 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
648 errorstate = SDMMC_GetCmdResp1(SDMMCx, SDMMC_CMD_WRITE_MULT_BLOCK, SDMMC_CMDTIMEOUT);
658uint32_t SDMMC_CmdSDEraseStartAdd(
SDMMC_TypeDef *SDMMCx, uint32_t StartAdd)
660 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
664 sdmmc_cmdinit.Argument = (uint32_t)StartAdd;
665 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SD_ERASE_GRP_START;
666 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
667 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
668 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
669 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
672 errorstate = SDMMC_GetCmdResp1(SDMMCx, SDMMC_CMD_SD_ERASE_GRP_START, SDMMC_CMDTIMEOUT);
682uint32_t SDMMC_CmdSDEraseEndAdd(
SDMMC_TypeDef *SDMMCx, uint32_t EndAdd)
684 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
688 sdmmc_cmdinit.Argument = (uint32_t)EndAdd;
689 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SD_ERASE_GRP_END;
690 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
691 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
692 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
693 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
696 errorstate = SDMMC_GetCmdResp1(SDMMCx, SDMMC_CMD_SD_ERASE_GRP_END, SDMMC_CMDTIMEOUT);
706uint32_t SDMMC_CmdEraseStartAdd(
SDMMC_TypeDef *SDMMCx, uint32_t StartAdd)
708 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
712 sdmmc_cmdinit.Argument = (uint32_t)StartAdd;
713 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_ERASE_GRP_START;
714 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
715 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
716 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
717 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
720 errorstate = SDMMC_GetCmdResp1(SDMMCx, SDMMC_CMD_ERASE_GRP_START, SDMMC_CMDTIMEOUT);
730uint32_t SDMMC_CmdEraseEndAdd(
SDMMC_TypeDef *SDMMCx, uint32_t EndAdd)
732 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
736 sdmmc_cmdinit.Argument = (uint32_t)EndAdd;
737 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_ERASE_GRP_END;
738 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
739 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
740 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
741 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
744 errorstate = SDMMC_GetCmdResp1(SDMMCx, SDMMC_CMD_ERASE_GRP_END, SDMMC_CMDTIMEOUT);
755uint32_t SDMMC_CmdErase(
SDMMC_TypeDef *SDMMCx, uint32_t EraseType)
757 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
761 sdmmc_cmdinit.Argument = EraseType;
762 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_ERASE;
763 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
764 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
765 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
766 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
769 errorstate = SDMMC_GetCmdResp1(SDMMCx, SDMMC_CMD_ERASE, SDMMC_MAXERASETIMEOUT);
781 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
785 sdmmc_cmdinit.Argument = 0U;
786 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_STOP_TRANSMISSION;
787 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
788 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
789 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
791 __SDMMC_CMDSTOP_ENABLE(SDMMCx);
792 __SDMMC_CMDTRANS_DISABLE(SDMMCx);
794 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
797 errorstate = SDMMC_GetCmdResp1(SDMMCx, SDMMC_CMD_STOP_TRANSMISSION, SDMMC_STOPTRANSFERTIMEOUT);
799 __SDMMC_CMDSTOP_DISABLE(SDMMCx);
802 if (errorstate == SDMMC_ERROR_ADDR_OUT_OF_RANGE)
804 errorstate = SDMMC_ERROR_NONE;
816uint32_t SDMMC_CmdSelDesel(
SDMMC_TypeDef *SDMMCx, uint32_t Addr)
818 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
822 sdmmc_cmdinit.Argument = (uint32_t)Addr;
823 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SEL_DESEL_CARD;
824 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
825 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
826 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
827 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
830 errorstate = SDMMC_GetCmdResp1(SDMMCx, SDMMC_CMD_SEL_DESEL_CARD, SDMMC_CMDTIMEOUT);
842 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
845 sdmmc_cmdinit.Argument = 0U;
846 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_GO_IDLE_STATE;
847 sdmmc_cmdinit.Response = SDMMC_RESPONSE_NO;
848 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
849 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
850 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
853 errorstate = SDMMC_GetCmdError(SDMMCx);
865 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
873 sdmmc_cmdinit.Argument = SDMMC_CHECK_PATTERN;
874 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_HS_SEND_EXT_CSD;
875 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
876 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
877 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
878 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
881 errorstate = SDMMC_GetCmdResp7(SDMMCx);
894uint32_t SDMMC_CmdAppCommand(
SDMMC_TypeDef *SDMMCx, uint32_t Argument)
896 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
899 sdmmc_cmdinit.Argument = (uint32_t)Argument;
900 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_APP_CMD;
901 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
902 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
903 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
904 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
910 errorstate = SDMMC_GetCmdResp1(SDMMCx, SDMMC_CMD_APP_CMD, SDMMC_CMDTIMEOUT);
922uint32_t SDMMC_CmdAppOperCommand(
SDMMC_TypeDef *SDMMCx, uint32_t Argument)
924 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
927 sdmmc_cmdinit.Argument = Argument;
928 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SD_APP_OP_COND;
929 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
930 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
931 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
932 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
935 errorstate = SDMMC_GetCmdResp3(SDMMCx);
946uint32_t SDMMC_CmdBusWidth(
SDMMC_TypeDef *SDMMCx, uint32_t BusWidth)
948 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
951 sdmmc_cmdinit.Argument = (uint32_t)BusWidth;
952 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_APP_SD_SET_BUSWIDTH;
953 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
954 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
955 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
956 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
959 errorstate = SDMMC_GetCmdResp1(SDMMCx, SDMMC_CMD_APP_SD_SET_BUSWIDTH, SDMMC_CMDTIMEOUT);
971 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
975 sdmmc_cmdinit.Argument = 0U;
976 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SD_APP_SEND_SCR;
977 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
978 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
979 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
980 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
983 errorstate = SDMMC_GetCmdResp1(SDMMCx, SDMMC_CMD_SD_APP_SEND_SCR, SDMMC_CMDTIMEOUT);
995 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
999 sdmmc_cmdinit.Argument = 0U;
1000 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_ALL_SEND_CID;
1001 sdmmc_cmdinit.Response = SDMMC_RESPONSE_LONG;
1002 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
1003 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
1004 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
1007 errorstate = SDMMC_GetCmdResp2(SDMMCx);
1018uint32_t SDMMC_CmdSendCSD(
SDMMC_TypeDef *SDMMCx, uint32_t Argument)
1020 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
1021 uint32_t errorstate;
1024 sdmmc_cmdinit.Argument = Argument;
1025 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SEND_CSD;
1026 sdmmc_cmdinit.Response = SDMMC_RESPONSE_LONG;
1027 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
1028 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
1029 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
1032 errorstate = SDMMC_GetCmdResp2(SDMMCx);
1043uint32_t SDMMC_CmdSetRelAdd(
SDMMC_TypeDef *SDMMCx, uint16_t *pRCA)
1045 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
1046 uint32_t errorstate;
1049 sdmmc_cmdinit.Argument = 0U;
1050 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SET_REL_ADDR;
1051 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
1052 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
1053 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
1054 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
1057 errorstate = SDMMC_GetCmdResp6(SDMMCx, SDMMC_CMD_SET_REL_ADDR, pRCA);
1068uint32_t SDMMC_CmdSetRelAddMmc(
SDMMC_TypeDef *SDMMCx, uint16_t RCA)
1070 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
1071 uint32_t errorstate;
1074 sdmmc_cmdinit.Argument = ((uint32_t)RCA << 16U);
1075 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SET_REL_ADDR;
1076 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
1077 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
1078 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
1079 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
1082 errorstate = SDMMC_GetCmdResp1(SDMMCx, SDMMC_CMD_SET_REL_ADDR, SDMMC_CMDTIMEOUT);
1093uint32_t SDMMC_CmdSleepMmc(
SDMMC_TypeDef *SDMMCx, uint32_t Argument)
1095 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
1096 uint32_t errorstate;
1099 sdmmc_cmdinit.Argument = Argument;
1100 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_MMC_SLEEP_AWAKE;
1101 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
1102 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
1103 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
1104 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
1107 errorstate = SDMMC_GetCmdResp1(SDMMCx, SDMMC_CMD_MMC_SLEEP_AWAKE, SDMMC_CMDTIMEOUT);
1118uint32_t SDMMC_CmdSendStatus(
SDMMC_TypeDef *SDMMCx, uint32_t Argument)
1120 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
1121 uint32_t errorstate;
1123 sdmmc_cmdinit.Argument = Argument;
1124 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SEND_STATUS;
1125 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
1126 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
1127 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
1128 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
1131 errorstate = SDMMC_GetCmdResp1(SDMMCx, SDMMC_CMD_SEND_STATUS, SDMMC_CMDTIMEOUT);
1143 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
1144 uint32_t errorstate;
1146 sdmmc_cmdinit.Argument = 0U;
1147 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SD_APP_STATUS;
1148 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
1149 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
1150 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
1151 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
1154 errorstate = SDMMC_GetCmdResp1(SDMMCx, SDMMC_CMD_SD_APP_STATUS, SDMMC_CMDTIMEOUT);
1166uint32_t SDMMC_CmdOpCondition(
SDMMC_TypeDef *SDMMCx, uint32_t Argument)
1168 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
1169 uint32_t errorstate;
1171 sdmmc_cmdinit.Argument = Argument;
1172 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SEND_OP_COND;
1173 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
1174 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
1175 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
1176 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
1179 errorstate = SDMMC_GetCmdResp3(SDMMCx);
1190uint32_t SDMMC_CmdSwitch(
SDMMC_TypeDef *SDMMCx, uint32_t Argument)
1192 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
1193 uint32_t errorstate;
1197 sdmmc_cmdinit.Argument = Argument;
1198 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_HS_SWITCH;
1199 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
1200 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
1201 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
1202 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
1205 errorstate = SDMMC_GetCmdResp1(SDMMCx, SDMMC_CMD_HS_SWITCH, SDMMC_CMDTIMEOUT);
1218 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
1219 uint32_t errorstate;
1221 sdmmc_cmdinit.Argument = 0x00000000;
1222 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_VOLTAGE_SWITCH;
1223 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
1224 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
1225 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
1226 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
1229 errorstate = SDMMC_GetCmdResp1(SDMMCx, SDMMC_CMD_VOLTAGE_SWITCH, SDMMC_CMDTIMEOUT);
1240uint32_t SDMMC_CmdSendEXTCSD(
SDMMC_TypeDef *SDMMCx, uint32_t Argument)
1242 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
1243 uint32_t errorstate;
1246 sdmmc_cmdinit.Argument = Argument;
1247 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_HS_SEND_EXT_CSD;
1248 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
1249 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
1250 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
1251 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
1254 errorstate = SDMMC_GetCmdResp1(SDMMCx, SDMMC_CMD_HS_SEND_EXT_CSD, SDMMC_CMDTIMEOUT);
1266uint32_t SDMMC_SDIO_CmdReadWriteDirect(
SDMMC_TypeDef *SDMMCx, uint32_t Argument, uint8_t *pResponse)
1268 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
1269 uint32_t errorstate;
1271 sdmmc_cmdinit.Argument = Argument;
1272 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SDMMC_RW_DIRECT;
1273 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
1274 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
1275 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
1276 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
1279 errorstate = SDMMC_GetCmdResp5(SDMMCx, SDMMC_CMD_SDMMC_RW_DIRECT, pResponse);
1290uint32_t SDMMC_SDIO_CmdReadWriteExtended(
SDMMC_TypeDef *SDMMCx, uint32_t Argument)
1292 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
1293 uint32_t errorstate;
1295 sdmmc_cmdinit.Argument = Argument;
1296 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SDMMC_RW_EXTENDED;
1297 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
1298 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
1299 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
1300 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
1303 errorstate = SDMMC_GetCmdResp5(SDMMCx, SDMMC_CMD_SDMMC_RW_EXTENDED,
NULL);
1314uint32_t SDMMC_CmdSendOperationcondition(
SDMMC_TypeDef *SDMMCx, uint32_t Argument, uint32_t *pResp)
1316 SDMMC_CmdInitTypeDef sdmmc_cmdinit;
1317 uint32_t errorstate;
1319 sdmmc_cmdinit.Argument = Argument;
1320 sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SDMMC_SEN_OP_COND;
1321 sdmmc_cmdinit.Response = SDMMC_RESPONSE_SHORT;
1322 sdmmc_cmdinit.WaitForInterrupt = SDMMC_WAIT_NO;
1323 sdmmc_cmdinit.CPSM = SDMMC_CPSM_ENABLE;
1324 (void)SDMMC_SendCommand(SDMMCx, &sdmmc_cmdinit);
1327 errorstate = SDMMC_GetCmdResp4(SDMMCx, pResp);
1355uint32_t SDMMC_GetCmdResp1(
SDMMC_TypeDef *SDMMCx, uint8_t SD_CMD, uint32_t Timeout)
1357 uint32_t response_r1;
1368 return SDMMC_ERROR_TIMEOUT;
1370 sta_reg = SDMMCx->
STA;
1371 }
while (((sta_reg & (SDMMC_FLAG_CCRCFAIL | SDMMC_FLAG_CMDREND | SDMMC_FLAG_CTIMEOUT |
1372 SDMMC_FLAG_BUSYD0END)) == 0U) || ((sta_reg & SDMMC_FLAG_CMDACT) != 0U));
1374 if (__SDMMC_GET_FLAG(SDMMCx, SDMMC_FLAG_CTIMEOUT))
1376 __SDMMC_CLEAR_FLAG(SDMMCx, SDMMC_FLAG_CTIMEOUT);
1378 return SDMMC_ERROR_CMD_RSP_TIMEOUT;
1380 else if (__SDMMC_GET_FLAG(SDMMCx, SDMMC_FLAG_CCRCFAIL))
1382 __SDMMC_CLEAR_FLAG(SDMMCx, SDMMC_FLAG_CCRCFAIL);
1384 return SDMMC_ERROR_CMD_CRC_FAIL;
1392 __SDMMC_CLEAR_FLAG(SDMMCx, SDMMC_STATIC_CMD_FLAGS);
1395 if (SDMMC_GetCommandResponse(SDMMCx) != SD_CMD)
1397 return SDMMC_ERROR_CMD_CRC_FAIL;
1401 response_r1 = SDMMC_GetResponse(SDMMCx, SDMMC_RESP1);
1403 if ((response_r1 & SDMMC_OCR_ERRORBITS) == SDMMC_ALLZERO)
1405 return SDMMC_ERROR_NONE;
1407 else if ((response_r1 & SDMMC_OCR_ADDR_OUT_OF_RANGE) == SDMMC_OCR_ADDR_OUT_OF_RANGE)
1409 return SDMMC_ERROR_ADDR_OUT_OF_RANGE;
1411 else if ((response_r1 & SDMMC_OCR_ADDR_MISALIGNED) == SDMMC_OCR_ADDR_MISALIGNED)
1413 return SDMMC_ERROR_ADDR_MISALIGNED;
1415 else if ((response_r1 & SDMMC_OCR_BLOCK_LEN_ERR) == SDMMC_OCR_BLOCK_LEN_ERR)
1417 return SDMMC_ERROR_BLOCK_LEN_ERR;
1419 else if ((response_r1 & SDMMC_OCR_ERASE_SEQ_ERR) == SDMMC_OCR_ERASE_SEQ_ERR)
1421 return SDMMC_ERROR_ERASE_SEQ_ERR;
1423 else if ((response_r1 & SDMMC_OCR_BAD_ERASE_PARAM) == SDMMC_OCR_BAD_ERASE_PARAM)
1425 return SDMMC_ERROR_BAD_ERASE_PARAM;
1427 else if ((response_r1 & SDMMC_OCR_WRITE_PROT_VIOLATION) == SDMMC_OCR_WRITE_PROT_VIOLATION)
1429 return SDMMC_ERROR_WRITE_PROT_VIOLATION;
1431 else if ((response_r1 & SDMMC_OCR_LOCK_UNLOCK_FAILED) == SDMMC_OCR_LOCK_UNLOCK_FAILED)
1433 return SDMMC_ERROR_LOCK_UNLOCK_FAILED;
1435 else if ((response_r1 & SDMMC_OCR_COM_CRC_FAILED) == SDMMC_OCR_COM_CRC_FAILED)
1437 return SDMMC_ERROR_COM_CRC_FAILED;
1439 else if ((response_r1 & SDMMC_OCR_ILLEGAL_CMD) == SDMMC_OCR_ILLEGAL_CMD)
1441 return SDMMC_ERROR_ILLEGAL_CMD;
1443 else if ((response_r1 & SDMMC_OCR_CARD_ECC_FAILED) == SDMMC_OCR_CARD_ECC_FAILED)
1445 return SDMMC_ERROR_CARD_ECC_FAILED;
1447 else if ((response_r1 & SDMMC_OCR_CC_ERROR) == SDMMC_OCR_CC_ERROR)
1449 return SDMMC_ERROR_CC_ERR;
1451 else if ((response_r1 & SDMMC_OCR_STREAM_READ_UNDERRUN) == SDMMC_OCR_STREAM_READ_UNDERRUN)
1453 return SDMMC_ERROR_STREAM_READ_UNDERRUN;
1455 else if ((response_r1 & SDMMC_OCR_STREAM_WRITE_OVERRUN) == SDMMC_OCR_STREAM_WRITE_OVERRUN)
1457 return SDMMC_ERROR_STREAM_WRITE_OVERRUN;
1459 else if ((response_r1 & SDMMC_OCR_CID_CSD_OVERWRITE) == SDMMC_OCR_CID_CSD_OVERWRITE)
1461 return SDMMC_ERROR_CID_CSD_OVERWRITE;
1463 else if ((response_r1 & SDMMC_OCR_WP_ERASE_SKIP) == SDMMC_OCR_WP_ERASE_SKIP)
1465 return SDMMC_ERROR_WP_ERASE_SKIP;
1467 else if ((response_r1 & SDMMC_OCR_CARD_ECC_DISABLED) == SDMMC_OCR_CARD_ECC_DISABLED)
1469 return SDMMC_ERROR_CARD_ECC_DISABLED;
1471 else if ((response_r1 & SDMMC_OCR_ERASE_RESET) == SDMMC_OCR_ERASE_RESET)
1473 return SDMMC_ERROR_ERASE_RESET;
1475 else if ((response_r1 & SDMMC_OCR_AKE_SEQ_ERROR) == SDMMC_OCR_AKE_SEQ_ERROR)
1477 return SDMMC_ERROR_AKE_SEQ_ERR;
1481 return SDMMC_ERROR_GENERAL_UNKNOWN_ERR;
1501 return SDMMC_ERROR_TIMEOUT;
1503 sta_reg = SDMMCx->
STA;
1504 }
while (((sta_reg & (SDMMC_FLAG_CCRCFAIL | SDMMC_FLAG_CMDREND | SDMMC_FLAG_CTIMEOUT)) == 0U) ||
1505 ((sta_reg & SDMMC_FLAG_CMDACT) != 0U));
1507 if (__SDMMC_GET_FLAG(SDMMCx, SDMMC_FLAG_CTIMEOUT))
1509 __SDMMC_CLEAR_FLAG(SDMMCx, SDMMC_FLAG_CTIMEOUT);
1511 return SDMMC_ERROR_CMD_RSP_TIMEOUT;
1513 else if (__SDMMC_GET_FLAG(SDMMCx, SDMMC_FLAG_CCRCFAIL))
1515 __SDMMC_CLEAR_FLAG(SDMMCx, SDMMC_FLAG_CCRCFAIL);
1517 return SDMMC_ERROR_CMD_CRC_FAIL;
1523 __SDMMC_CLEAR_FLAG(SDMMCx, SDMMC_STATIC_CMD_FLAGS);
1526 return SDMMC_ERROR_NONE;
1545 return SDMMC_ERROR_TIMEOUT;
1547 sta_reg = SDMMCx->
STA;
1548 }
while (((sta_reg & (SDMMC_FLAG_CCRCFAIL | SDMMC_FLAG_CMDREND | SDMMC_FLAG_CTIMEOUT)) == 0U) ||
1549 ((sta_reg & SDMMC_FLAG_CMDACT) != 0U));
1551 if (__SDMMC_GET_FLAG(SDMMCx, SDMMC_FLAG_CTIMEOUT))
1553 __SDMMC_CLEAR_FLAG(SDMMCx, SDMMC_FLAG_CTIMEOUT);
1555 return SDMMC_ERROR_CMD_RSP_TIMEOUT;
1560 __SDMMC_CLEAR_FLAG(SDMMCx, SDMMC_STATIC_CMD_FLAGS);
1563 return SDMMC_ERROR_NONE;
1572uint32_t SDMMC_GetCmdResp4(
SDMMC_TypeDef *SDMMCx, uint32_t *pResp)
1584 return SDMMC_ERROR_TIMEOUT;
1586 sta_reg = SDMMCx->
STA;
1587 }
while (((sta_reg & (SDMMC_FLAG_CCRCFAIL | SDMMC_FLAG_CMDREND | SDMMC_FLAG_CTIMEOUT)) == 0U) ||
1588 ((sta_reg & SDMMC_FLAG_CMDACT) != 0U));
1590 if (__SDMMC_GET_FLAG(SDMMCx, SDMMC_FLAG_CTIMEOUT))
1592 __SDMMC_CLEAR_FLAG(SDMMCx, SDMMC_FLAG_CTIMEOUT);
1594 return SDMMC_ERROR_CMD_RSP_TIMEOUT;
1599 __SDMMC_CLEAR_FLAG(SDMMCx, SDMMC_STATIC_CMD_FLAGS);
1603 __SDMMC_CLEAR_FLAG(SDMMCx, SDMMC_STATIC_CMD_FLAGS);
1606 *pResp = SDMMC_GetResponse(SDMMCx, SDMMC_RESP1);
1608 return SDMMC_ERROR_NONE;
1618uint32_t SDMMC_GetCmdResp5(
SDMMC_TypeDef *SDMMCx, uint8_t SDIO_CMD, uint8_t *pData)
1620 uint32_t response_r5;
1631 return SDMMC_ERROR_TIMEOUT;
1633 sta_reg = SDMMCx->
STA;
1634 }
while (((sta_reg & (SDMMC_FLAG_CCRCFAIL | SDMMC_FLAG_CMDREND | SDMMC_FLAG_CTIMEOUT)) == 0U) ||
1635 ((sta_reg & SDMMC_FLAG_CMDACT) != 0U));
1637 if (__SDMMC_GET_FLAG(SDMMCx, SDMMC_FLAG_CTIMEOUT))
1639 __SDMMC_CLEAR_FLAG(SDMMCx, SDMMC_FLAG_CTIMEOUT);
1641 return SDMMC_ERROR_CMD_RSP_TIMEOUT;
1643 else if (__SDMMC_GET_FLAG(SDMMCx, SDMMC_FLAG_CCRCFAIL))
1645 __SDMMC_CLEAR_FLAG(SDMMCx, SDMMC_FLAG_CCRCFAIL);
1647 return SDMMC_ERROR_CMD_CRC_FAIL;
1655 if (SDMMC_GetCommandResponse(SDMMCx) != SDIO_CMD)
1657 return SDMMC_ERROR_CMD_CRC_FAIL;
1661 __SDMMC_CLEAR_FLAG(SDMMCx, SDMMC_STATIC_CMD_FLAGS);
1664 response_r5 = SDMMC_GetResponse(SDMMCx, SDMMC_RESP1);
1666 if ((response_r5 & SDMMC_SDIO_R5_ERRORBITS) == SDMMC_ALLZERO)
1671 *pData = (uint8_t)(response_r5 & 0xFFU);
1674 return SDMMC_ERROR_NONE;
1676 else if ((response_r5 & SDMMC_SDIO_R5_OUT_OF_RANGE) == SDMMC_SDIO_R5_OUT_OF_RANGE)
1678 return SDMMC_ERROR_ADDR_OUT_OF_RANGE;
1680 else if ((response_r5 & SDMMC_SDIO_R5_INVALID_FUNCTION_NUMBER) == SDMMC_SDIO_R5_INVALID_FUNCTION_NUMBER)
1682 return SDMMC_ERROR_INVALID_PARAMETER;
1684 else if ((response_r5 & SDMMC_SDIO_R5_ILLEGAL_CMD) == SDMMC_SDIO_R5_ILLEGAL_CMD)
1686 return SDMMC_ERROR_ILLEGAL_CMD;
1688 else if ((response_r5 & SDMMC_SDIO_R5_COM_CRC_FAILED) == SDMMC_SDIO_R5_COM_CRC_FAILED)
1690 return SDMMC_ERROR_COM_CRC_FAILED;
1694 return SDMMC_ERROR_GENERAL_UNKNOWN_ERR;
1706uint32_t SDMMC_GetCmdResp6(
SDMMC_TypeDef *SDMMCx, uint8_t SD_CMD, uint16_t *pRCA)
1708 uint32_t response_r1;
1719 return SDMMC_ERROR_TIMEOUT;
1721 sta_reg = SDMMCx->
STA;
1722 }
while (((sta_reg & (SDMMC_FLAG_CCRCFAIL | SDMMC_FLAG_CMDREND | SDMMC_FLAG_CTIMEOUT)) == 0U) ||
1723 ((sta_reg & SDMMC_FLAG_CMDACT) != 0U));
1725 if (__SDMMC_GET_FLAG(SDMMCx, SDMMC_FLAG_CTIMEOUT))
1727 __SDMMC_CLEAR_FLAG(SDMMCx, SDMMC_FLAG_CTIMEOUT);
1729 return SDMMC_ERROR_CMD_RSP_TIMEOUT;
1731 else if (__SDMMC_GET_FLAG(SDMMCx, SDMMC_FLAG_CCRCFAIL))
1733 __SDMMC_CLEAR_FLAG(SDMMCx, SDMMC_FLAG_CCRCFAIL);
1735 return SDMMC_ERROR_CMD_CRC_FAIL;
1743 if (SDMMC_GetCommandResponse(SDMMCx) != SD_CMD)
1745 return SDMMC_ERROR_CMD_CRC_FAIL;
1749 __SDMMC_CLEAR_FLAG(SDMMCx, SDMMC_STATIC_CMD_FLAGS);
1752 response_r1 = SDMMC_GetResponse(SDMMCx, SDMMC_RESP1);
1754 if ((response_r1 & (SDMMC_R6_GENERAL_UNKNOWN_ERROR | SDMMC_R6_ILLEGAL_CMD |
1755 SDMMC_R6_COM_CRC_FAILED)) == SDMMC_ALLZERO)
1757 *pRCA = (uint16_t)(response_r1 >> 16);
1759 return SDMMC_ERROR_NONE;
1761 else if ((response_r1 & SDMMC_R6_ILLEGAL_CMD) == SDMMC_R6_ILLEGAL_CMD)
1763 return SDMMC_ERROR_ILLEGAL_CMD;
1765 else if ((response_r1 & SDMMC_R6_COM_CRC_FAILED) == SDMMC_R6_COM_CRC_FAILED)
1767 return SDMMC_ERROR_COM_CRC_FAILED;
1771 return SDMMC_ERROR_GENERAL_UNKNOWN_ERR;
1791 return SDMMC_ERROR_TIMEOUT;
1793 sta_reg = SDMMCx->
STA;
1794 }
while (((sta_reg & (SDMMC_FLAG_CCRCFAIL | SDMMC_FLAG_CMDREND | SDMMC_FLAG_CTIMEOUT)) == 0U) ||
1795 ((sta_reg & SDMMC_FLAG_CMDACT) != 0U));
1797 if (__SDMMC_GET_FLAG(SDMMCx, SDMMC_FLAG_CTIMEOUT))
1800 __SDMMC_CLEAR_FLAG(SDMMCx, SDMMC_FLAG_CTIMEOUT);
1802 return SDMMC_ERROR_CMD_RSP_TIMEOUT;
1805 else if (__SDMMC_GET_FLAG(SDMMCx, SDMMC_FLAG_CCRCFAIL))
1808 __SDMMC_CLEAR_FLAG(SDMMCx, SDMMC_FLAG_CCRCFAIL);
1810 return SDMMC_ERROR_CMD_CRC_FAIL;
1817 if (__SDMMC_GET_FLAG(SDMMCx, SDMMC_FLAG_CMDREND))
1820 __SDMMC_CLEAR_FLAG(SDMMCx, SDMMC_FLAG_CMDREND);
1823 return SDMMC_ERROR_NONE;
1851 return SDMMC_ERROR_TIMEOUT;
1854 }
while (!__SDMMC_GET_FLAG(SDMMCx, SDMMC_FLAG_CMDSENT));
1857 __SDMMC_CLEAR_FLAG(SDMMCx, SDMMC_STATIC_CMD_FLAGS);
1859 return SDMMC_ERROR_NONE;
#define __IO
Defines 'read / write' permissions.
#define MODIFY_REG(REG, CLEARMASK, SETMASK)
#define IS_SDMMC_ALL_INSTANCE(_INSTANCE_)
#define SDMMC_POWER_PWRCTRL_1
0x00000002
#define SDMMC_DCTRL_RWMOD
Read wait mode.
#define SDMMC_POWER_PWRCTRL
PWRCTRL[1:0] bits (Power supply control bits).
uint32_t SystemCoreClock
System Domain1 Clock Frequency.
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.
Secure digital input/output Interface.
__I uint32_t RESPCMD
SDMMC command response register, Address offset: 0x10.
__IO uint32_t DLEN
SDMMC data length register, Address offset: 0x28.
__I uint32_t DCOUNT
SDMMC data counter register, Address offset: 0x30.
__I uint32_t STA
SDMMC status register, Address offset: 0x34.
__IO uint32_t DCTRL
SDMMC data control register, Address offset: 0x2C.
__IO uint32_t ARG
SDMMC argument register, Address offset: 0x08.
__IO uint32_t POWER
SDMMC power control register, Address offset: 0x00.
__IO uint32_t DTIMER
SDMMC data timer register, Address offset: 0x24.
__IO uint32_t FIFO
SDMMC data FIFO register, Address offset: 0x80.
__IO uint32_t CLKCR
SDMMC clock control register, Address offset: 0x04.
__I uint32_t RESP1
SDMMC response 1 register, Address offset: 0x14.
__IO uint32_t CMD
SDMMC command register, Address offset: 0x0C.