Skip to content

Commit c6a6984

Browse files
committed
Allow NC for MISO or MOSI while initializing SPI
Static pinmap extension required to use pin_function() and pin_mode() functions instead of pinmap_pinout(). Unfortunatelly pin_function() does not allow passing NC pin. Call pin_function() and pin_mode() only if MISO/MOSI pin is not NC.
1 parent 3d038e5 commit c6a6984

File tree

3 files changed

+38
-17
lines changed

3 files changed

+38
-17
lines changed

targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/spi_api.c

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,13 @@ SPIName spi_get_peripheral_name(PinName mosi, PinName miso, PinName sclk)
4242

4343
SPIName spi_per;
4444

45-
// If 3 wire SPI is used, the miso is not connected.
45+
// MISO or MOSI may be not connected
4646
if (miso == NC) {
4747
spi_per = (SPIName)pinmap_merge(spi_mosi, spi_sclk);
48-
} else {
48+
} else if (mosi == NC) {
49+
spi_per = (SPIName)pinmap_merge(spi_miso, spi_sclk);
50+
}
51+
else {
4952
SPIName spi_data = (SPIName)pinmap_merge(spi_mosi, spi_miso);
5053
spi_per = (SPIName)pinmap_merge(spi_data, spi_sclk);
5154
}
@@ -59,10 +62,14 @@ void spi_init_direct(spi_t *obj, const spi_pinmap_t *pinmap)
5962
MBED_ASSERT((int)obj->spi.instance != NC);
6063

6164
// pin out the spi pins
62-
pin_function(pinmap->mosi_pin, pinmap->mosi_function);
63-
pin_mode(pinmap->mosi_pin, PullNone);
64-
pin_function(pinmap->miso_pin, pinmap->miso_function);
65-
pin_mode(pinmap->miso_pin, PullNone);
65+
if (pinmap->mosi_pin != NC) {
66+
pin_function(pinmap->mosi_pin, pinmap->mosi_function);
67+
pin_mode(pinmap->mosi_pin, PullNone);
68+
}
69+
if (pinmap->miso_pin != NC) {
70+
pin_function(pinmap->miso_pin, pinmap->miso_function);
71+
pin_mode(pinmap->miso_pin, PullNone);
72+
}
6673
pin_function(pinmap->sclk_pin, pinmap->sclk_function);
6774
pin_mode(pinmap->sclk_pin, PullNone);
6875
if (pinmap->ssel_pin != NC) {

targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC/spi_api.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,14 @@ static void _spi_init_direct(spi_t *obj, const spi_pinmap_t *pinmap)
9090
}
9191

9292
// pin out the spi pins
93-
pin_function(pinmap->mosi_pin, pinmap->mosi_function);
94-
pin_mode(pinmap->mosi_pin, PullNone);
95-
pin_function(pinmap->miso_pin, pinmap->miso_function);
96-
pin_mode(pinmap->miso_pin, PullNone);
93+
if (pinmap->mosi_pin != NC) {
94+
pin_function(pinmap->mosi_pin, pinmap->mosi_function);
95+
pin_mode(pinmap->mosi_pin, PullNone);
96+
}
97+
if (pinmap->miso_pin != NC) {
98+
pin_function(pinmap->miso_pin, pinmap->miso_function);
99+
pin_mode(pinmap->miso_pin, PullNone);
100+
}
97101
pin_function(pinmap->sclk_pin, pinmap->sclk_function);
98102
pin_mode(pinmap->sclk_pin, PullNone);
99103
if (pinmap->ssel_pin != NC) {

targets/TARGET_STM/stm_spi_api.c

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -147,9 +147,11 @@ SPIName spi_get_peripheral_name(PinName mosi, PinName miso, PinName sclk)
147147

148148
SPIName spi_per;
149149

150-
// If 3 wire SPI is used, the miso is not connected.
150+
// MISO or MOSI may be not connected
151151
if (miso == NC) {
152152
spi_per = (SPIName)pinmap_merge(spi_mosi, spi_sclk);
153+
} else if (mosi == NC) {
154+
spi_per = (SPIName)pinmap_merge(spi_miso, spi_sclk);
153155
} else {
154156
SPIName spi_data = (SPIName)pinmap_merge(spi_mosi, spi_miso);
155157
spi_per = (SPIName)pinmap_merge(spi_data, spi_sclk);
@@ -216,10 +218,14 @@ static void _spi_init_direct(spi_t *obj, const spi_pinmap_t *pinmap)
216218
#endif
217219

218220
// Configure the SPI pins
219-
pin_function(pinmap->mosi_pin, pinmap->mosi_function);
220-
pin_mode(pinmap->mosi_pin, PullNone);
221-
pin_function(pinmap->miso_pin, pinmap->miso_function);
222-
pin_mode(pinmap->miso_pin, PullNone);
221+
if (pinmap->mosi_pin != NC) {
222+
pin_function(pinmap->mosi_pin, pinmap->mosi_function);
223+
pin_mode(pinmap->mosi_pin, PullNone);
224+
}
225+
if (pinmap->miso_pin != NC) {
226+
pin_function(pinmap->miso_pin, pinmap->miso_function);
227+
pin_mode(pinmap->miso_pin, PullNone);
228+
}
223229
pin_function(pinmap->sclk_pin, pinmap->sclk_function);
224230
pin_mode(pinmap->sclk_pin, PullNone);
225231
spiobj->pin_miso = pinmap->miso_pin;
@@ -364,8 +370,12 @@ void spi_free(spi_t *obj)
364370
LL_HSEM_ReleaseLock(HSEM, CFG_HW_RCC_SEMID, HSEM_CR_COREID_CURRENT);
365371
#endif /* DUAL_CORE */
366372
// Configure GPIOs
367-
pin_function(spiobj->pin_miso, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
368-
pin_function(spiobj->pin_mosi, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
373+
if (spiobj->pin_miso != NC) {
374+
pin_function(spiobj->pin_miso, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
375+
}
376+
if (spiobj->pin_mosi != NC) {
377+
pin_function(spiobj->pin_mosi, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
378+
}
369379
pin_function(spiobj->pin_sclk, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
370380
if (handle->Init.NSS != SPI_NSS_SOFT) {
371381
pin_function(spiobj->pin_ssel, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));

0 commit comments

Comments
 (0)