/** * @brief DeInitializes the SD card device. * @param SdCard: SD card to be used, that should be SD_CARD1 or SD_CARD2 * @retval SD status */ uint8_t BSP_SD_DeInitEx(uint32_t SdCard) { uint8_t sd_state = MSD_OK; /* Set back Mfx pin to INPUT mode in case it was in exti */ UseExtiModeDetection = 0; if(SdCard == SD_CARD1) { uSdHandle.Instance = SDMMC1; /* HAL SD deinitialization */ if(HAL_SD_DeInit(&uSdHandle) != HAL_OK) { sd_state = MSD_ERROR; } /* Msp SD deinitialization */ BSP_SD_MspDeInit(&uSdHandle, NULL); BSP_IO_ConfigPin(SD1_DETECT_PIN, IO_MODE_INPUT_PU); } else { uSdHandle2.Instance = SDMMC2; BSP_IO_ConfigPin(SD2_DETECT_PIN, IO_MODE_INPUT_PU); /* HAL SD deinitialization */ if(HAL_SD_DeInit(&uSdHandle2) != HAL_OK) { sd_state = MSD_ERROR; } /* Msp SD deinitialization */ BSP_SD_MspDeInit(&uSdHandle2, NULL); } return sd_state; }
bool sdcard_power_on(void) { if (!sdcard_is_present()) { return false; } // SD device interface configuration sd_handle.Instance = SDIO; sd_handle.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING; sd_handle.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE; sd_handle.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; sd_handle.Init.BusWide = SDIO_BUS_WIDE_1B; sd_handle.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; sd_handle.Init.ClockDiv = SDIO_TRANSFER_CLK_DIV; // init the SD interface HAL_SD_CardInfoTypedef cardinfo; if (HAL_SD_Init(&sd_handle, &cardinfo) != SD_OK) { goto error; } // configure the SD bus width for wide operation if (HAL_SD_WideBusOperation_Config(&sd_handle, SDIO_BUS_WIDE_4B) != SD_OK) { HAL_SD_DeInit(&sd_handle); goto error; } return true; error: sd_handle.Instance = NULL; return false; }
void sdcard_power_off(void) { if (!sd_handle.Instance) { return; } HAL_SD_DeInit(&sd_handle); sd_handle.Instance = NULL; }
void sdcard_init(void) { volatile int retry=10; /* SDIO initial configuration */ SDHandle.Instance = SDIO; SDHandle.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING; SDHandle.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE; SDHandle.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; //TODO SDHandle.Init.BusWide = SDIO_BUS_WIDE_1B; SDHandle.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; SDHandle.Init.ClockDiv = SDIO_TRANSFER_CLK_DIV; //INIT_CLK_DIV will be used first /* DeInit in case of reboot */ HAL_SD_DeInit(&SDHandle); /* Init the SD interface */ HAL_SD_CardInfoTypedef cardinfo; while(HAL_SD_Init(&SDHandle, &cardinfo) != SD_OK && --retry) { systick_sleep(100); } if (retry == 0) { BREAK(); } /* Configure the SD Card in wide bus mode. */ if (HAL_SD_WideBusOperation_Config(&SDHandle, SDIO_BUS_WIDE_4B) != SD_OK) { BREAK(); } }
void sdcard_init(void) { volatile int retry=10; HAL_SD_CardInfoTypedef cardinfo; // SDIO configuration SDHandle.Instance = SDIO; SDHandle.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING; SDHandle.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE; SDHandle.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; SDHandle.Init.BusWide = SDIO_BUS_WIDE_1B; SDHandle.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; SDHandle.Init.ClockDiv = SDIO_TRANSFER_CLK_DIV; //INIT_CLK_DIV will be used first // Deinit SD HAL_SD_DeInit(&SDHandle); // Init SD interface while(HAL_SD_Init(&SDHandle, &cardinfo) != SD_OK && retry--) { if (retry == 0) { __fatal_error("Failed to init sdcard: init timeout"); } systick_sleep(100); } /* Configure the SD Card in wide bus mode. */ if (HAL_SD_WideBusOperation_Config(&SDHandle, SDIO_BUS_WIDE_4B) != SD_OK) { __fatal_error("Failed to init sensor, sdcard: config wide bus"); } // Configure and enable DMA IRQ Channel // SDIO IRQ should have a higher priority than DMA IRQ because it needs to // preempt the DMA irq handler to set a flag indicating the end of transfer. HAL_NVIC_SetPriority(SDIO_IRQn, IRQ_PRI_SDIO, IRQ_SUBPRI_SDIO); HAL_NVIC_EnableIRQ(SDIO_IRQn); }
/** * @brief DeInitializes the SD card device. * @retval SD status */ uint8_t BSP_SD_DeInit(void) { uint8_t sd_state = MSD_OK; uSdHandle.Instance = SDIO; /* HAL SD deinitialization */ if(HAL_SD_DeInit(&uSdHandle) != HAL_OK) { sd_state = MSD_ERROR; } /* Msp SD deinitialization */ uSdHandle.Instance = SDIO; BSP_SD_MspDeInit(&uSdHandle, NULL); return sd_state; }
bool sdcard_power_on(void) { if (!sdcard_is_present()) { return false; } if (sd_handle.Instance) { return true; } // SD device interface configuration sd_handle.Instance = SDIO; sd_handle.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING; #ifndef STM32H7 sd_handle.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE; #endif sd_handle.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_ENABLE; sd_handle.Init.BusWide = SDIO_BUS_WIDE_1B; sd_handle.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; sd_handle.Init.ClockDiv = SDIO_TRANSFER_CLK_DIV; // init the SD interface, with retry if it's not ready yet for (int retry = 10; HAL_SD_Init(&sd_handle) != HAL_OK; retry--) { if (retry == 0) { goto error; } mp_hal_delay_ms(50); } // configure the SD bus width for wide operation #if defined(STM32F7) // use maximum SDMMC clock speed on F7 MCUs sd_handle.Init.ClockBypass = SDMMC_CLOCK_BYPASS_ENABLE; #endif if (HAL_SD_ConfigWideBusOperation(&sd_handle, SDIO_BUS_WIDE_4B) != HAL_OK) { HAL_SD_DeInit(&sd_handle); goto error; } return true; error: sd_handle.Instance = NULL; return false; }
/** * @brief DeInitializes the SD card device. * @retval SD status */ uint8_t BSP_SD_DeInit(void) { uint8_t sd_state = MSD_OK; uSdHandle.Instance = SDIO; /* Set back Mfx pin to INPUT mode in case it was in exti */ UseExtiModeDetection = 0; BSP_IO_ConfigPin(SD_DETECT_PIN, IO_MODE_INPUT_PU); /* HAL SD deinitialization */ if(HAL_SD_DeInit(&uSdHandle) != HAL_OK) { sd_state = MSD_ERROR; } /* Msp SD deinitialization */ uSdHandle.Instance = SDIO; BSP_SD_MspDeInit(&uSdHandle, NULL); return sd_state; }
void sdcard_power_off(void) { HAL_SD_DeInit(&sd_handle); sd_handle.Instance = NULL; }