STM32F4xx_HAL_Driver  1.8.3
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 ---------------------------------------------------------*/
290 static uint32_t SD_InitCard(SD_HandleTypeDef *hsd);
291 static uint32_t SD_PowerON(SD_HandleTypeDef *hsd);
292 static uint32_t SD_SendSDStatus(SD_HandleTypeDef *hsd, uint32_t *pSDstatus);
293 static uint32_t SD_SendStatus(SD_HandleTypeDef *hsd, uint32_t *pCardStatus);
294 static uint32_t SD_WideBus_Enable(SD_HandleTypeDef *hsd);
295 static uint32_t SD_WideBus_Disable(SD_HandleTypeDef *hsd);
296 static uint32_t SD_FindSCR(SD_HandleTypeDef *hsd, uint32_t *pSCR);
297 static void SD_PowerOFF(SD_HandleTypeDef *hsd);
298 static void SD_Write_IT(SD_HandleTypeDef *hsd);
299 static void SD_Read_IT(SD_HandleTypeDef *hsd);
300 static void SD_DMATransmitCplt(DMA_HandleTypeDef *hdma);
301 static void SD_DMAReceiveCplt(DMA_HandleTypeDef *hdma);
302 static void SD_DMAError(DMA_HandleTypeDef *hdma);
303 static void SD_DMATxAbort(DMA_HandleTypeDef *hdma);
304 static void SD_DMARxAbort(DMA_HandleTypeDef *hdma);
309 /* Exported functions --------------------------------------------------------*/
335 HAL_StatusTypeDef HAL_SD_Init(SD_HandleTypeDef *hsd)
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 
376  hsd->State = HAL_SD_STATE_BUSY;
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 */
385  hsd->ErrorCode = HAL_SD_ERROR_NONE;
386 
387  /* Initialize the SD operation */
388  hsd->Context = SD_CONTEXT_NONE;
389 
390  /* Initialize the SD state */
391  hsd->State = HAL_SD_STATE_READY;
392 
393  return HAL_OK;
394 }
395 
403 HAL_StatusTypeDef HAL_SD_InitCard(SD_HandleTypeDef *hsd)
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  {
440  hsd->State = HAL_SD_STATE_READY;
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  {
449  hsd->State = HAL_SD_STATE_READY;
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;
461  hsd->State = HAL_SD_STATE_READY;
462  return HAL_ERROR;
463  }
464 
465  return HAL_OK;
466 }
467 
473 HAL_StatusTypeDef HAL_SD_DeInit(SD_HandleTypeDef *hsd)
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 
484  hsd->State = HAL_SD_STATE_BUSY;
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 
502  hsd->ErrorCode = HAL_SD_ERROR_NONE;
503  hsd->State = HAL_SD_STATE_RESET;
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 
570 HAL_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  {
581  hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
582  return HAL_ERROR;
583  }
584 
585  if(hsd->State == HAL_SD_STATE_READY)
586  {
587  hsd->ErrorCode = HAL_SD_ERROR_NONE;
588 
589  if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
590  {
591  hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
592  return HAL_ERROR;
593  }
594 
595  hsd->State = HAL_SD_STATE_BUSY;
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  {
617  hsd->Context = SD_CONTEXT_READ_MULTIPLE_BLOCK;
618 
619  /* Read Multi Block command */
620  errorstate = SDMMC_CmdReadMultiBlock(hsd->Instance, add);
621  }
622  else
623  {
624  hsd->Context = SD_CONTEXT_READ_SINGLE_BLOCK;
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;
634  hsd->State = HAL_SD_STATE_READY;
635  hsd->Context = SD_CONTEXT_NONE;
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);
672  hsd->ErrorCode |= HAL_SD_ERROR_TIMEOUT;
673  hsd->State= HAL_SD_STATE_READY;
674  hsd->Context = SD_CONTEXT_NONE;
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;
691  hsd->State = HAL_SD_STATE_READY;
692  hsd->Context = SD_CONTEXT_NONE;
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);
707  hsd->ErrorCode |= HAL_SD_ERROR_DATA_TIMEOUT;
708  hsd->State = HAL_SD_STATE_READY;
709  hsd->Context = SD_CONTEXT_NONE;
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);
716  hsd->ErrorCode |= HAL_SD_ERROR_DATA_CRC_FAIL;
717  hsd->State = HAL_SD_STATE_READY;
718  hsd->Context = SD_CONTEXT_NONE;
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);
725  hsd->ErrorCode |= HAL_SD_ERROR_RX_OVERRUN;
726  hsd->State = HAL_SD_STATE_READY;
727  hsd->Context = SD_CONTEXT_NONE;
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);
756  hsd->ErrorCode |= HAL_SD_ERROR_TIMEOUT;
757  hsd->State= HAL_SD_STATE_READY;
758  hsd->Context = SD_CONTEXT_NONE;
759  return HAL_ERROR;
760  }
761  }
762 
763  /* Clear all the static flags */
764  __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
765 
766  hsd->State = HAL_SD_STATE_READY;
767 
768  return HAL_OK;
769  }
770  else
771  {
772  hsd->ErrorCode |= HAL_SD_ERROR_BUSY;
773  return HAL_ERROR;
774  }
775 }
776 
789 HAL_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  {
800  hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
801  return HAL_ERROR;
802  }
803 
804  if(hsd->State == HAL_SD_STATE_READY)
805  {
806  hsd->ErrorCode = HAL_SD_ERROR_NONE;
807 
808  if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
809  {
810  hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
811  return HAL_ERROR;
812  }
813 
814  hsd->State = HAL_SD_STATE_BUSY;
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  {
836  hsd->Context = SD_CONTEXT_WRITE_MULTIPLE_BLOCK;
837 
838  /* Write Multi Block command */
839  errorstate = SDMMC_CmdWriteMultiBlock(hsd->Instance, add);
840  }
841  else
842  {
843  hsd->Context = SD_CONTEXT_WRITE_SINGLE_BLOCK;
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;
853  hsd->State = HAL_SD_STATE_READY;
854  hsd->Context = SD_CONTEXT_NONE;
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;
892  hsd->State = HAL_SD_STATE_READY;
893  hsd->Context = SD_CONTEXT_NONE;
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;
910  hsd->State = HAL_SD_STATE_READY;
911  hsd->Context = SD_CONTEXT_NONE;
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);
926  hsd->ErrorCode |= HAL_SD_ERROR_DATA_TIMEOUT;
927  hsd->State = HAL_SD_STATE_READY;
928  hsd->Context = SD_CONTEXT_NONE;
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);
935  hsd->ErrorCode |= HAL_SD_ERROR_DATA_CRC_FAIL;
936  hsd->State = HAL_SD_STATE_READY;
937  hsd->Context = SD_CONTEXT_NONE;
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);
944  hsd->ErrorCode |= HAL_SD_ERROR_TX_UNDERRUN;
945  hsd->State = HAL_SD_STATE_READY;
946  hsd->Context = SD_CONTEXT_NONE;
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 
957  hsd->State = HAL_SD_STATE_READY;
958 
959  return HAL_OK;
960  }
961  else
962  {
963  hsd->ErrorCode |= HAL_SD_ERROR_BUSY;
964  return HAL_ERROR;
965  }
966 }
967 
981 HAL_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  {
989  hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
990  return HAL_ERROR;
991  }
992 
993  if(hsd->State == HAL_SD_STATE_READY)
994  {
995  hsd->ErrorCode = HAL_SD_ERROR_NONE;
996 
997  if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
998  {
999  hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
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  {
1034  hsd->Context = (SD_CONTEXT_READ_MULTIPLE_BLOCK | SD_CONTEXT_IT);
1035 
1036  /* Read Multi Block command */
1037  errorstate = SDMMC_CmdReadMultiBlock(hsd->Instance, add);
1038  }
1039  else
1040  {
1041  hsd->Context = (SD_CONTEXT_READ_SINGLE_BLOCK | SD_CONTEXT_IT);
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;
1051  hsd->State = HAL_SD_STATE_READY;
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 
1077 HAL_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  {
1085  hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
1086  return HAL_ERROR;
1087  }
1088 
1089  if(hsd->State == HAL_SD_STATE_READY)
1090  {
1091  hsd->ErrorCode = HAL_SD_ERROR_NONE;
1092 
1093  if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
1094  {
1095  hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
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  {
1122  hsd->Context = (SD_CONTEXT_WRITE_MULTIPLE_BLOCK| SD_CONTEXT_IT);
1123 
1124  /* Write Multi Block command */
1125  errorstate = SDMMC_CmdWriteMultiBlock(hsd->Instance, add);
1126  }
1127  else
1128  {
1129  hsd->Context = (SD_CONTEXT_WRITE_SINGLE_BLOCK | SD_CONTEXT_IT);
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;
1139  hsd->State = HAL_SD_STATE_READY;
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 
1174 HAL_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  {
1182  hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
1183  return HAL_ERROR;
1184  }
1185 
1186  if(hsd->State == HAL_SD_STATE_READY)
1187  {
1188  hsd->ErrorCode = HAL_SD_ERROR_NONE;
1189 
1190  if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
1191  {
1192  hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
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 */
1208  hsd->hdmarx->XferCpltCallback = SD_DMAReceiveCplt;
1209 
1210  /* Set the DMA error callback */
1211  hsd->hdmarx->XferErrorCallback = SD_DMAError;
1212 
1213  /* Set the DMA Abort callback */
1214  hsd->hdmarx->XferAbortCallback = NULL;
1215 
1216  /* Force DMA Direction */
1217  hsd->hdmarx->Init.Direction = DMA_PERIPH_TO_MEMORY;
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);
1225  hsd->ErrorCode |= HAL_SD_ERROR_DMA;
1226  hsd->State = HAL_SD_STATE_READY;
1227  return HAL_ERROR;
1228  }
1229  else
1230  {
1231  /* Enable SD DMA transfer */
1232  __HAL_SD_DMA_ENABLE(hsd);
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  {
1251  hsd->Context = (SD_CONTEXT_READ_MULTIPLE_BLOCK | SD_CONTEXT_DMA);
1252 
1253  /* Read Multi Block command */
1254  errorstate = SDMMC_CmdReadMultiBlock(hsd->Instance, add);
1255  }
1256  else
1257  {
1258  hsd->Context = (SD_CONTEXT_READ_SINGLE_BLOCK | SD_CONTEXT_DMA);
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;
1268  hsd->State = HAL_SD_STATE_READY;
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 
1295 HAL_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  {
1303  hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
1304  return HAL_ERROR;
1305  }
1306 
1307  if(hsd->State == HAL_SD_STATE_READY)
1308  {
1309  hsd->ErrorCode = HAL_SD_ERROR_NONE;
1310 
1311  if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
1312  {
1313  hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
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 */
1330  hsd->hdmatx->XferCpltCallback = SD_DMATransmitCplt;
1331 
1332  /* Set the DMA error callback */
1333  hsd->hdmatx->XferErrorCallback = SD_DMAError;
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  {
1346  hsd->Context = (SD_CONTEXT_WRITE_MULTIPLE_BLOCK | SD_CONTEXT_DMA);
1347 
1348  /* Write Multi Block command */
1349  errorstate = SDMMC_CmdWriteMultiBlock(hsd->Instance, add);
1350  }
1351  else
1352  {
1353  hsd->Context = (SD_CONTEXT_WRITE_SINGLE_BLOCK | SD_CONTEXT_DMA);
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;
1363  hsd->State = HAL_SD_STATE_READY;
1364  hsd->Context = SD_CONTEXT_NONE;
1365  return HAL_ERROR;
1366  }
1367 
1368  /* Enable SDIO DMA transfer */
1369  __HAL_SD_DMA_ENABLE(hsd);
1370 
1371  /* Force DMA Direction */
1372  hsd->hdmatx->Init.Direction = DMA_MEMORY_TO_PERIPH;
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);
1384  hsd->ErrorCode |= HAL_SD_ERROR_DMA;
1385  hsd->State = HAL_SD_STATE_READY;
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 
1418 HAL_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  {
1426  hsd->ErrorCode = HAL_SD_ERROR_NONE;
1427 
1428  if(end_add < start_add)
1429  {
1430  hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
1431  return HAL_ERROR;
1432  }
1433 
1434  if(end_add > (hsd->SdCard.LogBlockNbr))
1435  {
1436  hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
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);
1447  hsd->ErrorCode |= HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
1448  hsd->State = HAL_SD_STATE_READY;
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);
1456  hsd->ErrorCode |= HAL_SD_ERROR_LOCK_UNLOCK_FAILED;
1457  hsd->State = HAL_SD_STATE_READY;
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;
1478  hsd->State = HAL_SD_STATE_READY;
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;
1489  hsd->State = HAL_SD_STATE_READY;
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;
1501  hsd->State = HAL_SD_STATE_READY;
1502  return HAL_ERROR;
1503  }
1504 
1505  hsd->State = HAL_SD_STATE_READY;
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
1558  HAL_SD_ErrorCallback(hsd);
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 
1566  hsd->State = HAL_SD_STATE_READY;
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
1573  HAL_SD_RxCpltCallback(hsd);
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
1581  HAL_SD_TxCpltCallback(hsd);
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
1596  HAL_SD_ErrorCallback(hsd);
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 
1606  hsd->State = HAL_SD_STATE_READY;
1607 
1608 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1609  hsd->TxCpltCallback(hsd);
1610 #else
1611  HAL_SD_TxCpltCallback(hsd);
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  {
1635  hsd->ErrorCode |= HAL_SD_ERROR_DATA_CRC_FAIL;
1636  }
1637  if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT) != RESET)
1638  {
1639  hsd->ErrorCode |= HAL_SD_ERROR_DATA_TIMEOUT;
1640  }
1641  if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR) != RESET)
1642  {
1643  hsd->ErrorCode |= HAL_SD_ERROR_RX_OVERRUN;
1644  }
1645  if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR) != RESET)
1646  {
1647  hsd->ErrorCode |= HAL_SD_ERROR_TX_UNDERRUN;
1648  }
1649 #if defined(SDIO_STA_STBITERR)
1650  if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_STBITERR) != RESET)
1651  {
1652  hsd->ErrorCode |= HAL_SD_ERROR_DATA_TIMEOUT;
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 */
1677  hsd->State = HAL_SD_STATE_READY;
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
1682  HAL_SD_ErrorCallback(hsd);
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 */
1691  hsd->hdmatx->XferAbortCallback = SD_DMATxAbort;
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 */
1701  hsd->hdmarx->XferAbortCallback = SD_DMARxAbort;
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  {
1710  hsd->ErrorCode = HAL_SD_ERROR_NONE;
1711  hsd->State = HAL_SD_STATE_READY;
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
1716  HAL_SD_AbortCallback(hsd);
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 
1736 HAL_SD_StateTypeDef HAL_SD_GetState(SD_HandleTypeDef *hsd)
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)
1828 HAL_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;
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;
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 
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;
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;
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);
2109  hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2110  hsd->State = HAL_SD_STATE_READY;
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;
2172  hsd->State = HAL_SD_STATE_READY;
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;
2206  hsd->State = HAL_SD_STATE_READY;
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 
2245 HAL_StatusTypeDef HAL_SD_ConfigWideBusOperation(SD_HandleTypeDef *hsd, uint32_t WideMode)
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  {
2261  hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
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*/
2278  hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
2279  }
2280  }
2281  else
2282  {
2283  /* MMC Card does not support this feature */
2284  hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_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);
2291  hsd->State = HAL_SD_STATE_READY;
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 */
2317  hsd->State = HAL_SD_STATE_READY;
2318 
2319  return status;
2320 }
2321 
2327 HAL_SD_CardStateTypeDef HAL_SD_GetCardState(SD_HandleTypeDef *hsd)
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 
2350 HAL_StatusTypeDef HAL_SD_Abort(SD_HandleTypeDef *hsd)
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  {
2374  hsd->ErrorCode |= HAL_SD_ERROR_DMA;
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  {
2382  hsd->ErrorCode |= HAL_SD_ERROR_DMA;
2383  }
2384  }
2385  else
2386  {
2387  /* Nothing to do */
2388  }
2389  }
2390 
2391  hsd->State = HAL_SD_STATE_READY;
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 
2414 HAL_StatusTypeDef HAL_SD_Abort_IT(SD_HandleTypeDef *hsd)
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  {
2433  hsd->hdmatx->XferAbortCallback = SD_DMATxAbort;
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  {
2442  hsd->hdmarx->XferAbortCallback = SD_DMARxAbort;
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);
2460  hsd->State = HAL_SD_STATE_READY;
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
2475  HAL_SD_AbortCallback(hsd);
2476 #endif /* USE_HAL_SD_REGISTER_CALLBACKS */
2477  }
2478  }
2479 
2480  return HAL_OK;
2481 }
2482 
2491 /* Private function ----------------------------------------------------------*/
2501 static void SD_DMATransmitCplt(DMA_HandleTypeDef *hdma)
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 
2514 static void SD_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
2515 {
2516  SD_HandleTypeDef* hsd = (SD_HandleTypeDef* )(hdma->Parent);
2517  uint32_t errorstate;
2518 
2519  /* Send stop command in multiblock write */
2520  if(hsd->Context == (SD_CONTEXT_READ_MULTIPLE_BLOCK | SD_CONTEXT_DMA))
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
2529  HAL_SD_ErrorCallback(hsd);
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 
2541  hsd->State = HAL_SD_STATE_READY;
2542  hsd->Context = SD_CONTEXT_NONE;
2543 
2544 #if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2545  hsd->RxCpltCallback(hsd);
2546 #else
2547  HAL_SD_RxCpltCallback(hsd);
2548 #endif
2549 }
2550 
2556 static void SD_DMAError(DMA_HandleTypeDef *hdma)
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 */
2563  if(HAL_DMA_GetError(hdma) != HAL_DMA_ERROR_FE)
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 
2576  hsd->ErrorCode |= HAL_SD_ERROR_DMA;
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 
2583  hsd->State= HAL_SD_STATE_READY;
2584  hsd->Context = SD_CONTEXT_NONE;
2585  }
2586 
2587 #if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2588  hsd->ErrorCallback(hsd);
2589 #else
2590  HAL_SD_ErrorCallback(hsd);
2591 #endif
2592  }
2593 }
2594 
2600 static void SD_DMATxAbort(DMA_HandleTypeDef *hdma)
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);
2609  hsd->State = HAL_SD_STATE_READY;
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
2621  HAL_SD_AbortCallback(hsd);
2622 #endif
2623  }
2624  else
2625  {
2626 #if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2627  hsd->ErrorCallback(hsd);
2628 #else
2629  HAL_SD_ErrorCallback(hsd);
2630 #endif
2631  }
2632 }
2633 
2639 static void SD_DMARxAbort(DMA_HandleTypeDef *hdma)
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);
2648  hsd->State = HAL_SD_STATE_READY;
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
2660  HAL_SD_AbortCallback(hsd);
2661 #endif
2662  }
2663  else
2664  {
2665 #if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2666  hsd->ErrorCallback(hsd);
2667 #else
2668  HAL_SD_ErrorCallback(hsd);
2669 #endif
2670  }
2671 }
2672 
2678 static 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 */
2688  return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
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  {
2746  return HAL_SD_ERROR_UNSUPPORTED_FEATURE;
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 
2770 static 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  {
2787  hsd->SdCard.CardVersion = CARD_V1_X;
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  {
2798  hsd->SdCard.CardVersion = CARD_V2_X;
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  {
2807  return HAL_SD_ERROR_UNSUPPORTED_FEATURE;
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  {
2825  return HAL_SD_ERROR_UNSUPPORTED_FEATURE;
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  {
2839  return HAL_SD_ERROR_INVALID_VOLTRANGE;
2840  }
2841 
2842  if((response & SDMMC_HIGH_CAPACITY) == SDMMC_HIGH_CAPACITY) /* (response &= SD_HIGH_CAPACITY) */
2843  {
2844  hsd->SdCard.CardType = CARD_SDHC_SDXC;
2845  }
2846  else
2847  {
2848  hsd->SdCard.CardType = CARD_SDSC;
2849  }
2850 
2851 
2852  return HAL_SD_ERROR_NONE;
2853 }
2854 
2860 static void SD_PowerOFF(SD_HandleTypeDef *hsd)
2861 {
2862  /* Set Power State to OFF */
2863  (void)SDIO_PowerState_OFF(hsd->Instance);
2864 }
2865 
2873 static 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  {
2884  return HAL_SD_ERROR_LOCK_UNLOCK_FAILED;
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  {
2891  hsd->ErrorCode |= HAL_SD_ERROR_NONE;
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  {
2899  hsd->ErrorCode |= HAL_SD_ERROR_NONE;
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  {
2916  hsd->ErrorCode |= HAL_SD_ERROR_NONE;
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  {
2944  return HAL_SD_ERROR_DATA_TIMEOUT;
2945  }
2946  else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL))
2947  {
2948  return HAL_SD_ERROR_DATA_CRC_FAIL;
2949  }
2950  else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR))
2951  {
2952  return HAL_SD_ERROR_RX_OVERRUN;
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 
2983 static 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 
3010 static uint32_t SD_WideBus_Enable(SD_HandleTypeDef *hsd)
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  {
3017  return HAL_SD_ERROR_LOCK_UNLOCK_FAILED;
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  {
3048  return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
3049  }
3050 }
3051 
3057 static uint32_t SD_WideBus_Disable(SD_HandleTypeDef *hsd)
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  {
3064  return HAL_SD_ERROR_LOCK_UNLOCK_FAILED;
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  {
3095  return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
3096  }
3097 }
3098 
3099 
3106 static 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 
3170  return HAL_SD_ERROR_DATA_TIMEOUT;
3171  }
3172  else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL))
3173  {
3174  __HAL_SD_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL);
3175 
3176  return HAL_SD_ERROR_DATA_CRC_FAIL;
3177  }
3178  else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR))
3179  {
3180  __HAL_SD_CLEAR_FLAG(hsd, SDIO_FLAG_RXOVERR);
3181 
3182  return HAL_SD_ERROR_RX_OVERRUN;
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 
3207 static void SD_Read_IT(SD_HandleTypeDef *hsd)
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 
3246 static void SD_Write_IT(SD_HandleTypeDef *hsd)
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 */
ADC handle Structure definition.
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.
HAL_StatusTypeDef SDIO_Init(SDIO_TypeDef *SDIOx, SDIO_InitTypeDef Init)
Initializes the SDMMC according to the specified parameters in the SDMMC_InitTypeDef and create the a...
uint32_t SDIO_ReadFIFO(SDIO_TypeDef *SDIOx)
Read data (word) from Rx FIFO in blocking mode (polling)
HAL_StatusTypeDef SDIO_WriteFIFO(SDIO_TypeDef *SDIOx, uint32_t *pWriteData)
Write data (word) to Tx FIFO in blocking mode (polling)
HAL_StatusTypeDef SDIO_PowerState_OFF(SDIO_TypeDef *SDIOx)
Set SDMMC Power state to OFF.
uint32_t SDIO_GetPowerState(SDIO_TypeDef *SDIOx)
Get SDMMC Power state.
HAL_StatusTypeDef SDIO_PowerState_ON(SDIO_TypeDef *SDIOx)
Set SDMMC Power state to ON.
HAL_StatusTypeDef SDIO_ConfigData(SDIO_TypeDef *SDIOx, SDIO_DataInitTypeDef *Data)
Configure the SDMMC data path according to the specified parameters in the SDIO_DataInitTypeDef.
uint32_t SDIO_GetResponse(SDIO_TypeDef *SDIOx, uint32_t Response)
Return the response received from the card for the last command.
uint32_t SDMMC_CmdSelDesel(SDIO_TypeDef *SDIOx, uint64_t Addr)
Send the Select Deselect command and check the response.
uint32_t SDMMC_CmdBlockLength(SDIO_TypeDef *SDIOx, uint32_t BlockSize)
Send the Data Block Length command and check the response.
uint32_t SDMMC_CmdWriteSingleBlock(SDIO_TypeDef *SDIOx, uint32_t WriteAdd)
Send the Write Single Block command and check the response.
uint32_t SDMMC_CmdAppCommand(SDIO_TypeDef *SDIOx, uint32_t Argument)
Send the Application command to verify that that the next command is an application specific com-mand...
uint32_t SDMMC_CmdOperCond(SDIO_TypeDef *SDIOx)
Send the Operating Condition command and check the response.
uint32_t SDMMC_CmdGoIdleState(SDIO_TypeDef *SDIOx)
Send the Go Idle State command and check the response.
uint32_t SDMMC_CmdBusWidth(SDIO_TypeDef *SDIOx, uint32_t BusWidth)
Send the Bus Width command and check the response.
uint32_t SDMMC_CmdWriteMultiBlock(SDIO_TypeDef *SDIOx, uint32_t WriteAdd)
Send the Write Multi Block command and check the response.
uint32_t SDMMC_CmdErase(SDIO_TypeDef *SDIOx)
Send the Erase command and check the response.
uint32_t SDMMC_CmdStopTransfer(SDIO_TypeDef *SDIOx)
Send the Stop Transfer command and check the response.
uint32_t SDMMC_CmdSDEraseStartAdd(SDIO_TypeDef *SDIOx, uint32_t StartAdd)
Send the Start Address Erase command for SD and check the response.
uint32_t SDMMC_CmdSendSCR(SDIO_TypeDef *SDIOx)
Send the Send SCR command and check the response.
uint32_t SDMMC_CmdStatusRegister(SDIO_TypeDef *SDIOx)
Send the Status register command and check the response.
uint32_t SDMMC_CmdSendCSD(SDIO_TypeDef *SDIOx, uint32_t Argument)
Send the Send CSD command and check the response.
uint32_t SDMMC_CmdReadMultiBlock(SDIO_TypeDef *SDIOx, uint32_t ReadAdd)
Send the Read Multi Block command and check the response.
uint32_t SDMMC_CmdSendCID(SDIO_TypeDef *SDIOx)
Send the Send CID command and check the response.
uint32_t SDMMC_CmdSetRelAdd(SDIO_TypeDef *SDIOx, uint16_t *pRCA)
Send the Send CSD command and check the response.
uint32_t SDMMC_CmdReadSingleBlock(SDIO_TypeDef *SDIOx, uint32_t ReadAdd)
Send the Read Single Block command and check the response.
uint32_t SDMMC_CmdSDEraseEndAdd(SDIO_TypeDef *SDIOx, uint32_t EndAdd)
Send the End Address Erase command for SD and check the response.
uint32_t SDMMC_CmdAppOperCommand(SDIO_TypeDef *SDIOx, uint32_t Argument)
Send the command asking the accessed card to send its operating condition register (OCR)
uint32_t SDMMC_CmdSendStatus(SDIO_TypeDef *SDIOx, uint32_t Argument)
Send the Status command and check the response.
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_RegisterCallback(SD_HandleTypeDef *hsd, HAL_SD_CallbackIDTypeDef CallbackId, pSD_CallbackTypeDef pCallback)
Register a User SD Callback To be used instead of the weak (surcharged) predefined callback.
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.
HAL_StatusTypeDef HAL_SD_UnRegisterCallback(SD_HandleTypeDef *hsd, HAL_SD_CallbackIDTypeDef CallbackId)
Unregister a User SD Callback SD Callback is redirected to the weak (surcharged) predefined callback.
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.
struct __SD_HandleTypeDef else typedef struct endif SD_HandleTypeDef
SD handle Structure definition.
SD Card Information Structure definition.
__IO uint8_t WriteBlockPaPartial
__IO uint8_t MaxRdCurrentVDDMax
__IO uint8_t WrBlockMisalign
__IO uint8_t WrProtectGrSize
__IO uint8_t WrProtectGrEnable
__IO uint8_t ContentProtectAppli
__IO uint8_t MaxWrCurrentVDDMax
__IO uint8_t MaxWrCurrentVDDMin
__IO uint16_t CardComdClasses
__IO uint8_t RdBlockMisalign
__IO uint8_t MaxRdCurrentVDDMin
__IO uint8_t FileFormatGroup
__IO uint16_t ManufactDate
HAL_SD_CallbackIDTypeDef
@ HAL_SD_RX_CPLT_CB_ID
@ HAL_SD_ERROR_CB_ID
@ HAL_SD_TX_CPLT_CB_ID
@ HAL_SD_ABORT_CB_ID
@ HAL_SD_MSP_DEINIT_CB_ID
@ HAL_SD_MSP_INIT_CB_ID
This file contains all the functions prototypes for the HAL module driver.
SDMMC Data Control structure.
DMA handle Structure definition.