|
67 | 67 | #define SD_CLK_DIV SDMMC_TRANSFER_CLK_DIV
|
68 | 68 | #endif
|
69 | 69 |
|
| 70 | +#ifdef SDMMC_TRANSCEIVER_ENABLE |
| 71 | +#define SD_TRANSCEIVER_ENABLE SDMMC_TRANSCEIVER_ENABLE |
| 72 | +#define SD_TRANSCEIVER_DISABLE SDMMC_TRANSCEIVER_DISABLE |
| 73 | +#endif |
| 74 | + |
70 | 75 | #elif defined(SDIO)
|
71 | 76 | #define SD_INSTANCE SDIO
|
72 | 77 | #define SD_CLK_ENABLE __HAL_RCC_SDIO_CLK_ENABLE
|
|
92 | 97 | #define SD_BUS_WIDE SD_BUS_WIDE_4B
|
93 | 98 | #endif
|
94 | 99 |
|
| 100 | +#if defined(SDMMC_TRANSCEIVER_ENABLE) && !defined(SD_TRANSCEIVER_MODE) |
| 101 | +#define SD_TRANSCEIVER_MODE SD_TRANSCEIVER_DISABLE |
| 102 | +#endif |
| 103 | + |
95 | 104 | /* BSP SD Private Variables */
|
96 | 105 | static SD_HandleTypeDef uSdHandle;
|
97 | 106 | static uint32_t SD_detect_ll_gpio_pin = LL_GPIO_PIN_ALL;
|
98 | 107 | static GPIO_TypeDef *SD_detect_gpio_port = GPIOA;
|
| 108 | +#ifdef SDMMC_TRANSCEIVER_ENABLE |
| 109 | +static uint32_t SD_trans_en_ll_gpio_pin = LL_GPIO_PIN_ALL; |
| 110 | +static GPIO_TypeDef *SD_trans_en_gpio_port = GPIOA; |
| 111 | +static uint32_t SD_trans_sel_ll_gpio_pin = LL_GPIO_PIN_ALL; |
| 112 | +static GPIO_TypeDef *SD_trans_sel_gpio_port = GPIOA; |
| 113 | +#endif |
99 | 114 | #ifndef STM32L1xx
|
100 | 115 | #define SD_OK HAL_OK
|
101 | 116 | #define SD_TRANSFER_OK ((uint8_t)0x00)
|
@@ -124,6 +139,13 @@ uint8_t BSP_SD_Init(void)
|
124 | 139 | uSdHandle.Init.BusWide = SD_BUS_WIDE_1B;
|
125 | 140 | uSdHandle.Init.HardwareFlowControl = SD_HW_FLOW_CTRL;
|
126 | 141 | uSdHandle.Init.ClockDiv = SD_CLK_DIV;
|
| 142 | +#ifdef SDMMC_TRANSCEIVER_ENABLE |
| 143 | + uSdHandle.Init.Transceiver = SD_TRANSCEIVER_MODE; |
| 144 | + if (SD_TRANSCEIVER_MODE == SD_TRANSCEIVER_ENABLE) { |
| 145 | + |
| 146 | + BSP_SD_Transceiver_MspInit(&uSdHandle, NULL); |
| 147 | + } |
| 148 | +#endif |
127 | 149 |
|
128 | 150 | if (SD_detect_ll_gpio_pin != LL_GPIO_PIN_ALL) {
|
129 | 151 | /* Msp SD Detect pin initialization */
|
@@ -179,6 +201,26 @@ uint8_t BSP_SD_DeInit(void)
|
179 | 201 | return sd_state;
|
180 | 202 | }
|
181 | 203 |
|
| 204 | +#ifdef SDMMC_TRANSCEIVER_ENABLE |
| 205 | +/** |
| 206 | + * @brief Set the SD card device detect pin and port. |
| 207 | + * @param port one of the gpio port |
| 208 | + * @param pin one of the gpio pin |
| 209 | + * @retval SD status |
| 210 | + */ |
| 211 | +uint8_t BSP_SD_TransceiverPin(GPIO_TypeDef *enport, uint32_t enpin, GPIO_TypeDef *selport, uint32_t selpin) |
| 212 | +{ |
| 213 | + if ((enport != 0) && (selport != 0)) { |
| 214 | + SD_trans_en_ll_gpio_pin = enpin; |
| 215 | + SD_trans_en_gpio_port = enport; |
| 216 | + SD_trans_sel_ll_gpio_pin = selpin; |
| 217 | + SD_trans_sel_gpio_port = selport; |
| 218 | + return MSD_OK; |
| 219 | + } |
| 220 | + return MSD_ERROR; |
| 221 | +} |
| 222 | +#endif |
| 223 | + |
182 | 224 | /**
|
183 | 225 | * @brief Set the SD card device detect pin and port.
|
184 | 226 | * @param port one of the gpio port
|
@@ -437,6 +479,47 @@ __weak void BSP_SD_MspDeInit(SD_HandleTypeDef *hsd, void *Params)
|
437 | 479 | #endif
|
438 | 480 | }
|
439 | 481 |
|
| 482 | +#ifdef SDMMC_TRANSCEIVER_ENABLE |
| 483 | +/** |
| 484 | + * @brief Initializes the SD Transceiver pin MSP. |
| 485 | + * @param hsd: SD handle |
| 486 | + * @param Params : pointer on additional configuration parameters, can be NULL. |
| 487 | + */ |
| 488 | +__weak void BSP_SD_Transceiver_MspInit(SD_HandleTypeDef *hsd, void *Params) |
| 489 | +{ |
| 490 | + UNUSED(hsd); |
| 491 | + UNUSED(Params); |
| 492 | + |
| 493 | + LL_GPIO_SetPinSpeed(SD_trans_en_gpio_port, SD_trans_en_ll_gpio_pin, LL_GPIO_SPEED_FREQ_HIGH); |
| 494 | + LL_GPIO_SetPinMode(SD_trans_en_gpio_port, SD_trans_en_ll_gpio_pin, LL_GPIO_MODE_OUTPUT); |
| 495 | + LL_GPIO_SetPinPull(SD_trans_en_gpio_port, SD_trans_en_ll_gpio_pin, LL_GPIO_PULL_NO); |
| 496 | + |
| 497 | + LL_GPIO_SetPinSpeed(SD_trans_sel_gpio_port, SD_trans_sel_ll_gpio_pin, LL_GPIO_SPEED_FREQ_HIGH); |
| 498 | + LL_GPIO_SetPinMode(SD_trans_sel_gpio_port, SD_trans_sel_ll_gpio_pin, LL_GPIO_MODE_OUTPUT); |
| 499 | + LL_GPIO_SetPinPull(SD_trans_sel_gpio_port, SD_trans_sel_ll_gpio_pin, LL_GPIO_PULL_NO); |
| 500 | + |
| 501 | + /* Enable the level shifter */ |
| 502 | + LL_GPIO_SetOutputPin(SD_trans_en_gpio_port, SD_trans_en_ll_gpio_pin); |
| 503 | + |
| 504 | + /* By default start with the default voltage */ |
| 505 | + LL_GPIO_ResetOutputPin(SD_trans_sel_gpio_port, SD_trans_sel_ll_gpio_pin); |
| 506 | +} |
| 507 | + |
| 508 | +/** |
| 509 | + * @brief Enable/Disable the SD Transceiver 1.8V Mode Callback. |
| 510 | + * @param status: Voltage Switch State |
| 511 | + * @retval None |
| 512 | + */ |
| 513 | +void HAL_SDEx_DriveTransceiver_1_8V_Callback(FlagStatus status) |
| 514 | +{ |
| 515 | + if (status == SET) { |
| 516 | + LL_GPIO_SetOutputPin(SD_trans_sel_gpio_port, SD_trans_sel_ll_gpio_pin); |
| 517 | + } else { |
| 518 | + LL_GPIO_ResetOutputPin(SD_trans_sel_gpio_port, SD_trans_sel_ll_gpio_pin); |
| 519 | + } |
| 520 | +} |
| 521 | +#endif /* SDMMC_TRANSCEIVER_ENABLE */ |
| 522 | + |
440 | 523 | #ifndef STM32L1xx
|
441 | 524 | /**
|
442 | 525 | * @brief Gets the current SD card data status.
|
|
0 commit comments