mirror of https://github.com/ARMmbed/mbed-os.git
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.pull/12460/head
parent
3d038e55ee
commit
c6a6984ab8
|
@ -42,10 +42,13 @@ SPIName spi_get_peripheral_name(PinName mosi, PinName miso, PinName sclk)
|
|||
|
||||
SPIName spi_per;
|
||||
|
||||
// If 3 wire SPI is used, the miso is not connected.
|
||||
// MISO or MOSI may be not connected
|
||||
if (miso == NC) {
|
||||
spi_per = (SPIName)pinmap_merge(spi_mosi, spi_sclk);
|
||||
} else {
|
||||
} else if (mosi == NC) {
|
||||
spi_per = (SPIName)pinmap_merge(spi_miso, spi_sclk);
|
||||
}
|
||||
else {
|
||||
SPIName spi_data = (SPIName)pinmap_merge(spi_mosi, spi_miso);
|
||||
spi_per = (SPIName)pinmap_merge(spi_data, spi_sclk);
|
||||
}
|
||||
|
@ -59,10 +62,14 @@ void spi_init_direct(spi_t *obj, const spi_pinmap_t *pinmap)
|
|||
MBED_ASSERT((int)obj->spi.instance != NC);
|
||||
|
||||
// pin out the spi pins
|
||||
pin_function(pinmap->mosi_pin, pinmap->mosi_function);
|
||||
pin_mode(pinmap->mosi_pin, PullNone);
|
||||
pin_function(pinmap->miso_pin, pinmap->miso_function);
|
||||
pin_mode(pinmap->miso_pin, PullNone);
|
||||
if (pinmap->mosi_pin != NC) {
|
||||
pin_function(pinmap->mosi_pin, pinmap->mosi_function);
|
||||
pin_mode(pinmap->mosi_pin, PullNone);
|
||||
}
|
||||
if (pinmap->miso_pin != NC) {
|
||||
pin_function(pinmap->miso_pin, pinmap->miso_function);
|
||||
pin_mode(pinmap->miso_pin, PullNone);
|
||||
}
|
||||
pin_function(pinmap->sclk_pin, pinmap->sclk_function);
|
||||
pin_mode(pinmap->sclk_pin, PullNone);
|
||||
if (pinmap->ssel_pin != NC) {
|
||||
|
|
|
@ -90,10 +90,14 @@ static void _spi_init_direct(spi_t *obj, const spi_pinmap_t *pinmap)
|
|||
}
|
||||
|
||||
// pin out the spi pins
|
||||
pin_function(pinmap->mosi_pin, pinmap->mosi_function);
|
||||
pin_mode(pinmap->mosi_pin, PullNone);
|
||||
pin_function(pinmap->miso_pin, pinmap->miso_function);
|
||||
pin_mode(pinmap->miso_pin, PullNone);
|
||||
if (pinmap->mosi_pin != NC) {
|
||||
pin_function(pinmap->mosi_pin, pinmap->mosi_function);
|
||||
pin_mode(pinmap->mosi_pin, PullNone);
|
||||
}
|
||||
if (pinmap->miso_pin != NC) {
|
||||
pin_function(pinmap->miso_pin, pinmap->miso_function);
|
||||
pin_mode(pinmap->miso_pin, PullNone);
|
||||
}
|
||||
pin_function(pinmap->sclk_pin, pinmap->sclk_function);
|
||||
pin_mode(pinmap->sclk_pin, PullNone);
|
||||
if (pinmap->ssel_pin != NC) {
|
||||
|
|
|
@ -147,9 +147,11 @@ SPIName spi_get_peripheral_name(PinName mosi, PinName miso, PinName sclk)
|
|||
|
||||
SPIName spi_per;
|
||||
|
||||
// If 3 wire SPI is used, the miso is not connected.
|
||||
// MISO or MOSI may be not connected
|
||||
if (miso == NC) {
|
||||
spi_per = (SPIName)pinmap_merge(spi_mosi, spi_sclk);
|
||||
} else if (mosi == NC) {
|
||||
spi_per = (SPIName)pinmap_merge(spi_miso, spi_sclk);
|
||||
} else {
|
||||
SPIName spi_data = (SPIName)pinmap_merge(spi_mosi, spi_miso);
|
||||
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)
|
|||
#endif
|
||||
|
||||
// Configure the SPI pins
|
||||
pin_function(pinmap->mosi_pin, pinmap->mosi_function);
|
||||
pin_mode(pinmap->mosi_pin, PullNone);
|
||||
pin_function(pinmap->miso_pin, pinmap->miso_function);
|
||||
pin_mode(pinmap->miso_pin, PullNone);
|
||||
if (pinmap->mosi_pin != NC) {
|
||||
pin_function(pinmap->mosi_pin, pinmap->mosi_function);
|
||||
pin_mode(pinmap->mosi_pin, PullNone);
|
||||
}
|
||||
if (pinmap->miso_pin != NC) {
|
||||
pin_function(pinmap->miso_pin, pinmap->miso_function);
|
||||
pin_mode(pinmap->miso_pin, PullNone);
|
||||
}
|
||||
pin_function(pinmap->sclk_pin, pinmap->sclk_function);
|
||||
pin_mode(pinmap->sclk_pin, PullNone);
|
||||
spiobj->pin_miso = pinmap->miso_pin;
|
||||
|
@ -364,8 +370,12 @@ void spi_free(spi_t *obj)
|
|||
LL_HSEM_ReleaseLock(HSEM, CFG_HW_RCC_SEMID, HSEM_CR_COREID_CURRENT);
|
||||
#endif /* DUAL_CORE */
|
||||
// Configure GPIOs
|
||||
pin_function(spiobj->pin_miso, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
|
||||
pin_function(spiobj->pin_mosi, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
|
||||
if (spiobj->pin_miso != NC) {
|
||||
pin_function(spiobj->pin_miso, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
|
||||
}
|
||||
if (spiobj->pin_mosi != NC) {
|
||||
pin_function(spiobj->pin_mosi, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
|
||||
}
|
||||
pin_function(spiobj->pin_sclk, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
|
||||
if (handle->Init.NSS != SPI_NSS_SOFT) {
|
||||
pin_function(spiobj->pin_ssel, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
|
||||
|
|
Loading…
Reference in New Issue