Merge pull request #12460 from mprse/spi_init_nc_fix

Allow MISO/MOSI set to NC during SPI initialisation (fix for issue #12435)
pull/12543/head
Martin Kojtal 2020-03-03 09:56:47 +00:00 committed by GitHub
commit bad9c57085
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 73 additions and 42 deletions

View File

@ -162,7 +162,15 @@ static bool check_capabilities(const spi_capabilities_t *capabilities, SPITester
return true;
}
void fpga_spi_test_init_free(PinName mosi, PinName miso, PinName sclk)
void fpga_spi_test_init_free(PinName mosi, PinName miso, PinName sclk, PinName ssel)
{
spi_init(&spi, mosi, miso, sclk, ssel);
spi_format(&spi, 8, 0, 0);
spi_frequency(&spi, 1000000);
spi_free(&spi);
}
void fpga_spi_test_init_free_cs_nc(PinName mosi, PinName miso, PinName sclk)
{
spi_init(&spi, mosi, miso, sclk, NC);
spi_format(&spi, 8, 0, 0);
@ -170,6 +178,24 @@ void fpga_spi_test_init_free(PinName mosi, PinName miso, PinName sclk)
spi_free(&spi);
}
void fpga_spi_test_init_free_cs_nc_miso_nc_mosi_nc(PinName mosi, PinName miso, PinName sclk)
{
utest_printf("\nTesting: MOSI = NC. ");
spi_init(&spi, NC, miso, sclk, NC);
spi_format(&spi, 8, 0, 0);
spi_frequency(&spi, 1000000);
spi_free(&spi);
utest_printf("Testing: MISO = NC. ");
spi_init(&spi, mosi, NC, sclk, NC);
spi_format(&spi, 8, 0, 0);
spi_frequency(&spi, 1000000);
spi_free(&spi);
}
void fpga_spi_test_common(PinName mosi, PinName miso, PinName sclk, PinName ssel, SPITester::SpiMode spi_mode, uint32_t sym_size, transfer_type_t transfer_type, uint32_t frequency, test_buffers_t test_buffers, bool auto_ss, bool init_direct)
{
spi_capabilities_t capabilities;
@ -361,7 +387,9 @@ void fpga_spi_test_common_no_ss(PinName mosi, PinName miso, PinName sclk)
Case cases[] = {
// This will be run for all pins
Case("SPI - init/free test all pins", all_ports<SPINoCSPort, DefaultFormFactor, fpga_spi_test_init_free>),
Case("SPI - init/free test all pins", all_ports<SPIPort, DefaultFormFactor, fpga_spi_test_init_free>),
Case("SPI - init/free test all pins (CS == NC)", all_ports<SPINoCSPort, DefaultFormFactor, fpga_spi_test_init_free_cs_nc>),
Case("SPI - init/free test all pins (CS == NC, MISO/MOSI == NC)", one_peripheral<SPINoCSPort, DefaultFormFactor, fpga_spi_test_init_free_cs_nc_miso_nc_mosi_nc>),
// This will be run for all peripherals
Case("SPI - basic test", all_peripherals<SPINoCSPort, DefaultFormFactor, fpga_spi_test_common_no_ss<SPITester::Mode0, 8, TRANSFER_SPI_MASTER_WRITE_SYNC, FREQ_1_MHZ, BUFFERS_COMMON, false, false> >),

View File

@ -42,9 +42,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);
@ -59,10 +61,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) {

View File

@ -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) {
@ -169,7 +173,7 @@ void spi_frequency(spi_t *obj, int hz)
SPI_MasterSetBaud(spi_address[obj->instance], (uint32_t)hz, 12000000);
}
static inline int spi_readable(spi_t * obj)
static inline int spi_readable(spi_t *obj)
{
return (SPI_GetStatusFlags(spi_address[obj->instance]) & kSPI_RxNotEmptyFlag);
}
@ -186,7 +190,8 @@ int spi_master_write(spi_t *obj, int value)
}
int spi_master_block_write(spi_t *obj, const char *tx_buffer, int tx_length,
char *rx_buffer, int rx_length, char write_fill) {
char *rx_buffer, int rx_length, char write_fill)
{
int total = (tx_length > rx_length) ? tx_length : rx_length;
for (int i = 0; i < total; i++) {

View File

@ -100,12 +100,8 @@ static void _can_init_freq_direct(can_t *obj, const can_pinmap_t *pinmap, int hz
pin_function(pinmap->rd_pin, pinmap->rd_function);
pin_function(pinmap->td_pin, pinmap->td_function);
// Add pull-ups
if (pinmap->rd_pin != NC) {
pin_mode(pinmap->rd_pin, PullUp);
}
if (pinmap->td_pin != NC) {
pin_mode(pinmap->td_pin, PullUp);
}
pin_mode(pinmap->rd_pin, PullUp);
pin_mode(pinmap->td_pin, PullUp);
// Default values
obj->CanHandle.Instance = (FDCAN_GlobalTypeDef *)pinmap->peripheral;
@ -599,12 +595,8 @@ static void _can_init_freq_direct(can_t *obj, const can_pinmap_t *pinmap, int hz
pin_function(pinmap->rd_pin, pinmap->rd_function);
pin_function(pinmap->td_pin, pinmap->td_function);
// Add pull-ups
if (pinmap->rd_pin != NC) {
pin_mode(pinmap->rd_pin, PullUp);
}
if (pinmap->td_pin != NC) {
pin_mode(pinmap->td_pin, PullUp);
}
pin_mode(pinmap->rd_pin, PullUp);
pin_mode(pinmap->td_pin, PullUp);
/* Use default values for rist init */
obj->CanHandle.Instance = (CAN_TypeDef *)pinmap->peripheral;

View File

@ -59,7 +59,9 @@ const uint32_t ll_pin_defines[16] = {
*/
void pin_function(PinName pin, int data)
{
MBED_ASSERT(pin != (PinName)NC);
if (pin == NC) {
return;
}
// Get the pin informations
uint32_t mode = STM_PIN_FUNCTION(data);
@ -163,7 +165,9 @@ void pin_function(PinName pin, int data)
*/
void pin_mode(PinName pin, PinMode mode)
{
MBED_ASSERT(pin != (PinName)NC);
if (pin == NC) {
return;
}
uint32_t port_index = STM_PORT(pin);
uint32_t ll_pin = ll_pin_defines[STM_PIN(pin)];

View File

@ -157,14 +157,10 @@ static void _serial_init_direct(serial_t *obj, const serial_pinmap_t *pinmap)
MBED_ASSERT(obj_s->index >= 0);
// Configure UART pins
if (pinmap->tx_pin != NC) {
pin_function(pinmap->tx_pin, pinmap->tx_function);
pin_mode(pinmap->tx_pin, PullUp);
}
if (pinmap->rx_pin != NC) {
pin_function(pinmap->rx_pin, pinmap->rx_function);
pin_mode(pinmap->rx_pin, PullUp);
}
pin_function(pinmap->tx_pin, pinmap->tx_function);
pin_mode(pinmap->tx_pin, PullUp);
pin_function(pinmap->rx_pin, pinmap->rx_function);
pin_mode(pinmap->rx_pin, PullUp);
// Configure UART
obj_s->baudrate = 9600; // baudrate default value
@ -355,13 +351,9 @@ void serial_free(serial_t *obj)
#endif /* DUAL_CORE */
// Configure GPIOs
if (obj_s->pin_tx != NC) {
pin_function(obj_s->pin_tx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
}
pin_function(obj_s->pin_tx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
if (obj_s->pin_rx != NC) {
pin_function(obj_s->pin_rx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
}
pin_function(obj_s->pin_rx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
serial_irq_ids[obj_s->index] = 0;
}

View File

@ -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);
@ -218,8 +220,10 @@ static void _spi_init_direct(spi_t *obj, const spi_pinmap_t *pinmap)
// 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);
pin_function(pinmap->sclk_pin, pinmap->sclk_function);
pin_mode(pinmap->sclk_pin, PullNone);
spiobj->pin_miso = pinmap->miso_pin;