STM32F4xx HAL Documentation
Hardware Abstraction Layer for STM32F4 familiy
Loading...
Searching...
No Matches
stm32f4xx_hal_sd.c
Go to the documentation of this file.
1
258/* Includes ------------------------------------------------------------------*/
259#include "stm32f4xx_hal.h"
260
261#if defined(SDIO)
262
271#ifdef HAL_SD_MODULE_ENABLED
272
273/* Private typedef -----------------------------------------------------------*/
274/* Private define ------------------------------------------------------------*/
283/* Private macro -------------------------------------------------------------*/
284/* Private variables ---------------------------------------------------------*/
285/* Private function prototypes -----------------------------------------------*/
286/* Private functions ---------------------------------------------------------*/
290static uint32_t SD_InitCard(SD_HandleTypeDef *hsd);
291static uint32_t SD_PowerON(SD_HandleTypeDef *hsd);
292static uint32_t SD_SendSDStatus(SD_HandleTypeDef *hsd, uint32_t *pSDstatus);
293static uint32_t SD_SendStatus(SD_HandleTypeDef *hsd, uint32_t *pCardStatus);
294static uint32_t SD_WideBus_Enable(SD_HandleTypeDef *hsd);
295static uint32_t SD_WideBus_Disable(SD_HandleTypeDef *hsd);
296static uint32_t SD_FindSCR(SD_HandleTypeDef *hsd, uint32_t *pSCR);
297static void SD_PowerOFF(SD_HandleTypeDef *hsd);
298static void SD_Write_IT(SD_HandleTypeDef *hsd);
299static void SD_Read_IT(SD_HandleTypeDef *hsd);
300static void SD_DMATransmitCplt(DMA_HandleTypeDef *hdma);
301static void SD_DMAReceiveCplt(DMA_HandleTypeDef *hdma);
302static void SD_DMAError(DMA_HandleTypeDef *hdma);
303static void SD_DMATxAbort(DMA_HandleTypeDef *hdma);
304static void SD_DMARxAbort(DMA_HandleTypeDef *hdma);
309/* Exported functions --------------------------------------------------------*/
336{
337 /* Check the SD handle allocation */
338 if(hsd == NULL)
339 {
340 return HAL_ERROR;
341 }
342
343 /* Check the parameters */
344 assert_param(IS_SDIO_ALL_INSTANCE(hsd->Instance));
345 assert_param(IS_SDIO_CLOCK_EDGE(hsd->Init.ClockEdge));
346 assert_param(IS_SDIO_CLOCK_BYPASS(hsd->Init.ClockBypass));
347 assert_param(IS_SDIO_CLOCK_POWER_SAVE(hsd->Init.ClockPowerSave));
348 assert_param(IS_SDIO_BUS_WIDE(hsd->Init.BusWide));
349 assert_param(IS_SDIO_HARDWARE_FLOW_CONTROL(hsd->Init.HardwareFlowControl));
350 assert_param(IS_SDIO_CLKDIV(hsd->Init.ClockDiv));
351
352 if(hsd->State == HAL_SD_STATE_RESET)
353 {
354 /* Allocate lock resource and initialize it */
355 hsd->Lock = HAL_UNLOCKED;
356#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
357 /* Reset Callback pointers in HAL_SD_STATE_RESET only */
358 hsd->TxCpltCallback = HAL_SD_TxCpltCallback;
359 hsd->RxCpltCallback = HAL_SD_RxCpltCallback;
360 hsd->ErrorCallback = HAL_SD_ErrorCallback;
361 hsd->AbortCpltCallback = HAL_SD_AbortCallback;
362
363 if(hsd->MspInitCallback == NULL)
364 {
365 hsd->MspInitCallback = HAL_SD_MspInit;
366 }
367
368 /* Init the low level hardware */
369 hsd->MspInitCallback(hsd);
370#else
371 /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */
372 HAL_SD_MspInit(hsd);
373#endif /* USE_HAL_SD_REGISTER_CALLBACKS */
374 }
375
377
378 /* Initialize the Card parameters */
379 if (HAL_SD_InitCard(hsd) != HAL_OK)
380 {
381 return HAL_ERROR;
382 }
383
384 /* Initialize the error code */
386
387 /* Initialize the SD operation */
389
390 /* Initialize the SD state */
392
393 return HAL_OK;
394}
395
404{
405 uint32_t errorstate;
406 HAL_StatusTypeDef status;
407 SD_InitTypeDef Init;
408
409 /* Default SDIO peripheral configuration for SD card initialization */
410 Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
411 Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
412 Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
413 Init.BusWide = SDIO_BUS_WIDE_1B;
414 Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
415 Init.ClockDiv = SDIO_INIT_CLK_DIV;
416
417 /* Initialize SDIO peripheral interface with default configuration */
418 status = SDIO_Init(hsd->Instance, Init);
419 if(status != HAL_OK)
420 {
421 return HAL_ERROR;
422 }
423
424 /* Disable SDIO Clock */
425 __HAL_SD_DISABLE(hsd);
426
427 /* Set Power State to ON */
428 (void)SDIO_PowerState_ON(hsd->Instance);
429
430 /* Enable SDIO Clock */
431 __HAL_SD_ENABLE(hsd);
432
433 /* Required power up waiting time before starting the SD initialization sequence */
434 HAL_Delay(2);
435
436 /* Identify card operating voltage */
437 errorstate = SD_PowerON(hsd);
438 if(errorstate != HAL_SD_ERROR_NONE)
439 {
441 hsd->ErrorCode |= errorstate;
442 return HAL_ERROR;
443 }
444
445 /* Card initialization */
446 errorstate = SD_InitCard(hsd);
447 if(errorstate != HAL_SD_ERROR_NONE)
448 {
450 hsd->ErrorCode |= errorstate;
451 return HAL_ERROR;
452 }
453
454 /* Set Block Size for Card */
455 errorstate = SDMMC_CmdBlockLength(hsd->Instance, BLOCKSIZE);
456 if(errorstate != HAL_SD_ERROR_NONE)
457 {
458 /* Clear all the static flags */
459 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
460 hsd->ErrorCode |= errorstate;
462 return HAL_ERROR;
463 }
464
465 return HAL_OK;
466}
467
474{
475 /* Check the SD handle allocation */
476 if(hsd == NULL)
477 {
478 return HAL_ERROR;
479 }
480
481 /* Check the parameters */
482 assert_param(IS_SDIO_ALL_INSTANCE(hsd->Instance));
483
485
486 /* Set SD power state to off */
487 SD_PowerOFF(hsd);
488
489#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
490 if(hsd->MspDeInitCallback == NULL)
491 {
492 hsd->MspDeInitCallback = HAL_SD_MspDeInit;
493 }
494
495 /* DeInit the low level hardware */
496 hsd->MspDeInitCallback(hsd);
497#else
498 /* De-Initialize the MSP layer */
499 HAL_SD_MspDeInit(hsd);
500#endif /* USE_HAL_SD_REGISTER_CALLBACKS */
501
504
505 return HAL_OK;
506}
507
508
515{
516 /* Prevent unused argument(s) compilation warning */
517 UNUSED(hsd);
518
519 /* NOTE : This function should not be modified, when the callback is needed,
520 the HAL_SD_MspInit could be implemented in the user file
521 */
522}
523
530{
531 /* Prevent unused argument(s) compilation warning */
532 UNUSED(hsd);
533
534 /* NOTE : This function should not be modified, when the callback is needed,
535 the HAL_SD_MspDeInit could be implemented in the user file
536 */
537}
538
570HAL_StatusTypeDef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout)
571{
572 SDIO_DataInitTypeDef config;
573 uint32_t errorstate;
574 uint32_t tickstart = HAL_GetTick();
575 uint32_t count, data, dataremaining;
576 uint32_t add = BlockAdd;
577 uint8_t *tempbuff = pData;
578
579 if(NULL == pData)
580 {
582 return HAL_ERROR;
583 }
584
585 if(hsd->State == HAL_SD_STATE_READY)
586 {
588
589 if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
590 {
592 return HAL_ERROR;
593 }
594
596
597 /* Initialize data control register */
598 hsd->Instance->DCTRL = 0U;
599
600 if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
601 {
602 add *= 512U;
603 }
604
605 /* Configure the SD DPSM (Data Path State Machine) */
606 config.DataTimeOut = SDMMC_DATATIMEOUT;
607 config.DataLength = NumberOfBlocks * BLOCKSIZE;
608 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
609 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
610 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
611 config.DPSM = SDIO_DPSM_ENABLE;
612 (void)SDIO_ConfigData(hsd->Instance, &config);
613
614 /* Read block(s) in polling mode */
615 if(NumberOfBlocks > 1U)
616 {
618
619 /* Read Multi Block command */
620 errorstate = SDMMC_CmdReadMultiBlock(hsd->Instance, add);
621 }
622 else
623 {
625
626 /* Read Single Block command */
627 errorstate = SDMMC_CmdReadSingleBlock(hsd->Instance, add);
628 }
629 if(errorstate != HAL_SD_ERROR_NONE)
630 {
631 /* Clear all the static flags */
632 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
633 hsd->ErrorCode |= errorstate;
636 return HAL_ERROR;
637 }
638
639 /* Poll on SDIO flags */
640 dataremaining = config.DataLength;
641#if defined(SDIO_STA_STBITERR)
642 while(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_FLAG_STBITERR))
643#else /* SDIO_STA_STBITERR not defined */
644 while(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND))
645#endif /* SDIO_STA_STBITERR */
646 {
647 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF) && (dataremaining > 0U))
648 {
649 /* Read data from SDIO Rx FIFO */
650 for(count = 0U; count < 8U; count++)
651 {
652 data = SDIO_ReadFIFO(hsd->Instance);
653 *tempbuff = (uint8_t)(data & 0xFFU);
654 tempbuff++;
655 dataremaining--;
656 *tempbuff = (uint8_t)((data >> 8U) & 0xFFU);
657 tempbuff++;
658 dataremaining--;
659 *tempbuff = (uint8_t)((data >> 16U) & 0xFFU);
660 tempbuff++;
661 dataremaining--;
662 *tempbuff = (uint8_t)((data >> 24U) & 0xFFU);
663 tempbuff++;
664 dataremaining--;
665 }
666 }
667
668 if(((HAL_GetTick()-tickstart) >= Timeout) || (Timeout == 0U))
669 {
670 /* Clear all the static flags */
671 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
675 return HAL_TIMEOUT;
676 }
677 }
678
679 /* Send stop transmission command in case of multiblock read */
680 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DATAEND) && (NumberOfBlocks > 1U))
681 {
682 if(hsd->SdCard.CardType != CARD_SECURED)
683 {
684 /* Send stop transmission command */
685 errorstate = SDMMC_CmdStopTransfer(hsd->Instance);
686 if(errorstate != HAL_SD_ERROR_NONE)
687 {
688 /* Clear all the static flags */
689 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
690 hsd->ErrorCode |= errorstate;
693 return HAL_ERROR;
694 }
695 }
696 }
697
698 /* Get error state */
699#if defined(SDIO_STA_STBITERR)
700 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT) || (__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_STBITERR)))
701#else /* SDIO_STA_STBITERR not defined */
702 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT))
703#endif /* SDIO_STA_STBITERR */
704 {
705 /* Clear all the static flags */
706 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
710 return HAL_ERROR;
711 }
712 else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL))
713 {
714 /* Clear all the static flags */
715 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
719 return HAL_ERROR;
720 }
721 else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR))
722 {
723 /* Clear all the static flags */
724 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
728 return HAL_ERROR;
729 }
730 else
731 {
732 /* Nothing to do */
733 }
734
735 /* Empty FIFO if there is still any data */
736 while ((__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXDAVL)) && (dataremaining > 0U))
737 {
738 data = SDIO_ReadFIFO(hsd->Instance);
739 *tempbuff = (uint8_t)(data & 0xFFU);
740 tempbuff++;
741 dataremaining--;
742 *tempbuff = (uint8_t)((data >> 8U) & 0xFFU);
743 tempbuff++;
744 dataremaining--;
745 *tempbuff = (uint8_t)((data >> 16U) & 0xFFU);
746 tempbuff++;
747 dataremaining--;
748 *tempbuff = (uint8_t)((data >> 24U) & 0xFFU);
749 tempbuff++;
750 dataremaining--;
751
752 if(((HAL_GetTick()-tickstart) >= Timeout) || (Timeout == 0U))
753 {
754 /* Clear all the static flags */
755 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
759 return HAL_ERROR;
760 }
761 }
762
763 /* Clear all the static flags */
764 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
765
767
768 return HAL_OK;
769 }
770 else
771 {
773 return HAL_ERROR;
774 }
775}
776
789HAL_StatusTypeDef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout)
790{
791 SDIO_DataInitTypeDef config;
792 uint32_t errorstate;
793 uint32_t tickstart = HAL_GetTick();
794 uint32_t count, data, dataremaining;
795 uint32_t add = BlockAdd;
796 uint8_t *tempbuff = pData;
797
798 if(NULL == pData)
799 {
801 return HAL_ERROR;
802 }
803
804 if(hsd->State == HAL_SD_STATE_READY)
805 {
807
808 if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
809 {
811 return HAL_ERROR;
812 }
813
815
816 /* Initialize data control register */
817 hsd->Instance->DCTRL = 0U;
818
819 if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
820 {
821 add *= 512U;
822 }
823
824 /* Configure the SD DPSM (Data Path State Machine) */
825 config.DataTimeOut = SDMMC_DATATIMEOUT;
826 config.DataLength = NumberOfBlocks * BLOCKSIZE;
827 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
828 config.TransferDir = SDIO_TRANSFER_DIR_TO_CARD;
829 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
830 config.DPSM = SDIO_DPSM_ENABLE;
831 (void)SDIO_ConfigData(hsd->Instance, &config);
832
833 /* Write Blocks in Polling mode */
834 if(NumberOfBlocks > 1U)
835 {
837
838 /* Write Multi Block command */
839 errorstate = SDMMC_CmdWriteMultiBlock(hsd->Instance, add);
840 }
841 else
842 {
844
845 /* Write Single Block command */
846 errorstate = SDMMC_CmdWriteSingleBlock(hsd->Instance, add);
847 }
848 if(errorstate != HAL_SD_ERROR_NONE)
849 {
850 /* Clear all the static flags */
851 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
852 hsd->ErrorCode |= errorstate;
855 return HAL_ERROR;
856 }
857
858 /* Write block(s) in polling mode */
859 dataremaining = config.DataLength;
860#if defined(SDIO_STA_STBITERR)
861 while(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_FLAG_STBITERR))
862#else /* SDIO_STA_STBITERR not defined */
863 while(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND))
864#endif /* SDIO_STA_STBITERR */
865 {
866 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXFIFOHE) && (dataremaining > 0U))
867 {
868 /* Write data to SDIO Tx FIFO */
869 for(count = 0U; count < 8U; count++)
870 {
871 data = (uint32_t)(*tempbuff);
872 tempbuff++;
873 dataremaining--;
874 data |= ((uint32_t)(*tempbuff) << 8U);
875 tempbuff++;
876 dataremaining--;
877 data |= ((uint32_t)(*tempbuff) << 16U);
878 tempbuff++;
879 dataremaining--;
880 data |= ((uint32_t)(*tempbuff) << 24U);
881 tempbuff++;
882 dataremaining--;
883 (void)SDIO_WriteFIFO(hsd->Instance, &data);
884 }
885 }
886
887 if(((HAL_GetTick()-tickstart) >= Timeout) || (Timeout == 0U))
888 {
889 /* Clear all the static flags */
890 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
891 hsd->ErrorCode |= errorstate;
894 return HAL_TIMEOUT;
895 }
896 }
897
898 /* Send stop transmission command in case of multiblock write */
899 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DATAEND) && (NumberOfBlocks > 1U))
900 {
901 if(hsd->SdCard.CardType != CARD_SECURED)
902 {
903 /* Send stop transmission command */
904 errorstate = SDMMC_CmdStopTransfer(hsd->Instance);
905 if(errorstate != HAL_SD_ERROR_NONE)
906 {
907 /* Clear all the static flags */
908 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
909 hsd->ErrorCode |= errorstate;
912 return HAL_ERROR;
913 }
914 }
915 }
916
917 /* Get error state */
918#if defined(SDIO_STA_STBITERR)
919 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT) || (__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_STBITERR)))
920#else /* SDIO_STA_STBITERR not defined */
921 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT))
922#endif /* SDIO_STA_STBITERR */
923 {
924 /* Clear all the static flags */
925 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
929 return HAL_ERROR;
930 }
931 else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL))
932 {
933 /* Clear all the static flags */
934 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
938 return HAL_ERROR;
939 }
940 else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR))
941 {
942 /* Clear all the static flags */
943 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
947 return HAL_ERROR;
948 }
949 else
950 {
951 /* Nothing to do */
952 }
953
954 /* Clear all the static flags */
955 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
956
958
959 return HAL_OK;
960 }
961 else
962 {
964 return HAL_ERROR;
965 }
966}
967
981HAL_StatusTypeDef HAL_SD_ReadBlocks_IT(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
982{
983 SDIO_DataInitTypeDef config;
984 uint32_t errorstate;
985 uint32_t add = BlockAdd;
986
987 if(NULL == pData)
988 {
990 return HAL_ERROR;
991 }
992
993 if(hsd->State == HAL_SD_STATE_READY)
994 {
996
997 if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
998 {
1000 return HAL_ERROR;
1001 }
1002
1003 hsd->State = HAL_SD_STATE_BUSY;
1004
1005 /* Initialize data control register */
1006 hsd->Instance->DCTRL = 0U;
1007
1008 hsd->pRxBuffPtr = pData;
1009 hsd->RxXferSize = BLOCKSIZE * NumberOfBlocks;
1010
1011#if defined(SDIO_STA_STBITERR)
1012 __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND | SDIO_FLAG_RXFIFOHF | SDIO_IT_STBITERR));
1013#else /* SDIO_STA_STBITERR not defined */
1014 __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND | SDIO_FLAG_RXFIFOHF));
1015#endif /* SDIO_STA_STBITERR */
1016
1017 if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
1018 {
1019 add *= 512U;
1020 }
1021
1022 /* Configure the SD DPSM (Data Path State Machine) */
1023 config.DataTimeOut = SDMMC_DATATIMEOUT;
1024 config.DataLength = BLOCKSIZE * NumberOfBlocks;
1025 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
1026 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
1027 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
1028 config.DPSM = SDIO_DPSM_ENABLE;
1029 (void)SDIO_ConfigData(hsd->Instance, &config);
1030
1031 /* Read Blocks in IT mode */
1032 if(NumberOfBlocks > 1U)
1033 {
1035
1036 /* Read Multi Block command */
1037 errorstate = SDMMC_CmdReadMultiBlock(hsd->Instance, add);
1038 }
1039 else
1040 {
1042
1043 /* Read Single Block command */
1044 errorstate = SDMMC_CmdReadSingleBlock(hsd->Instance, add);
1045 }
1046 if(errorstate != HAL_SD_ERROR_NONE)
1047 {
1048 /* Clear all the static flags */
1049 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1050 hsd->ErrorCode |= errorstate;
1052 hsd->Context = SD_CONTEXT_NONE;
1053 return HAL_ERROR;
1054 }
1055
1056 return HAL_OK;
1057 }
1058 else
1059 {
1060 return HAL_BUSY;
1061 }
1062}
1063
1077HAL_StatusTypeDef HAL_SD_WriteBlocks_IT(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
1078{
1079 SDIO_DataInitTypeDef config;
1080 uint32_t errorstate;
1081 uint32_t add = BlockAdd;
1082
1083 if(NULL == pData)
1084 {
1086 return HAL_ERROR;
1087 }
1088
1089 if(hsd->State == HAL_SD_STATE_READY)
1090 {
1092
1093 if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
1094 {
1096 return HAL_ERROR;
1097 }
1098
1099 hsd->State = HAL_SD_STATE_BUSY;
1100
1101 /* Initialize data control register */
1102 hsd->Instance->DCTRL = 0U;
1103
1104 hsd->pTxBuffPtr = pData;
1105 hsd->TxXferSize = BLOCKSIZE * NumberOfBlocks;
1106
1107 /* Enable transfer interrupts */
1108#if defined(SDIO_STA_STBITERR)
1109 __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_DATAEND | SDIO_FLAG_TXFIFOHE | SDIO_IT_STBITERR));
1110#else /* SDIO_STA_STBITERR not defined */
1111 __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_DATAEND | SDIO_FLAG_TXFIFOHE));
1112#endif /* SDIO_STA_STBITERR */
1113
1114 if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
1115 {
1116 add *= 512U;
1117 }
1118
1119 /* Write Blocks in Polling mode */
1120 if(NumberOfBlocks > 1U)
1121 {
1123
1124 /* Write Multi Block command */
1125 errorstate = SDMMC_CmdWriteMultiBlock(hsd->Instance, add);
1126 }
1127 else
1128 {
1130
1131 /* Write Single Block command */
1132 errorstate = SDMMC_CmdWriteSingleBlock(hsd->Instance, add);
1133 }
1134 if(errorstate != HAL_SD_ERROR_NONE)
1135 {
1136 /* Clear all the static flags */
1137 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1138 hsd->ErrorCode |= errorstate;
1140 hsd->Context = SD_CONTEXT_NONE;
1141 return HAL_ERROR;
1142 }
1143
1144 /* Configure the SD DPSM (Data Path State Machine) */
1145 config.DataTimeOut = SDMMC_DATATIMEOUT;
1146 config.DataLength = BLOCKSIZE * NumberOfBlocks;
1147 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
1148 config.TransferDir = SDIO_TRANSFER_DIR_TO_CARD;
1149 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
1150 config.DPSM = SDIO_DPSM_ENABLE;
1151 (void)SDIO_ConfigData(hsd->Instance, &config);
1152
1153 return HAL_OK;
1154 }
1155 else
1156 {
1157 return HAL_BUSY;
1158 }
1159}
1160
1174HAL_StatusTypeDef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
1175{
1176 SDIO_DataInitTypeDef config;
1177 uint32_t errorstate;
1178 uint32_t add = BlockAdd;
1179
1180 if(NULL == pData)
1181 {
1183 return HAL_ERROR;
1184 }
1185
1186 if(hsd->State == HAL_SD_STATE_READY)
1187 {
1189
1190 if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
1191 {
1193 return HAL_ERROR;
1194 }
1195
1196 hsd->State = HAL_SD_STATE_BUSY;
1197
1198 /* Initialize data control register */
1199 hsd->Instance->DCTRL = 0U;
1200
1201#if defined(SDIO_STA_STBITERR)
1202 __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND | SDIO_IT_STBITERR));
1203#else /* SDIO_STA_STBITERR not defined */
1204 __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND));
1205#endif /* SDIO_STA_STBITERR */
1206
1207 /* Set the DMA transfer complete callback */
1209
1210 /* Set the DMA error callback */
1212
1213 /* Set the DMA Abort callback */
1214 hsd->hdmarx->XferAbortCallback = NULL;
1215
1216 /* Force DMA Direction */
1218 MODIFY_REG(hsd->hdmarx->Instance->CR, DMA_SxCR_DIR, hsd->hdmarx->Init.Direction);
1219
1220 /* Enable the DMA Channel */
1221 if(HAL_DMA_Start_IT(hsd->hdmarx, (uint32_t)&hsd->Instance->FIFO, (uint32_t)pData, (uint32_t)(BLOCKSIZE * NumberOfBlocks)/4U) != HAL_OK)
1222 {
1223 __HAL_SD_DISABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND));
1224 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1227 return HAL_ERROR;
1228 }
1229 else
1230 {
1231 /* Enable SD DMA transfer */
1233
1234 if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
1235 {
1236 add *= 512U;
1237 }
1238
1239 /* Configure the SD DPSM (Data Path State Machine) */
1240 config.DataTimeOut = SDMMC_DATATIMEOUT;
1241 config.DataLength = BLOCKSIZE * NumberOfBlocks;
1242 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
1243 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
1244 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
1245 config.DPSM = SDIO_DPSM_ENABLE;
1246 (void)SDIO_ConfigData(hsd->Instance, &config);
1247
1248 /* Read Blocks in DMA mode */
1249 if(NumberOfBlocks > 1U)
1250 {
1252
1253 /* Read Multi Block command */
1254 errorstate = SDMMC_CmdReadMultiBlock(hsd->Instance, add);
1255 }
1256 else
1257 {
1259
1260 /* Read Single Block command */
1261 errorstate = SDMMC_CmdReadSingleBlock(hsd->Instance, add);
1262 }
1263 if(errorstate != HAL_SD_ERROR_NONE)
1264 {
1265 /* Clear all the static flags */
1266 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1267 hsd->ErrorCode |= errorstate;
1269 hsd->Context = SD_CONTEXT_NONE;
1270 return HAL_ERROR;
1271 }
1272
1273 return HAL_OK;
1274 }
1275 }
1276 else
1277 {
1278 return HAL_BUSY;
1279 }
1280}
1281
1295HAL_StatusTypeDef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
1296{
1297 SDIO_DataInitTypeDef config;
1298 uint32_t errorstate;
1299 uint32_t add = BlockAdd;
1300
1301 if(NULL == pData)
1302 {
1304 return HAL_ERROR;
1305 }
1306
1307 if(hsd->State == HAL_SD_STATE_READY)
1308 {
1310
1311 if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
1312 {
1314 return HAL_ERROR;
1315 }
1316
1317 hsd->State = HAL_SD_STATE_BUSY;
1318
1319 /* Initialize data control register */
1320 hsd->Instance->DCTRL = 0U;
1321
1322 /* Enable SD Error interrupts */
1323#if defined(SDIO_STA_STBITERR)
1324 __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_STBITERR));
1325#else /* SDIO_STA_STBITERR not defined */
1326 __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR));
1327#endif /* SDIO_STA_STBITERR */
1328
1329 /* Set the DMA transfer complete callback */
1331
1332 /* Set the DMA error callback */
1334
1335 /* Set the DMA Abort callback */
1336 hsd->hdmatx->XferAbortCallback = NULL;
1337
1338 if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
1339 {
1340 add *= 512U;
1341 }
1342
1343 /* Write Blocks in Polling mode */
1344 if(NumberOfBlocks > 1U)
1345 {
1347
1348 /* Write Multi Block command */
1349 errorstate = SDMMC_CmdWriteMultiBlock(hsd->Instance, add);
1350 }
1351 else
1352 {
1354
1355 /* Write Single Block command */
1356 errorstate = SDMMC_CmdWriteSingleBlock(hsd->Instance, add);
1357 }
1358 if(errorstate != HAL_SD_ERROR_NONE)
1359 {
1360 /* Clear all the static flags */
1361 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1362 hsd->ErrorCode |= errorstate;
1364 hsd->Context = SD_CONTEXT_NONE;
1365 return HAL_ERROR;
1366 }
1367
1368 /* Enable SDIO DMA transfer */
1370
1371 /* Force DMA Direction */
1373 MODIFY_REG(hsd->hdmatx->Instance->CR, DMA_SxCR_DIR, hsd->hdmatx->Init.Direction);
1374
1375 /* Enable the DMA Channel */
1376 if(HAL_DMA_Start_IT(hsd->hdmatx, (uint32_t)pData, (uint32_t)&hsd->Instance->FIFO, (uint32_t)(BLOCKSIZE * NumberOfBlocks)/4U) != HAL_OK)
1377 {
1378#if defined(SDIO_STA_STBITERR)
1379 __HAL_SD_DISABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_STBITERR));
1380#else /* SDIO_STA_STBITERR not defined */
1381 __HAL_SD_DISABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR));
1382#endif /* SDIO_STA_STBITERR */
1383 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1386 hsd->Context = SD_CONTEXT_NONE;
1387 return HAL_ERROR;
1388 }
1389 else
1390 {
1391 /* Configure the SD DPSM (Data Path State Machine) */
1392 config.DataTimeOut = SDMMC_DATATIMEOUT;
1393 config.DataLength = BLOCKSIZE * NumberOfBlocks;
1394 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
1395 config.TransferDir = SDIO_TRANSFER_DIR_TO_CARD;
1396 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
1397 config.DPSM = SDIO_DPSM_ENABLE;
1398 (void)SDIO_ConfigData(hsd->Instance, &config);
1399
1400 return HAL_OK;
1401 }
1402 }
1403 else
1404 {
1405 return HAL_BUSY;
1406 }
1407}
1408
1418HAL_StatusTypeDef HAL_SD_Erase(SD_HandleTypeDef *hsd, uint32_t BlockStartAdd, uint32_t BlockEndAdd)
1419{
1420 uint32_t errorstate;
1421 uint32_t start_add = BlockStartAdd;
1422 uint32_t end_add = BlockEndAdd;
1423
1424 if(hsd->State == HAL_SD_STATE_READY)
1425 {
1427
1428 if(end_add < start_add)
1429 {
1431 return HAL_ERROR;
1432 }
1433
1434 if(end_add > (hsd->SdCard.LogBlockNbr))
1435 {
1437 return HAL_ERROR;
1438 }
1439
1440 hsd->State = HAL_SD_STATE_BUSY;
1441
1442 /* Check if the card command class supports erase command */
1443 if(((hsd->SdCard.Class) & SDIO_CCCC_ERASE) == 0U)
1444 {
1445 /* Clear all the static flags */
1446 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1449 return HAL_ERROR;
1450 }
1451
1452 if((SDIO_GetResponse(hsd->Instance, SDIO_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
1453 {
1454 /* Clear all the static flags */
1455 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1458 return HAL_ERROR;
1459 }
1460
1461 /* Get start and end block for high capacity cards */
1462 if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
1463 {
1464 start_add *= 512U;
1465 end_add *= 512U;
1466 }
1467
1468 /* According to sd-card spec 1.0 ERASE_GROUP_START (CMD32) and erase_group_end(CMD33) */
1469 if(hsd->SdCard.CardType != CARD_SECURED)
1470 {
1471 /* Send CMD32 SD_ERASE_GRP_START with argument as addr */
1472 errorstate = SDMMC_CmdSDEraseStartAdd(hsd->Instance, start_add);
1473 if(errorstate != HAL_SD_ERROR_NONE)
1474 {
1475 /* Clear all the static flags */
1476 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1477 hsd->ErrorCode |= errorstate;
1479 return HAL_ERROR;
1480 }
1481
1482 /* Send CMD33 SD_ERASE_GRP_END with argument as addr */
1483 errorstate = SDMMC_CmdSDEraseEndAdd(hsd->Instance, end_add);
1484 if(errorstate != HAL_SD_ERROR_NONE)
1485 {
1486 /* Clear all the static flags */
1487 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1488 hsd->ErrorCode |= errorstate;
1490 return HAL_ERROR;
1491 }
1492 }
1493
1494 /* Send CMD38 ERASE */
1495 errorstate = SDMMC_CmdErase(hsd->Instance);
1496 if(errorstate != HAL_SD_ERROR_NONE)
1497 {
1498 /* Clear all the static flags */
1499 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1500 hsd->ErrorCode |= errorstate;
1502 return HAL_ERROR;
1503 }
1504
1506
1507 return HAL_OK;
1508 }
1509 else
1510 {
1511 return HAL_BUSY;
1512 }
1513}
1514
1521{
1522 uint32_t errorstate;
1523 uint32_t context = hsd->Context;
1524
1525 /* Check for SDIO interrupt flags */
1526 if((__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF) != RESET) && ((context & SD_CONTEXT_IT) != 0U))
1527 {
1528 SD_Read_IT(hsd);
1529 }
1530
1531 else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DATAEND) != RESET)
1532 {
1533 __HAL_SD_CLEAR_FLAG(hsd, SDIO_FLAG_DATAEND);
1534
1535#if defined(SDIO_STA_STBITERR)
1536 __HAL_SD_DISABLE_IT(hsd, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
1537 SDIO_IT_TXUNDERR | SDIO_IT_RXOVERR | SDIO_IT_TXFIFOHE |\
1538 SDIO_IT_RXFIFOHF | SDIO_IT_STBITERR);
1539#else /* SDIO_STA_STBITERR not defined */
1540 __HAL_SD_DISABLE_IT(hsd, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
1541 SDIO_IT_TXUNDERR | SDIO_IT_RXOVERR | SDIO_IT_TXFIFOHE |\
1542 SDIO_IT_RXFIFOHF);
1543#endif /* SDIO_STA_STBITERR */
1544
1545 hsd->Instance->DCTRL &= ~(SDIO_DCTRL_DTEN);
1546
1547 if((context & SD_CONTEXT_IT) != 0U)
1548 {
1549 if(((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U) || ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
1550 {
1551 errorstate = SDMMC_CmdStopTransfer(hsd->Instance);
1552 if(errorstate != HAL_SD_ERROR_NONE)
1553 {
1554 hsd->ErrorCode |= errorstate;
1555#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1556 hsd->ErrorCallback(hsd);
1557#else
1559#endif /* USE_HAL_SD_REGISTER_CALLBACKS */
1560 }
1561 }
1562
1563 /* Clear all the static flags */
1564 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
1565
1567 hsd->Context = SD_CONTEXT_NONE;
1568 if(((context & SD_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
1569 {
1570#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1571 hsd->RxCpltCallback(hsd);
1572#else
1574#endif /* USE_HAL_SD_REGISTER_CALLBACKS */
1575 }
1576 else
1577 {
1578#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1579 hsd->TxCpltCallback(hsd);
1580#else
1582#endif /* USE_HAL_SD_REGISTER_CALLBACKS */
1583 }
1584 }
1585 else if((context & SD_CONTEXT_DMA) != 0U)
1586 {
1587 if((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U)
1588 {
1589 errorstate = SDMMC_CmdStopTransfer(hsd->Instance);
1590 if(errorstate != HAL_SD_ERROR_NONE)
1591 {
1592 hsd->ErrorCode |= errorstate;
1593#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1594 hsd->ErrorCallback(hsd);
1595#else
1597#endif /* USE_HAL_SD_REGISTER_CALLBACKS */
1598 }
1599 }
1600 if(((context & SD_CONTEXT_READ_SINGLE_BLOCK) == 0U) && ((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) == 0U))
1601 {
1602 /* Disable the DMA transfer for transmit request by setting the DMAEN bit
1603 in the SD DCTRL register */
1604 hsd->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
1605
1607
1608#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1609 hsd->TxCpltCallback(hsd);
1610#else
1612#endif /* USE_HAL_SD_REGISTER_CALLBACKS */
1613 }
1614 }
1615 else
1616 {
1617 /* Nothing to do */
1618 }
1619 }
1620
1621 else if((__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXFIFOHE) != RESET) && ((context & SD_CONTEXT_IT) != 0U))
1622 {
1623 SD_Write_IT(hsd);
1624 }
1625
1626#if defined(SDIO_STA_STBITERR)
1627 else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_RXOVERR | SDIO_FLAG_TXUNDERR | SDIO_FLAG_STBITERR) != RESET)
1628#else /* SDIO_STA_STBITERR not defined */
1629 else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_RXOVERR | SDIO_FLAG_TXUNDERR) != RESET)
1630#endif /* SDIO_STA_STBITERR */
1631 {
1632 /* Set Error code */
1633 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL) != RESET)
1634 {
1636 }
1637 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT) != RESET)
1638 {
1640 }
1641 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR) != RESET)
1642 {
1644 }
1645 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR) != RESET)
1646 {
1648 }
1649#if defined(SDIO_STA_STBITERR)
1650 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_STBITERR) != RESET)
1651 {
1653 }
1654#endif /* SDIO_STA_STBITERR */
1655
1656#if defined(SDIO_STA_STBITERR)
1657 /* Clear All flags */
1658 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS | SDIO_FLAG_STBITERR);
1659
1660 /* Disable all interrupts */
1661 __HAL_SD_DISABLE_IT(hsd, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
1662 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR | SDIO_IT_STBITERR);
1663#else /* SDIO_STA_STBITERR not defined */
1664 /* Clear All flags */
1665 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
1666
1667 /* Disable all interrupts */
1668 __HAL_SD_DISABLE_IT(hsd, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
1669 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
1670#endif /* SDIO_STA_STBITERR */
1671
1672 hsd->ErrorCode |= SDMMC_CmdStopTransfer(hsd->Instance);
1673
1674 if((context & SD_CONTEXT_IT) != 0U)
1675 {
1676 /* Set the SD state to ready to be able to start again the process */
1678 hsd->Context = SD_CONTEXT_NONE;
1679#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1680 hsd->ErrorCallback(hsd);
1681#else
1683#endif /* USE_HAL_SD_REGISTER_CALLBACKS */
1684 }
1685 else if((context & SD_CONTEXT_DMA) != 0U)
1686 {
1687 /* Abort the SD DMA channel */
1688 if(((context & SD_CONTEXT_WRITE_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
1689 {
1690 /* Set the DMA Tx abort callback */
1692 /* Abort DMA in IT mode */
1693 if(HAL_DMA_Abort_IT(hsd->hdmatx) != HAL_OK)
1694 {
1695 SD_DMATxAbort(hsd->hdmatx);
1696 }
1697 }
1698 else if(((context & SD_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
1699 {
1700 /* Set the DMA Rx abort callback */
1702 /* Abort DMA in IT mode */
1703 if(HAL_DMA_Abort_IT(hsd->hdmarx) != HAL_OK)
1704 {
1705 SD_DMARxAbort(hsd->hdmarx);
1706 }
1707 }
1708 else
1709 {
1712 hsd->Context = SD_CONTEXT_NONE;
1713#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1714 hsd->AbortCpltCallback(hsd);
1715#else
1717#endif /* USE_HAL_SD_REGISTER_CALLBACKS */
1718 }
1719 }
1720 else
1721 {
1722 /* Nothing to do */
1723 }
1724 }
1725 else
1726 {
1727 /* Nothing to do */
1728 }
1729}
1730
1737{
1738 return hsd->State;
1739}
1740
1748{
1749 return hsd->ErrorCode;
1750}
1751
1758{
1759 /* Prevent unused argument(s) compilation warning */
1760 UNUSED(hsd);
1761
1762 /* NOTE : This function should not be modified, when the callback is needed,
1763 the HAL_SD_TxCpltCallback can be implemented in the user file
1764 */
1765}
1766
1773{
1774 /* Prevent unused argument(s) compilation warning */
1775 UNUSED(hsd);
1776
1777 /* NOTE : This function should not be modified, when the callback is needed,
1778 the HAL_SD_RxCpltCallback can be implemented in the user file
1779 */
1780}
1781
1788{
1789 /* Prevent unused argument(s) compilation warning */
1790 UNUSED(hsd);
1791
1792 /* NOTE : This function should not be modified, when the callback is needed,
1793 the HAL_SD_ErrorCallback can be implemented in the user file
1794 */
1795}
1796
1803{
1804 /* Prevent unused argument(s) compilation warning */
1805 UNUSED(hsd);
1806
1807 /* NOTE : This function should not be modified, when the callback is needed,
1808 the HAL_SD_AbortCallback can be implemented in the user file
1809 */
1810}
1811
1812#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1828HAL_StatusTypeDef HAL_SD_RegisterCallback(SD_HandleTypeDef *hsd, HAL_SD_CallbackIDTypeDef CallbackID, pSD_CallbackTypeDef pCallback)
1829{
1830 HAL_StatusTypeDef status = HAL_OK;
1831
1832 if(pCallback == NULL)
1833 {
1834 /* Update the error code */
1835 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1836 return HAL_ERROR;
1837 }
1838
1839 /* Process locked */
1840 __HAL_LOCK(hsd);
1841
1842 if(hsd->State == HAL_SD_STATE_READY)
1843 {
1844 switch (CallbackID)
1845 {
1846 case HAL_SD_TX_CPLT_CB_ID :
1847 hsd->TxCpltCallback = pCallback;
1848 break;
1849 case HAL_SD_RX_CPLT_CB_ID :
1850 hsd->RxCpltCallback = pCallback;
1851 break;
1852 case HAL_SD_ERROR_CB_ID :
1853 hsd->ErrorCallback = pCallback;
1854 break;
1855 case HAL_SD_ABORT_CB_ID :
1856 hsd->AbortCpltCallback = pCallback;
1857 break;
1858 case HAL_SD_MSP_INIT_CB_ID :
1859 hsd->MspInitCallback = pCallback;
1860 break;
1861 case HAL_SD_MSP_DEINIT_CB_ID :
1862 hsd->MspDeInitCallback = pCallback;
1863 break;
1864 default :
1865 /* Update the error code */
1866 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1867 /* update return status */
1868 status = HAL_ERROR;
1869 break;
1870 }
1871 }
1872 else if (hsd->State == HAL_SD_STATE_RESET)
1873 {
1874 switch (CallbackID)
1875 {
1876 case HAL_SD_MSP_INIT_CB_ID :
1877 hsd->MspInitCallback = pCallback;
1878 break;
1879 case HAL_SD_MSP_DEINIT_CB_ID :
1880 hsd->MspDeInitCallback = pCallback;
1881 break;
1882 default :
1883 /* Update the error code */
1884 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1885 /* update return status */
1886 status = HAL_ERROR;
1887 break;
1888 }
1889 }
1890 else
1891 {
1892 /* Update the error code */
1893 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1894 /* update return status */
1895 status = HAL_ERROR;
1896 }
1897
1898 /* Release Lock */
1899 __HAL_UNLOCK(hsd);
1900 return status;
1901}
1902
1917HAL_StatusTypeDef HAL_SD_UnRegisterCallback(SD_HandleTypeDef *hsd, HAL_SD_CallbackIDTypeDef CallbackID)
1918{
1919 HAL_StatusTypeDef status = HAL_OK;
1920
1921 /* Process locked */
1922 __HAL_LOCK(hsd);
1923
1924 if(hsd->State == HAL_SD_STATE_READY)
1925 {
1926 switch (CallbackID)
1927 {
1928 case HAL_SD_TX_CPLT_CB_ID :
1929 hsd->TxCpltCallback = HAL_SD_TxCpltCallback;
1930 break;
1931 case HAL_SD_RX_CPLT_CB_ID :
1932 hsd->RxCpltCallback = HAL_SD_RxCpltCallback;
1933 break;
1934 case HAL_SD_ERROR_CB_ID :
1935 hsd->ErrorCallback = HAL_SD_ErrorCallback;
1936 break;
1937 case HAL_SD_ABORT_CB_ID :
1938 hsd->AbortCpltCallback = HAL_SD_AbortCallback;
1939 break;
1940 case HAL_SD_MSP_INIT_CB_ID :
1941 hsd->MspInitCallback = HAL_SD_MspInit;
1942 break;
1943 case HAL_SD_MSP_DEINIT_CB_ID :
1944 hsd->MspDeInitCallback = HAL_SD_MspDeInit;
1945 break;
1946 default :
1947 /* Update the error code */
1948 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1949 /* update return status */
1950 status = HAL_ERROR;
1951 break;
1952 }
1953 }
1954 else if (hsd->State == HAL_SD_STATE_RESET)
1955 {
1956 switch (CallbackID)
1957 {
1958 case HAL_SD_MSP_INIT_CB_ID :
1959 hsd->MspInitCallback = HAL_SD_MspInit;
1960 break;
1961 case HAL_SD_MSP_DEINIT_CB_ID :
1962 hsd->MspDeInitCallback = HAL_SD_MspDeInit;
1963 break;
1964 default :
1965 /* Update the error code */
1966 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1967 /* update return status */
1968 status = HAL_ERROR;
1969 break;
1970 }
1971 }
1972 else
1973 {
1974 /* Update the error code */
1975 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1976 /* update return status */
1977 status = HAL_ERROR;
1978 }
1979
1980 /* Release Lock */
1981 __HAL_UNLOCK(hsd);
1982 return status;
1983}
1984#endif /* USE_HAL_SD_REGISTER_CALLBACKS */
1985
2014{
2015 pCID->ManufacturerID = (uint8_t)((hsd->CID[0] & 0xFF000000U) >> 24U);
2016
2017 pCID->OEM_AppliID = (uint16_t)((hsd->CID[0] & 0x00FFFF00U) >> 8U);
2018
2019 pCID->ProdName1 = (((hsd->CID[0] & 0x000000FFU) << 24U) | ((hsd->CID[1] & 0xFFFFFF00U) >> 8U));
2020
2021 pCID->ProdName2 = (uint8_t)(hsd->CID[1] & 0x000000FFU);
2022
2023 pCID->ProdRev = (uint8_t)((hsd->CID[2] & 0xFF000000U) >> 24U);
2024
2025 pCID->ProdSN = (((hsd->CID[2] & 0x00FFFFFFU) << 8U) | ((hsd->CID[3] & 0xFF000000U) >> 24U));
2026
2027 pCID->Reserved1 = (uint8_t)((hsd->CID[3] & 0x00F00000U) >> 20U);
2028
2029 pCID->ManufactDate = (uint16_t)((hsd->CID[3] & 0x000FFF00U) >> 8U);
2030
2031 pCID->CID_CRC = (uint8_t)((hsd->CID[3] & 0x000000FEU) >> 1U);
2032
2033 pCID->Reserved2 = 1U;
2034
2035 return HAL_OK;
2036}
2037
2047{
2048 pCSD->CSDStruct = (uint8_t)((hsd->CSD[0] & 0xC0000000U) >> 30U);
2049
2050 pCSD->SysSpecVersion = (uint8_t)((hsd->CSD[0] & 0x3C000000U) >> 26U);
2051
2052 pCSD->Reserved1 = (uint8_t)((hsd->CSD[0] & 0x03000000U) >> 24U);
2053
2054 pCSD->TAAC = (uint8_t)((hsd->CSD[0] & 0x00FF0000U) >> 16U);
2055
2056 pCSD->NSAC = (uint8_t)((hsd->CSD[0] & 0x0000FF00U) >> 8U);
2057
2058 pCSD->MaxBusClkFrec = (uint8_t)(hsd->CSD[0] & 0x000000FFU);
2059
2060 pCSD->CardComdClasses = (uint16_t)((hsd->CSD[1] & 0xFFF00000U) >> 20U);
2061
2062 pCSD->RdBlockLen = (uint8_t)((hsd->CSD[1] & 0x000F0000U) >> 16U);
2063
2064 pCSD->PartBlockRead = (uint8_t)((hsd->CSD[1] & 0x00008000U) >> 15U);
2065
2066 pCSD->WrBlockMisalign = (uint8_t)((hsd->CSD[1] & 0x00004000U) >> 14U);
2067
2068 pCSD->RdBlockMisalign = (uint8_t)((hsd->CSD[1] & 0x00002000U) >> 13U);
2069
2070 pCSD->DSRImpl = (uint8_t)((hsd->CSD[1] & 0x00001000U) >> 12U);
2071
2072 pCSD->Reserved2 = 0U;
2074 if(hsd->SdCard.CardType == CARD_SDSC)
2075 {
2076 pCSD->DeviceSize = (((hsd->CSD[1] & 0x000003FFU) << 2U) | ((hsd->CSD[2] & 0xC0000000U) >> 30U));
2077
2078 pCSD->MaxRdCurrentVDDMin = (uint8_t)((hsd->CSD[2] & 0x38000000U) >> 27U);
2079
2080 pCSD->MaxRdCurrentVDDMax = (uint8_t)((hsd->CSD[2] & 0x07000000U) >> 24U);
2081
2082 pCSD->MaxWrCurrentVDDMin = (uint8_t)((hsd->CSD[2] & 0x00E00000U) >> 21U);
2083
2084 pCSD->MaxWrCurrentVDDMax = (uint8_t)((hsd->CSD[2] & 0x001C0000U) >> 18U);
2085
2086 pCSD->DeviceSizeMul = (uint8_t)((hsd->CSD[2] & 0x00038000U) >> 15U);
2087
2088 hsd->SdCard.BlockNbr = (pCSD->DeviceSize + 1U) ;
2089 hsd->SdCard.BlockNbr *= (1UL << ((pCSD->DeviceSizeMul & 0x07U) + 2U));
2090 hsd->SdCard.BlockSize = (1UL << (pCSD->RdBlockLen & 0x0FU));
2091
2092 hsd->SdCard.LogBlockNbr = (hsd->SdCard.BlockNbr) * ((hsd->SdCard.BlockSize) / 512U);
2093 hsd->SdCard.LogBlockSize = 512U;
2094 }
2095 else if(hsd->SdCard.CardType == CARD_SDHC_SDXC)
2096 {
2097 /* Byte 7 */
2098 pCSD->DeviceSize = (((hsd->CSD[1] & 0x0000003FU) << 16U) | ((hsd->CSD[2] & 0xFFFF0000U) >> 16U));
2099
2100 hsd->SdCard.BlockNbr = ((pCSD->DeviceSize + 1U) * 1024U);
2101 hsd->SdCard.LogBlockNbr = hsd->SdCard.BlockNbr;
2102 hsd->SdCard.BlockSize = 512U;
2103 hsd->SdCard.LogBlockSize = hsd->SdCard.BlockSize;
2104 }
2105 else
2106 {
2107 /* Clear all the static flags */
2108 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
2111 return HAL_ERROR;
2112 }
2113
2114 pCSD->EraseGrSize = (uint8_t)((hsd->CSD[2] & 0x00004000U) >> 14U);
2115
2116 pCSD->EraseGrMul = (uint8_t)((hsd->CSD[2] & 0x00003F80U) >> 7U);
2117
2118 pCSD->WrProtectGrSize = (uint8_t)(hsd->CSD[2] & 0x0000007FU);
2119
2120 pCSD->WrProtectGrEnable = (uint8_t)((hsd->CSD[3] & 0x80000000U) >> 31U);
2121
2122 pCSD->ManDeflECC = (uint8_t)((hsd->CSD[3] & 0x60000000U) >> 29U);
2123
2124 pCSD->WrSpeedFact = (uint8_t)((hsd->CSD[3] & 0x1C000000U) >> 26U);
2125
2126 pCSD->MaxWrBlockLen= (uint8_t)((hsd->CSD[3] & 0x03C00000U) >> 22U);
2127
2128 pCSD->WriteBlockPaPartial = (uint8_t)((hsd->CSD[3] & 0x00200000U) >> 21U);
2129
2130 pCSD->Reserved3 = 0;
2131
2132 pCSD->ContentProtectAppli = (uint8_t)((hsd->CSD[3] & 0x00010000U) >> 16U);
2133
2134 pCSD->FileFormatGroup = (uint8_t)((hsd->CSD[3] & 0x00008000U) >> 15U);
2135
2136 pCSD->CopyFlag = (uint8_t)((hsd->CSD[3] & 0x00004000U) >> 14U);
2137
2138 pCSD->PermWrProtect = (uint8_t)((hsd->CSD[3] & 0x00002000U) >> 13U);
2139
2140 pCSD->TempWrProtect = (uint8_t)((hsd->CSD[3] & 0x00001000U) >> 12U);
2141
2142 pCSD->FileFormat = (uint8_t)((hsd->CSD[3] & 0x00000C00U) >> 10U);
2143
2144 pCSD->ECC= (uint8_t)((hsd->CSD[3] & 0x00000300U) >> 8U);
2145
2146 pCSD->CSD_CRC = (uint8_t)((hsd->CSD[3] & 0x000000FEU) >> 1U);
2147
2148 pCSD->Reserved4 = 1;
2149
2150 return HAL_OK;
2151}
2152
2161{
2162 uint32_t sd_status[16];
2163 uint32_t errorstate;
2164 HAL_StatusTypeDef status = HAL_OK;
2165
2166 errorstate = SD_SendSDStatus(hsd, sd_status);
2167 if(errorstate != HAL_SD_ERROR_NONE)
2168 {
2169 /* Clear all the static flags */
2170 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
2171 hsd->ErrorCode |= errorstate;
2173 status = HAL_ERROR;
2174 }
2175 else
2176 {
2177 pStatus->DataBusWidth = (uint8_t)((sd_status[0] & 0xC0U) >> 6U);
2178
2179 pStatus->SecuredMode = (uint8_t)((sd_status[0] & 0x20U) >> 5U);
2180
2181 pStatus->CardType = (uint16_t)(((sd_status[0] & 0x00FF0000U) >> 8U) | ((sd_status[0] & 0xFF000000U) >> 24U));
2182
2183 pStatus->ProtectedAreaSize = (((sd_status[1] & 0xFFU) << 24U) | ((sd_status[1] & 0xFF00U) << 8U) |
2184 ((sd_status[1] & 0xFF0000U) >> 8U) | ((sd_status[1] & 0xFF000000U) >> 24U));
2185
2186 pStatus->SpeedClass = (uint8_t)(sd_status[2] & 0xFFU);
2187
2188 pStatus->PerformanceMove = (uint8_t)((sd_status[2] & 0xFF00U) >> 8U);
2189
2190 pStatus->AllocationUnitSize = (uint8_t)((sd_status[2] & 0xF00000U) >> 20U);
2191
2192 pStatus->EraseSize = (uint16_t)(((sd_status[2] & 0xFF000000U) >> 16U) | (sd_status[3] & 0xFFU));
2193
2194 pStatus->EraseTimeout = (uint8_t)((sd_status[3] & 0xFC00U) >> 10U);
2195
2196 pStatus->EraseOffset = (uint8_t)((sd_status[3] & 0x0300U) >> 8U);
2197 }
2198
2199 /* Set Block Size for Card */
2200 errorstate = SDMMC_CmdBlockLength(hsd->Instance, BLOCKSIZE);
2201 if(errorstate != HAL_SD_ERROR_NONE)
2202 {
2203 /* Clear all the static flags */
2204 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
2205 hsd->ErrorCode = errorstate;
2207 status = HAL_ERROR;
2208 }
2209
2210 return status;
2211}
2212
2221{
2222 pCardInfo->CardType = (uint32_t)(hsd->SdCard.CardType);
2223 pCardInfo->CardVersion = (uint32_t)(hsd->SdCard.CardVersion);
2224 pCardInfo->Class = (uint32_t)(hsd->SdCard.Class);
2225 pCardInfo->RelCardAdd = (uint32_t)(hsd->SdCard.RelCardAdd);
2226 pCardInfo->BlockNbr = (uint32_t)(hsd->SdCard.BlockNbr);
2227 pCardInfo->BlockSize = (uint32_t)(hsd->SdCard.BlockSize);
2228 pCardInfo->LogBlockNbr = (uint32_t)(hsd->SdCard.LogBlockNbr);
2229 pCardInfo->LogBlockSize = (uint32_t)(hsd->SdCard.LogBlockSize);
2230
2231 return HAL_OK;
2232}
2233
2246{
2247 SDIO_InitTypeDef Init;
2248 uint32_t errorstate;
2249 HAL_StatusTypeDef status = HAL_OK;
2250
2251 /* Check the parameters */
2252 assert_param(IS_SDIO_BUS_WIDE(WideMode));
2253
2254 /* Change State */
2255 hsd->State = HAL_SD_STATE_BUSY;
2256
2257 if(hsd->SdCard.CardType != CARD_SECURED)
2258 {
2259 if(WideMode == SDIO_BUS_WIDE_8B)
2260 {
2262 }
2263 else if(WideMode == SDIO_BUS_WIDE_4B)
2264 {
2265 errorstate = SD_WideBus_Enable(hsd);
2266
2267 hsd->ErrorCode |= errorstate;
2268 }
2269 else if(WideMode == SDIO_BUS_WIDE_1B)
2270 {
2271 errorstate = SD_WideBus_Disable(hsd);
2272
2273 hsd->ErrorCode |= errorstate;
2274 }
2275 else
2276 {
2277 /* WideMode is not a valid argument*/
2279 }
2280 }
2281 else
2282 {
2283 /* MMC Card does not support this feature */
2285 }
2286
2287 if(hsd->ErrorCode != HAL_SD_ERROR_NONE)
2288 {
2289 /* Clear all the static flags */
2290 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
2292 status = HAL_ERROR;
2293 }
2294 else
2295 {
2296 /* Configure the SDIO peripheral */
2297 Init.ClockEdge = hsd->Init.ClockEdge;
2298 Init.ClockBypass = hsd->Init.ClockBypass;
2299 Init.ClockPowerSave = hsd->Init.ClockPowerSave;
2300 Init.BusWide = WideMode;
2301 Init.HardwareFlowControl = hsd->Init.HardwareFlowControl;
2302 Init.ClockDiv = hsd->Init.ClockDiv;
2303 (void)SDIO_Init(hsd->Instance, Init);
2304 }
2305
2306 /* Set Block Size for Card */
2307 errorstate = SDMMC_CmdBlockLength(hsd->Instance, BLOCKSIZE);
2308 if(errorstate != HAL_SD_ERROR_NONE)
2309 {
2310 /* Clear all the static flags */
2311 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
2312 hsd->ErrorCode |= errorstate;
2313 status = HAL_ERROR;
2314 }
2315
2316 /* Change State */
2318
2319 return status;
2320}
2321
2328{
2329 uint32_t cardstate;
2330 uint32_t errorstate;
2331 uint32_t resp1 = 0;
2332
2333 errorstate = SD_SendStatus(hsd, &resp1);
2334 if(errorstate != HAL_SD_ERROR_NONE)
2335 {
2336 hsd->ErrorCode |= errorstate;
2337 }
2338
2339 cardstate = ((resp1 >> 9U) & 0x0FU);
2340
2341 return (HAL_SD_CardStateTypeDef)cardstate;
2342}
2343
2351{
2352 HAL_SD_CardStateTypeDef CardState;
2353 uint32_t context = hsd->Context;
2354
2355 /* DIsable All interrupts */
2356 __HAL_SD_DISABLE_IT(hsd, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
2357 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
2358
2359 /* Clear All flags */
2360 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
2361
2362 CLEAR_BIT(hsd->Instance->DCTRL, SDIO_DCTRL_DTEN);
2363
2364 if ((context & SD_CONTEXT_DMA) != 0U)
2365 {
2366 /* Disable the SD DMA request */
2367 hsd->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
2368
2369 /* Abort the SD DMA Tx channel */
2370 if (((context & SD_CONTEXT_WRITE_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
2371 {
2372 if(HAL_DMA_Abort(hsd->hdmatx) != HAL_OK)
2373 {
2375 }
2376 }
2377 /* Abort the SD DMA Rx channel */
2378 else if (((context & SD_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
2379 {
2380 if(HAL_DMA_Abort(hsd->hdmarx) != HAL_OK)
2381 {
2383 }
2384 }
2385 else
2386 {
2387 /* Nothing to do */
2388 }
2389 }
2390
2392
2393 /* Initialize the SD operation */
2394 hsd->Context = SD_CONTEXT_NONE;
2395
2396 CardState = HAL_SD_GetCardState(hsd);
2397 if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING))
2398 {
2399 hsd->ErrorCode = SDMMC_CmdStopTransfer(hsd->Instance);
2400 }
2401 if(hsd->ErrorCode != HAL_SD_ERROR_NONE)
2402 {
2403 return HAL_ERROR;
2404 }
2405 return HAL_OK;
2406}
2407
2415{
2416 HAL_SD_CardStateTypeDef CardState;
2417 uint32_t context = hsd->Context;
2418
2419 /* Disable All interrupts */
2420 __HAL_SD_DISABLE_IT(hsd, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
2421 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
2422
2423 CLEAR_BIT(hsd->Instance->DCTRL, SDIO_DCTRL_DTEN);
2424
2425 if ((context & SD_CONTEXT_DMA) != 0U)
2426 {
2427 /* Disable the SD DMA request */
2428 hsd->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
2429
2430 /* Abort the SD DMA Tx channel */
2431 if (((context & SD_CONTEXT_WRITE_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
2432 {
2434 if(HAL_DMA_Abort_IT(hsd->hdmatx) != HAL_OK)
2435 {
2436 hsd->hdmatx = NULL;
2437 }
2438 }
2439 /* Abort the SD DMA Rx channel */
2440 else if (((context & SD_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
2441 {
2443 if(HAL_DMA_Abort_IT(hsd->hdmarx) != HAL_OK)
2444 {
2445 hsd->hdmarx = NULL;
2446 }
2447 }
2448 else
2449 {
2450 /* Nothing to do */
2451 }
2452 }
2453 /* No transfer ongoing on both DMA channels*/
2454 else
2455 {
2456 /* Clear All flags */
2457 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
2458
2459 CardState = HAL_SD_GetCardState(hsd);
2461 hsd->Context = SD_CONTEXT_NONE;
2462 if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING))
2463 {
2464 hsd->ErrorCode = SDMMC_CmdStopTransfer(hsd->Instance);
2465 }
2466 if(hsd->ErrorCode != HAL_SD_ERROR_NONE)
2467 {
2468 return HAL_ERROR;
2469 }
2470 else
2471 {
2472#if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
2473 hsd->AbortCpltCallback(hsd);
2474#else
2476#endif /* USE_HAL_SD_REGISTER_CALLBACKS */
2477 }
2478 }
2479
2480 return HAL_OK;
2481}
2482
2491/* Private function ----------------------------------------------------------*/
2502{
2503 SD_HandleTypeDef* hsd = (SD_HandleTypeDef* )(hdma->Parent);
2504
2505 /* Enable DATAEND Interrupt */
2506 __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DATAEND));
2507}
2508
2515{
2516 SD_HandleTypeDef* hsd = (SD_HandleTypeDef* )(hdma->Parent);
2517 uint32_t errorstate;
2518
2519 /* Send stop command in multiblock write */
2521 {
2522 errorstate = SDMMC_CmdStopTransfer(hsd->Instance);
2523 if(errorstate != HAL_SD_ERROR_NONE)
2524 {
2525 hsd->ErrorCode |= errorstate;
2526#if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2527 hsd->ErrorCallback(hsd);
2528#else
2530#endif
2531 }
2532 }
2533
2534 /* Disable the DMA transfer for transmit request by setting the DMAEN bit
2535 in the SD DCTRL register */
2536 hsd->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
2537
2538 /* Clear all the static flags */
2539 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
2540
2542 hsd->Context = SD_CONTEXT_NONE;
2543
2544#if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2545 hsd->RxCpltCallback(hsd);
2546#else
2548#endif
2549}
2550
2557{
2558 SD_HandleTypeDef* hsd = (SD_HandleTypeDef* )(hdma->Parent);
2559 HAL_SD_CardStateTypeDef CardState;
2560 uint32_t RxErrorCode, TxErrorCode;
2561
2562 /* if DMA error is FIFO error ignore it */
2564 {
2565 RxErrorCode = hsd->hdmarx->ErrorCode;
2566 TxErrorCode = hsd->hdmatx->ErrorCode;
2567 if((RxErrorCode == HAL_DMA_ERROR_TE) || (TxErrorCode == HAL_DMA_ERROR_TE))
2568 {
2569 /* Clear All flags */
2570 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
2571
2572 /* Disable All interrupts */
2573 __HAL_SD_DISABLE_IT(hsd, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
2574 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
2575
2577 CardState = HAL_SD_GetCardState(hsd);
2578 if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING))
2579 {
2580 hsd->ErrorCode |= SDMMC_CmdStopTransfer(hsd->Instance);
2581 }
2582
2584 hsd->Context = SD_CONTEXT_NONE;
2585 }
2586
2587#if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2588 hsd->ErrorCallback(hsd);
2589#else
2591#endif
2592 }
2593}
2594
2601{
2602 SD_HandleTypeDef* hsd = (SD_HandleTypeDef* )(hdma->Parent);
2603 HAL_SD_CardStateTypeDef CardState;
2604
2605 /* Clear All flags */
2606 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
2607
2608 CardState = HAL_SD_GetCardState(hsd);
2610 hsd->Context = SD_CONTEXT_NONE;
2611 if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING))
2612 {
2613 hsd->ErrorCode |= SDMMC_CmdStopTransfer(hsd->Instance);
2614 }
2615
2616 if(hsd->ErrorCode == HAL_SD_ERROR_NONE)
2617 {
2618#if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2619 hsd->AbortCpltCallback(hsd);
2620#else
2622#endif
2623 }
2624 else
2625 {
2626#if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2627 hsd->ErrorCallback(hsd);
2628#else
2630#endif
2631 }
2632}
2633
2640{
2641 SD_HandleTypeDef* hsd = (SD_HandleTypeDef* )(hdma->Parent);
2642 HAL_SD_CardStateTypeDef CardState;
2643
2644 /* Clear All flags */
2645 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
2646
2647 CardState = HAL_SD_GetCardState(hsd);
2649 hsd->Context = SD_CONTEXT_NONE;
2650 if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING))
2651 {
2652 hsd->ErrorCode |= SDMMC_CmdStopTransfer(hsd->Instance);
2653 }
2654
2655 if(hsd->ErrorCode == HAL_SD_ERROR_NONE)
2656 {
2657#if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2658 hsd->AbortCpltCallback(hsd);
2659#else
2661#endif
2662 }
2663 else
2664 {
2665#if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2666 hsd->ErrorCallback(hsd);
2667#else
2669#endif
2670 }
2671}
2672
2678static uint32_t SD_InitCard(SD_HandleTypeDef *hsd)
2679{
2681 uint32_t errorstate;
2682 uint16_t sd_rca = 1U;
2683
2684 /* Check the power State */
2685 if(SDIO_GetPowerState(hsd->Instance) == 0U)
2686 {
2687 /* Power off */
2689 }
2690
2691 if(hsd->SdCard.CardType != CARD_SECURED)
2692 {
2693 /* Send CMD2 ALL_SEND_CID */
2694 errorstate = SDMMC_CmdSendCID(hsd->Instance);
2695 if(errorstate != HAL_SD_ERROR_NONE)
2696 {
2697 return errorstate;
2698 }
2699 else
2700 {
2701 /* Get Card identification number data */
2702 hsd->CID[0U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP1);
2703 hsd->CID[1U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP2);
2704 hsd->CID[2U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP3);
2705 hsd->CID[3U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP4);
2706 }
2707 }
2708
2709 if(hsd->SdCard.CardType != CARD_SECURED)
2710 {
2711 /* Send CMD3 SET_REL_ADDR with argument 0 */
2712 /* SD Card publishes its RCA. */
2713 errorstate = SDMMC_CmdSetRelAdd(hsd->Instance, &sd_rca);
2714 if(errorstate != HAL_SD_ERROR_NONE)
2715 {
2716 return errorstate;
2717 }
2718 }
2719 if(hsd->SdCard.CardType != CARD_SECURED)
2720 {
2721 /* Get the SD card RCA */
2722 hsd->SdCard.RelCardAdd = sd_rca;
2723
2724 /* Send CMD9 SEND_CSD with argument as card's RCA */
2725 errorstate = SDMMC_CmdSendCSD(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
2726 if(errorstate != HAL_SD_ERROR_NONE)
2727 {
2728 return errorstate;
2729 }
2730 else
2731 {
2732 /* Get Card Specific Data */
2733 hsd->CSD[0U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP1);
2734 hsd->CSD[1U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP2);
2735 hsd->CSD[2U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP3);
2736 hsd->CSD[3U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP4);
2737 }
2738 }
2739
2740 /* Get the Card Class */
2741 hsd->SdCard.Class = (SDIO_GetResponse(hsd->Instance, SDIO_RESP2) >> 20U);
2742
2743 /* Get CSD parameters */
2744 if (HAL_SD_GetCardCSD(hsd, &CSD) != HAL_OK)
2745 {
2747 }
2748
2749 /* Select the Card */
2750 errorstate = SDMMC_CmdSelDesel(hsd->Instance, (uint32_t)(((uint32_t)hsd->SdCard.RelCardAdd) << 16U));
2751 if(errorstate != HAL_SD_ERROR_NONE)
2752 {
2753 return errorstate;
2754 }
2755
2756 /* Configure SDIO peripheral interface */
2757 (void)SDIO_Init(hsd->Instance, hsd->Init);
2758
2759 /* All cards are initialized */
2760 return HAL_SD_ERROR_NONE;
2761}
2762
2770static uint32_t SD_PowerON(SD_HandleTypeDef *hsd)
2771{
2772 __IO uint32_t count = 0U;
2773 uint32_t response = 0U, validvoltage = 0U;
2774 uint32_t errorstate;
2775
2776 /* CMD0: GO_IDLE_STATE */
2777 errorstate = SDMMC_CmdGoIdleState(hsd->Instance);
2778 if(errorstate != HAL_SD_ERROR_NONE)
2779 {
2780 return errorstate;
2781 }
2782
2783 /* CMD8: SEND_IF_COND: Command available only on V2.0 cards */
2784 errorstate = SDMMC_CmdOperCond(hsd->Instance);
2785 if(errorstate != HAL_SD_ERROR_NONE)
2786 {
2788 /* CMD0: GO_IDLE_STATE */
2789 errorstate = SDMMC_CmdGoIdleState(hsd->Instance);
2790 if(errorstate != HAL_SD_ERROR_NONE)
2791 {
2792 return errorstate;
2793 }
2794
2795 }
2796 else
2797 {
2799 }
2800
2801 if( hsd->SdCard.CardVersion == CARD_V2_X)
2802 {
2803 /* SEND CMD55 APP_CMD with RCA as 0 */
2804 errorstate = SDMMC_CmdAppCommand(hsd->Instance, 0);
2805 if(errorstate != HAL_SD_ERROR_NONE)
2806 {
2808 }
2809 }
2810 /* SD CARD */
2811 /* Send ACMD41 SD_APP_OP_COND with Argument 0x80100000 */
2812 while((count < SDMMC_MAX_VOLT_TRIAL) && (validvoltage == 0U))
2813 {
2814 /* SEND CMD55 APP_CMD with RCA as 0 */
2815 errorstate = SDMMC_CmdAppCommand(hsd->Instance, 0);
2816 if(errorstate != HAL_SD_ERROR_NONE)
2817 {
2818 return errorstate;
2819 }
2820
2821 /* Send CMD41 */
2822 errorstate = SDMMC_CmdAppOperCommand(hsd->Instance, SDMMC_VOLTAGE_WINDOW_SD | SDMMC_HIGH_CAPACITY | SD_SWITCH_1_8V_CAPACITY);
2823 if(errorstate != HAL_SD_ERROR_NONE)
2824 {
2826 }
2827
2828 /* Get command response */
2829 response = SDIO_GetResponse(hsd->Instance, SDIO_RESP1);
2830
2831 /* Get operating voltage*/
2832 validvoltage = (((response >> 31U) == 1U) ? 1U : 0U);
2833
2834 count++;
2835 }
2836
2837 if(count >= SDMMC_MAX_VOLT_TRIAL)
2838 {
2840 }
2841
2842 if((response & SDMMC_HIGH_CAPACITY) == SDMMC_HIGH_CAPACITY) /* (response &= SD_HIGH_CAPACITY) */
2843 {
2845 }
2846 else
2847 {
2848 hsd->SdCard.CardType = CARD_SDSC;
2849 }
2850
2851
2852 return HAL_SD_ERROR_NONE;
2853}
2854
2861{
2862 /* Set Power State to OFF */
2863 (void)SDIO_PowerState_OFF(hsd->Instance);
2864}
2865
2873static uint32_t SD_SendSDStatus(SD_HandleTypeDef *hsd, uint32_t *pSDstatus)
2874{
2875 SDIO_DataInitTypeDef config;
2876 uint32_t errorstate;
2877 uint32_t tickstart = HAL_GetTick();
2878 uint32_t count;
2879 uint32_t *pData = pSDstatus;
2880
2881 /* Check SD response */
2882 if((SDIO_GetResponse(hsd->Instance, SDIO_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
2883 {
2885 }
2886
2887 /* Set block size for card if it is not equal to current block size for card */
2888 errorstate = SDMMC_CmdBlockLength(hsd->Instance, 64U);
2889 if(errorstate != HAL_SD_ERROR_NONE)
2890 {
2892 return errorstate;
2893 }
2894
2895 /* Send CMD55 */
2896 errorstate = SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
2897 if(errorstate != HAL_SD_ERROR_NONE)
2898 {
2900 return errorstate;
2901 }
2902
2903 /* Configure the SD DPSM (Data Path State Machine) */
2904 config.DataTimeOut = SDMMC_DATATIMEOUT;
2905 config.DataLength = 64U;
2906 config.DataBlockSize = SDIO_DATABLOCK_SIZE_64B;
2907 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
2908 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
2909 config.DPSM = SDIO_DPSM_ENABLE;
2910 (void)SDIO_ConfigData(hsd->Instance, &config);
2911
2912 /* Send ACMD13 (SD_APP_STAUS) with argument as card's RCA */
2913 errorstate = SDMMC_CmdStatusRegister(hsd->Instance);
2914 if(errorstate != HAL_SD_ERROR_NONE)
2915 {
2917 return errorstate;
2918 }
2919
2920 /* Get status data */
2921 while(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND))
2922 {
2923 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF))
2924 {
2925 for(count = 0U; count < 8U; count++)
2926 {
2927 *pData = SDIO_ReadFIFO(hsd->Instance);
2928 pData++;
2929 }
2930 }
2931
2932 if((HAL_GetTick() - tickstart) >= SDMMC_SWDATATIMEOUT)
2933 {
2934 return HAL_SD_ERROR_TIMEOUT;
2935 }
2936 }
2937
2938#if defined(SDIO_STA_STBITERR)
2939 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT) || (__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_STBITERR)))
2940#else /* SDIO_STA_STBITERR not defined */
2941 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT))
2942#endif /* SDIO_STA_STBITERR */
2943 {
2945 }
2946 else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL))
2947 {
2949 }
2950 else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR))
2951 {
2953 }
2954 else
2955 {
2956 /* Nothing to do */
2957 }
2958
2959 while ((__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXDAVL)))
2960 {
2961 *pData = SDIO_ReadFIFO(hsd->Instance);
2962 pData++;
2963
2964 if((HAL_GetTick() - tickstart) >= SDMMC_SWDATATIMEOUT)
2965 {
2966 return HAL_SD_ERROR_TIMEOUT;
2967 }
2968 }
2969
2970 /* Clear all the static status flags*/
2971 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
2972
2973 return HAL_SD_ERROR_NONE;
2974}
2975
2983static uint32_t SD_SendStatus(SD_HandleTypeDef *hsd, uint32_t *pCardStatus)
2984{
2985 uint32_t errorstate;
2986
2987 if(pCardStatus == NULL)
2988 {
2989 return HAL_SD_ERROR_PARAM;
2990 }
2991
2992 /* Send Status command */
2993 errorstate = SDMMC_CmdSendStatus(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
2994 if(errorstate != HAL_SD_ERROR_NONE)
2995 {
2996 return errorstate;
2997 }
2998
2999 /* Get SD card status */
3000 *pCardStatus = SDIO_GetResponse(hsd->Instance, SDIO_RESP1);
3001
3002 return HAL_SD_ERROR_NONE;
3003}
3004
3011{
3012 uint32_t scr[2U] = {0U, 0U};
3013 uint32_t errorstate;
3014
3015 if((SDIO_GetResponse(hsd->Instance, SDIO_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
3016 {
3018 }
3019
3020 /* Get SCR Register */
3021 errorstate = SD_FindSCR(hsd, scr);
3022 if(errorstate != HAL_SD_ERROR_NONE)
3023 {
3024 return errorstate;
3025 }
3026
3027 /* If requested card supports wide bus operation */
3028 if((scr[1U] & SDMMC_WIDE_BUS_SUPPORT) != SDMMC_ALLZERO)
3029 {
3030 /* Send CMD55 APP_CMD with argument as card's RCA.*/
3031 errorstate = SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
3032 if(errorstate != HAL_SD_ERROR_NONE)
3033 {
3034 return errorstate;
3035 }
3036
3037 /* Send ACMD6 APP_CMD with argument as 2 for wide bus mode */
3038 errorstate = SDMMC_CmdBusWidth(hsd->Instance, 2U);
3039 if(errorstate != HAL_SD_ERROR_NONE)
3040 {
3041 return errorstate;
3042 }
3043
3044 return HAL_SD_ERROR_NONE;
3045 }
3046 else
3047 {
3049 }
3050}
3051
3058{
3059 uint32_t scr[2U] = {0U, 0U};
3060 uint32_t errorstate;
3061
3062 if((SDIO_GetResponse(hsd->Instance, SDIO_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
3063 {
3065 }
3066
3067 /* Get SCR Register */
3068 errorstate = SD_FindSCR(hsd, scr);
3069 if(errorstate != HAL_SD_ERROR_NONE)
3070 {
3071 return errorstate;
3072 }
3073
3074 /* If requested card supports 1 bit mode operation */
3075 if((scr[1U] & SDMMC_SINGLE_BUS_SUPPORT) != SDMMC_ALLZERO)
3076 {
3077 /* Send CMD55 APP_CMD with argument as card's RCA */
3078 errorstate = SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
3079 if(errorstate != HAL_SD_ERROR_NONE)
3080 {
3081 return errorstate;
3082 }
3083
3084 /* Send ACMD6 APP_CMD with argument as 0 for single bus mode */
3085 errorstate = SDMMC_CmdBusWidth(hsd->Instance, 0U);
3086 if(errorstate != HAL_SD_ERROR_NONE)
3087 {
3088 return errorstate;
3089 }
3090
3091 return HAL_SD_ERROR_NONE;
3092 }
3093 else
3094 {
3096 }
3097}
3098
3099
3106static uint32_t SD_FindSCR(SD_HandleTypeDef *hsd, uint32_t *pSCR)
3107{
3108 SDIO_DataInitTypeDef config;
3109 uint32_t errorstate;
3110 uint32_t tickstart = HAL_GetTick();
3111 uint32_t index = 0U;
3112 uint32_t tempscr[2U] = {0U, 0U};
3113 uint32_t *scr = pSCR;
3114
3115 /* Set Block Size To 8 Bytes */
3116 errorstate = SDMMC_CmdBlockLength(hsd->Instance, 8U);
3117 if(errorstate != HAL_SD_ERROR_NONE)
3118 {
3119 return errorstate;
3120 }
3121
3122 /* Send CMD55 APP_CMD with argument as card's RCA */
3123 errorstate = SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)((hsd->SdCard.RelCardAdd) << 16U));
3124 if(errorstate != HAL_SD_ERROR_NONE)
3125 {
3126 return errorstate;
3127 }
3128
3129 config.DataTimeOut = SDMMC_DATATIMEOUT;
3130 config.DataLength = 8U;
3131 config.DataBlockSize = SDIO_DATABLOCK_SIZE_8B;
3132 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
3133 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
3134 config.DPSM = SDIO_DPSM_ENABLE;
3135 (void)SDIO_ConfigData(hsd->Instance, &config);
3136
3137 /* Send ACMD51 SD_APP_SEND_SCR with argument as 0 */
3138 errorstate = SDMMC_CmdSendSCR(hsd->Instance);
3139 if(errorstate != HAL_SD_ERROR_NONE)
3140 {
3141 return errorstate;
3142 }
3143
3144 while(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT))
3145 {
3146 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXDAVL))
3147 {
3148 *(tempscr + index) = SDIO_ReadFIFO(hsd->Instance);
3149 index++;
3150 }
3151 else if(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXACT))
3152 {
3153 break;
3154 }
3155
3156 if((HAL_GetTick() - tickstart) >= SDMMC_SWDATATIMEOUT)
3157 {
3158 return HAL_SD_ERROR_TIMEOUT;
3159 }
3160 }
3161
3162#if defined(SDIO_STA_STBITERR)
3163 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT) || (__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_STBITERR)))
3164#else /* SDIO_STA_STBITERR not defined */
3165 if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT))
3166#endif /* SDIO_STA_STBITERR */
3167 {
3168 __HAL_SD_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT);
3169
3171 }
3172 else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL))
3173 {
3174 __HAL_SD_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL);
3175
3177 }
3178 else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR))
3179 {
3180 __HAL_SD_CLEAR_FLAG(hsd, SDIO_FLAG_RXOVERR);
3181
3183 }
3184 else
3185 {
3186 /* No error flag set */
3187 /* Clear all the static flags */
3188 __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
3189
3190 *scr = (((tempscr[1] & SDMMC_0TO7BITS) << 24) | ((tempscr[1] & SDMMC_8TO15BITS) << 8) |\
3191 ((tempscr[1] & SDMMC_16TO23BITS) >> 8) | ((tempscr[1] & SDMMC_24TO31BITS) >> 24));
3192 scr++;
3193 *scr = (((tempscr[0] & SDMMC_0TO7BITS) << 24) | ((tempscr[0] & SDMMC_8TO15BITS) << 8) |\
3194 ((tempscr[0] & SDMMC_16TO23BITS) >> 8) | ((tempscr[0] & SDMMC_24TO31BITS) >> 24));
3195
3196 }
3197
3198 return HAL_SD_ERROR_NONE;
3199}
3200
3208{
3209 uint32_t count, data, dataremaining;
3210 uint8_t* tmp;
3211
3212 tmp = hsd->pRxBuffPtr;
3213 dataremaining = hsd->RxXferSize;
3214
3215 if (dataremaining > 0U)
3216 {
3217 /* Read data from SDIO Rx FIFO */
3218 for(count = 0U; count < 8U; count++)
3219 {
3220 data = SDIO_ReadFIFO(hsd->Instance);
3221 *tmp = (uint8_t)(data & 0xFFU);
3222 tmp++;
3223 dataremaining--;
3224 *tmp = (uint8_t)((data >> 8U) & 0xFFU);
3225 tmp++;
3226 dataremaining--;
3227 *tmp = (uint8_t)((data >> 16U) & 0xFFU);
3228 tmp++;
3229 dataremaining--;
3230 *tmp = (uint8_t)((data >> 24U) & 0xFFU);
3231 tmp++;
3232 dataremaining--;
3233 }
3234
3235 hsd->pRxBuffPtr = tmp;
3236 hsd->RxXferSize = dataremaining;
3237 }
3238}
3239
3247{
3248 uint32_t count, data, dataremaining;
3249 uint8_t* tmp;
3250
3251 tmp = hsd->pTxBuffPtr;
3252 dataremaining = hsd->TxXferSize;
3253
3254 if (dataremaining > 0U)
3255 {
3256 /* Write data to SDIO Tx FIFO */
3257 for(count = 0U; count < 8U; count++)
3258 {
3259 data = (uint32_t)(*tmp);
3260 tmp++;
3261 dataremaining--;
3262 data |= ((uint32_t)(*tmp) << 8U);
3263 tmp++;
3264 dataremaining--;
3265 data |= ((uint32_t)(*tmp) << 16U);
3266 tmp++;
3267 dataremaining--;
3268 data |= ((uint32_t)(*tmp) << 24U);
3269 tmp++;
3270 dataremaining--;
3271 (void)SDIO_WriteFIFO(hsd->Instance, &data);
3272 }
3273
3274 hsd->pTxBuffPtr = tmp;
3275 hsd->TxXferSize = dataremaining;
3276 }
3277}
3278
3283#endif /* HAL_SD_MODULE_ENABLED */
3284
3293#endif /* SDIO */
#define DMA_MEMORY_TO_PERIPH
#define DMA_PERIPH_TO_MEMORY
#define HAL_DMA_ERROR_FE
#define HAL_DMA_ERROR_TE
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
Aborts the DMA Transfer.
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
Aborts the DMA Transfer in Interrupt mode.
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
Start the DMA Transfer with interrupt enabled.
uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma)
Return the DMA error code.
void HAL_Delay(uint32_t Delay)
This function provides minimum delay (in milliseconds) based on variable incremented.
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
#define HAL_SD_ERROR_NONE
#define HAL_SD_ERROR_DATA_CRC_FAIL
#define HAL_SD_ERROR_INVALID_VOLTRANGE
#define HAL_SD_ERROR_BUSY
#define HAL_SD_ERROR_UNSUPPORTED_FEATURE
#define HAL_SD_ERROR_TX_UNDERRUN
#define HAL_SD_ERROR_PARAM
#define HAL_SD_ERROR_LOCK_UNLOCK_FAILED
#define HAL_SD_ERROR_DATA_TIMEOUT
#define HAL_SD_ERROR_ADDR_OUT_OF_RANGE
#define HAL_SD_ERROR_RX_OVERRUN
#define HAL_SD_ERROR_DMA
#define HAL_SD_ERROR_REQUEST_NOT_APPLICABLE
#define HAL_SD_ERROR_TIMEOUT
#define SD_CONTEXT_WRITE_MULTIPLE_BLOCK
#define SD_CONTEXT_IT
#define SD_CONTEXT_READ_SINGLE_BLOCK
#define SD_CONTEXT_DMA
#define SD_CONTEXT_NONE
#define SD_CONTEXT_READ_MULTIPLE_BLOCK
#define SD_CONTEXT_WRITE_SINGLE_BLOCK
#define CARD_SDHC_SDXC
#define CARD_SDSC
#define CARD_SECURED
#define CARD_V1_X
#define CARD_V2_X
#define BLOCKSIZE
HAL_StatusTypeDef HAL_SD_InitCard(SD_HandleTypeDef *hsd)
Initializes the SD Card.
HAL_StatusTypeDef HAL_SD_DeInit(SD_HandleTypeDef *hsd)
De-Initializes the SD card.
void HAL_SD_MspInit(SD_HandleTypeDef *hsd)
Initializes the SD MSP.
void HAL_SD_MspDeInit(SD_HandleTypeDef *hsd)
De-Initialize SD MSP.
HAL_StatusTypeDef HAL_SD_Init(SD_HandleTypeDef *hsd)
Initializes the SD according to the specified parameters in the SD_HandleTypeDef and create the assoc...
void HAL_SD_ErrorCallback(SD_HandleTypeDef *hsd)
SD error callbacks.
uint32_t HAL_SD_GetError(SD_HandleTypeDef *hsd)
Return the SD error code.
HAL_StatusTypeDef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
Reads block(s) from a specified address in a card. The Data transfer is managed by DMA mode.
void HAL_SD_AbortCallback(SD_HandleTypeDef *hsd)
SD Abort callbacks.
HAL_StatusTypeDef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout)
Reads block(s) from a specified address in a card. The Data transfer is managed by polling mode.
void HAL_SD_IRQHandler(SD_HandleTypeDef *hsd)
This function handles SD card interrupt request.
HAL_SD_StateTypeDef HAL_SD_GetState(SD_HandleTypeDef *hsd)
return the SD state
HAL_StatusTypeDef HAL_SD_ReadBlocks_IT(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
Reads block(s) from a specified address in a card. The Data transfer is managed in interrupt mode.
HAL_StatusTypeDef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout)
Allows to write block(s) to a specified address in a card. The Data transfer is managed by polling mo...
HAL_StatusTypeDef HAL_SD_Erase(SD_HandleTypeDef *hsd, uint32_t BlockStartAdd, uint32_t BlockEndAdd)
Erases the specified memory area of the given SD card.
void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)
Tx Transfer completed callbacks.
void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)
Rx Transfer completed callbacks.
HAL_StatusTypeDef HAL_SD_WriteBlocks_IT(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
Writes block(s) to a specified address in a card. The Data transfer is managed in interrupt mode.
HAL_StatusTypeDef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
Writes block(s) to a specified address in a card. The Data transfer is managed by DMA mode.
HAL_SD_CardStateTypeDef HAL_SD_GetCardState(SD_HandleTypeDef *hsd)
Gets the current sd card data state.
HAL_StatusTypeDef HAL_SD_GetCardCID(SD_HandleTypeDef *hsd, HAL_SD_CardCIDTypeDef *pCID)
Returns information the information of the card which are stored on the CID register.
HAL_StatusTypeDef HAL_SD_Abort(SD_HandleTypeDef *hsd)
Abort the current transfer and disable the SD.
HAL_StatusTypeDef HAL_SD_ConfigWideBusOperation(SD_HandleTypeDef *hsd, uint32_t WideMode)
Enables wide bus operation for the requested card if supported by card.
HAL_StatusTypeDef HAL_SD_GetCardStatus(SD_HandleTypeDef *hsd, HAL_SD_CardStatusTypeDef *pStatus)
Gets the SD status info.
HAL_StatusTypeDef HAL_SD_Abort_IT(SD_HandleTypeDef *hsd)
Abort the current transfer and disable the SD (IT mode).
HAL_StatusTypeDef HAL_SD_GetCardInfo(SD_HandleTypeDef *hsd, HAL_SD_CardInfoTypeDef *pCardInfo)
Gets the SD card info.
HAL_StatusTypeDef HAL_SD_GetCardCSD(SD_HandleTypeDef *hsd, HAL_SD_CardCSDTypeDef *pCSD)
Returns information the information of the card which are stored on the CSD register.
HAL_SD_StateTypeDef
@ HAL_SD_STATE_READY
@ HAL_SD_STATE_RESET
@ HAL_SD_STATE_BUSY
uint32_t HAL_SD_CardStateTypeDef
#define HAL_SD_CARD_SENDING
#define HAL_SD_CARD_RECEIVING
#define SD_InitTypeDef
#define __HAL_SD_ENABLE(__HANDLE__)
Enable the SD device.
#define __HAL_SD_DISABLE(__HANDLE__)
Disable the SD device.
#define __HAL_SD_CLEAR_FLAG(__HANDLE__, __FLAG__)
Clear the SD's pending flags.
#define __HAL_SD_ENABLE_IT(__HANDLE__, __INTERRUPT__)
Enable the SD device interrupt.
#define __HAL_SD_GET_FLAG(__HANDLE__, __FLAG__)
Check whether the specified SD flag is set or not.
#define __HAL_SD_DMA_ENABLE(__HANDLE__)
Enable the SDMMC DMA transfer.
#define __HAL_SD_DISABLE_IT(__HANDLE__, __INTERRUPT__)
Disable the SD device interrupt.
static void SD_DMAError(DMA_HandleTypeDef *hdma)
DMA SD communication error callback.
static void SD_PowerOFF(SD_HandleTypeDef *hsd)
Turns the SDIO output signals off.
static uint32_t SD_WideBus_Enable(SD_HandleTypeDef *hsd)
Enables the SDIO wide bus mode.
static uint32_t SD_PowerON(SD_HandleTypeDef *hsd)
Enquires cards about their operating voltage and configures clock controls and stores SD information ...
static void SD_DMATxAbort(DMA_HandleTypeDef *hdma)
DMA SD Tx Abort callback.
static uint32_t SD_SendStatus(SD_HandleTypeDef *hsd, uint32_t *pCardStatus)
Returns the current card's status.
static void SD_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
DMA SD receive process complete callback.
static uint32_t SD_SendSDStatus(SD_HandleTypeDef *hsd, uint32_t *pSDstatus)
Send Status info command.
static uint32_t SD_WideBus_Disable(SD_HandleTypeDef *hsd)
Disables the SDIO wide bus mode.
static void SD_Write_IT(SD_HandleTypeDef *hsd)
Wrap up writing in non-blocking mode.
static void SD_DMATransmitCplt(DMA_HandleTypeDef *hdma)
DMA SD transmit process complete callback.
static uint32_t SD_FindSCR(SD_HandleTypeDef *hsd, uint32_t *pSCR)
Finds the SD card SCR register value.
static void SD_Read_IT(SD_HandleTypeDef *hsd)
Wrap up reading in non-blocking mode.
static void SD_DMARxAbort(DMA_HandleTypeDef *hdma)
DMA SD Rx Abort callback.
static uint32_t SD_InitCard(SD_HandleTypeDef *hsd)
Initializes the sd card.
#define assert_param(expr)
This file contains all the functions prototypes for the HAL module driver.
HAL_StatusTypeDef
HAL Status structures definition
@ HAL_TIMEOUT
@ HAL_ERROR
@ HAL_OK
@ HAL_BUSY
#define UNUSED(X)
#define __HAL_UNLOCK(__HANDLE__)
@ HAL_UNLOCKED
#define __HAL_LOCK(__HANDLE__)
__IO uint8_t WriteBlockPaPartial
__IO uint8_t MaxRdCurrentVDDMax
__IO uint8_t ContentProtectAppli
__IO uint8_t MaxWrCurrentVDDMax
__IO uint8_t MaxWrCurrentVDDMin
__IO uint16_t CardComdClasses
__IO uint8_t MaxRdCurrentVDDMin
SD Card Information Structure definition.
SD handle Structure definition.
SD_TypeDef * Instance
DMA_HandleTypeDef * hdmatx
SD_InitTypeDef Init
HAL_SD_CardInfoTypeDef SdCard
__IO HAL_SD_StateTypeDef State
__IO uint32_t Context
__IO uint32_t ErrorCode
HAL_LockTypeDef Lock
DMA_HandleTypeDef * hdmarx
DMA handle Structure definition.
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
DMA_Stream_TypeDef * Instance