Skip to content

Commit bcdc51b

Browse files
committed
Add Transceiver support
Signed-off-by: Frederic.Pillon <frederic.pillon@st.com>
1 parent 8169775 commit bcdc51b

File tree

4 files changed

+124
-5
lines changed

4 files changed

+124
-5
lines changed

README.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,16 @@ Some default definitions can be overridden using:
5050
* `SD_BUS_WIDE_4B` (default)
5151
* `SD_BUS_WIDE_8B`
5252

53+
#### SD Transceiver
54+
55+
* `SD_TRANSCEIVER_MODE`: specifies whether external Transceiver is enabled or disabled. Available only on some STM32
56+
* `SDMMC_TRANSCEIVER_ENABLE`
57+
* `SDMMC_TRANSCEIVER_DISABLE` (default)
58+
59+
* `SD_TRANSCEIVER_EN` pin number to enable the level shifter
60+
* `SD_TRANSCEIVER_SEL` pin number for voltage selection
5361

5462
#### SD detect and timeout
5563
* `SD_DETECT_PIN` pin number
5664

57-
* `SD_DATATIMEOUT` constant for Read/Write block
65+
* `SD_DATATIMEOUT` constant for Read/Write block

src/Sd2Card.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,14 @@ bool Sd2Card::init(uint32_t detectpin)
4747
return false;
4848
}
4949
}
50+
#ifdef SDMMC_TRANSCEIVER_ENABLE
51+
PinName sd_en = digitalPinToPinName(SD_TRANSCEIVER_EN);
52+
PinName sd_sel = digitalPinToPinName(SD_TRANSCEIVER_SEL);
53+
BSP_SD_TransceiverPin(set_GPIO_Port_Clock(STM_PORT(sd_en)),
54+
STM_LL_GPIO_PIN(sd_en),
55+
set_GPIO_Port_Clock(STM_PORT(sd_sel)),
56+
STM_LL_GPIO_PIN(sd_sel));
57+
#endif
5058
if (BSP_SD_Init() == MSD_OK) {
5159
BSP_SD_GetCardInfo(&_SdCardInfo);
5260
return true;

src/bsp_sd.c

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,11 @@
6767
#define SD_CLK_DIV SDMMC_TRANSFER_CLK_DIV
6868
#endif
6969

70+
#ifdef SDMMC_TRANSCEIVER_ENABLE
71+
#define SD_TRANSCEIVER_ENABLE SDMMC_TRANSCEIVER_ENABLE
72+
#define SD_TRANSCEIVER_DISABLE SDMMC_TRANSCEIVER_DISABLE
73+
#endif
74+
7075
#elif defined(SDIO)
7176
#define SD_INSTANCE SDIO
7277
#define SD_CLK_ENABLE __HAL_RCC_SDIO_CLK_ENABLE
@@ -92,10 +97,20 @@
9297
#define SD_BUS_WIDE SD_BUS_WIDE_4B
9398
#endif
9499

100+
#if defined(SDMMC_TRANSCEIVER_ENABLE) && !defined(SD_TRANSCEIVER_MODE)
101+
#define SD_TRANSCEIVER_MODE SD_TRANSCEIVER_DISABLE
102+
#endif
103+
95104
/* BSP SD Private Variables */
96105
static SD_HandleTypeDef uSdHandle;
97106
static uint32_t SD_detect_ll_gpio_pin = LL_GPIO_PIN_ALL;
98107
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
99114
#ifndef STM32L1xx
100115
#define SD_OK HAL_OK
101116
#define SD_TRANSFER_OK ((uint8_t)0x00)
@@ -124,6 +139,13 @@ uint8_t BSP_SD_Init(void)
124139
uSdHandle.Init.BusWide = SD_BUS_WIDE_1B;
125140
uSdHandle.Init.HardwareFlowControl = SD_HW_FLOW_CTRL;
126141
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
127149

128150
if (SD_detect_ll_gpio_pin != LL_GPIO_PIN_ALL) {
129151
/* Msp SD Detect pin initialization */
@@ -179,6 +201,26 @@ uint8_t BSP_SD_DeInit(void)
179201
return sd_state;
180202
}
181203

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+
182224
/**
183225
* @brief Set the SD card device detect pin and port.
184226
* @param port one of the gpio port
@@ -437,6 +479,47 @@ __weak void BSP_SD_MspDeInit(SD_HandleTypeDef *hsd, void *Params)
437479
#endif
438480
}
439481

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+
440523
#ifndef STM32L1xx
441524
/**
442525
* @brief Gets the current SD card data status.

src/bsp_sd.h

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,6 @@ extern "C" {
5252
#error "This library version required a STM32 core version > 1.6.1.\
5353
Please update the core or install previous libray version."
5454
#endif
55-
/* Could be redefined in variant.h or using build_opt.h */
56-
#ifndef SD_DATATIMEOUT
57-
#define SD_DATATIMEOUT 100000000U
58-
#endif
5955

6056
/*SD Card information structure */
6157
#ifndef STM32L1xx
@@ -76,10 +72,31 @@ Please update the core or install previous libray version."
7672
#define SD_PRESENT ((uint8_t)0x01)
7773
#define SD_NOT_PRESENT ((uint8_t)0x00)
7874
#define SD_DETECT_NONE NUM_DIGITAL_PINS
75+
#ifdef SDMMC_TRANSCEIVER_ENABLE
76+
#define SD_TRANSCEIVER_NONE NUM_DIGITAL_PINS
77+
#endif
78+
79+
/* Could be redefined in variant.h or using build_opt.h */
80+
#ifndef SD_DATATIMEOUT
81+
#define SD_DATATIMEOUT 100000000U
82+
#endif
83+
84+
#ifdef SDMMC_TRANSCEIVER_ENABLE
85+
#ifndef SD_TRANSCEIVER_EN
86+
#define SD_TRANSCEIVER_EN SD_TRANSCEIVER_NONE
87+
#endif
88+
89+
#ifndef SD_TRANSCEIVER_SEL
90+
#define SD_TRANSCEIVER_SEL SD_TRANSCEIVER_NONE
91+
#endif
92+
#endif
7993

8094
/* SD Exported Functions */
8195
uint8_t BSP_SD_Init(void);
8296
uint8_t BSP_SD_DeInit(void);
97+
#ifdef SDMMC_TRANSCEIVER_ENABLE
98+
uint8_t BSP_SD_TransceiverPin(GPIO_TypeDef *enport, uint32_t enpin, GPIO_TypeDef *selport, uint32_t selpin);
99+
#endif
83100
uint8_t BSP_SD_DetectPin(GPIO_TypeDef *port, uint32_t pin);
84101
uint8_t BSP_SD_DetectITConfig(void (*callback)(void));
85102
#ifndef STM32L1xx
@@ -103,6 +120,9 @@ uint8_t BSP_SD_IsDetected(void);
103120
void BSP_SD_MspInit(SD_HandleTypeDef *hsd, void *Params);
104121
void BSP_SD_Detect_MspInit(SD_HandleTypeDef *hsd, void *Params);
105122
void BSP_SD_MspDeInit(SD_HandleTypeDef *hsd, void *Params);
123+
#ifdef SDMMC_TRANSCEIVER_ENABLE
124+
void BSP_SD_Transceiver_MspInit(SD_HandleTypeDef *hsd, void *Params);
125+
#endif
106126

107127
#ifdef __cplusplus
108128
}

0 commit comments

Comments
 (0)