Skip to content

Commit bad9c57

Browse files
authored
Merge pull request #12460 from mprse/spi_init_nc_fix
Allow MISO/MOSI set to NC during SPI initialisation (fix for issue #12435)
2 parents e53b69b + 713be4f commit bad9c57

File tree

7 files changed

+73
-42
lines changed

7 files changed

+73
-42
lines changed

TESTS/mbed_hal_fpga_ci_test_shield/spi/main.cpp

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,14 +162,40 @@ static bool check_capabilities(const spi_capabilities_t *capabilities, SPITester
162162
return true;
163163
}
164164

165-
void fpga_spi_test_init_free(PinName mosi, PinName miso, PinName sclk)
165+
void fpga_spi_test_init_free(PinName mosi, PinName miso, PinName sclk, PinName ssel)
166+
{
167+
spi_init(&spi, mosi, miso, sclk, ssel);
168+
spi_format(&spi, 8, 0, 0);
169+
spi_frequency(&spi, 1000000);
170+
spi_free(&spi);
171+
}
172+
173+
void fpga_spi_test_init_free_cs_nc(PinName mosi, PinName miso, PinName sclk)
166174
{
167175
spi_init(&spi, mosi, miso, sclk, NC);
168176
spi_format(&spi, 8, 0, 0);
169177
spi_frequency(&spi, 1000000);
170178
spi_free(&spi);
171179
}
172180

181+
void fpga_spi_test_init_free_cs_nc_miso_nc_mosi_nc(PinName mosi, PinName miso, PinName sclk)
182+
{
183+
utest_printf("\nTesting: MOSI = NC. ");
184+
185+
spi_init(&spi, NC, miso, sclk, NC);
186+
spi_format(&spi, 8, 0, 0);
187+
spi_frequency(&spi, 1000000);
188+
spi_free(&spi);
189+
190+
utest_printf("Testing: MISO = NC. ");
191+
192+
spi_init(&spi, mosi, NC, sclk, NC);
193+
spi_format(&spi, 8, 0, 0);
194+
spi_frequency(&spi, 1000000);
195+
spi_free(&spi);
196+
}
197+
198+
173199
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)
174200
{
175201
spi_capabilities_t capabilities;
@@ -361,7 +387,9 @@ void fpga_spi_test_common_no_ss(PinName mosi, PinName miso, PinName sclk)
361387

362388
Case cases[] = {
363389
// This will be run for all pins
364-
Case("SPI - init/free test all pins", all_ports<SPINoCSPort, DefaultFormFactor, fpga_spi_test_init_free>),
390+
Case("SPI - init/free test all pins", all_ports<SPIPort, DefaultFormFactor, fpga_spi_test_init_free>),
391+
Case("SPI - init/free test all pins (CS == NC)", all_ports<SPINoCSPort, DefaultFormFactor, fpga_spi_test_init_free_cs_nc>),
392+
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>),
365393

366394
// This will be run for all peripherals
367395
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> >),

targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/spi_api.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,11 @@ 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 if (mosi == NC) {
49+
spi_per = (SPIName)pinmap_merge(spi_miso, spi_sclk);
4850
} else {
4951
SPIName spi_data = (SPIName)pinmap_merge(spi_mosi, spi_miso);
5052
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)
5961
MBED_ASSERT((int)obj->spi.instance != NC);
6062

6163
// 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);
64+
if (pinmap->mosi_pin != NC) {
65+
pin_function(pinmap->mosi_pin, pinmap->mosi_function);
66+
pin_mode(pinmap->mosi_pin, PullNone);
67+
}
68+
if (pinmap->miso_pin != NC) {
69+
pin_function(pinmap->miso_pin, pinmap->miso_function);
70+
pin_mode(pinmap->miso_pin, PullNone);
71+
}
6672
pin_function(pinmap->sclk_pin, pinmap->sclk_function);
6773
pin_mode(pinmap->sclk_pin, PullNone);
6874
if (pinmap->ssel_pin != NC) {

targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC/spi_api.c

Lines changed: 11 additions & 6 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) {
@@ -169,7 +173,7 @@ void spi_frequency(spi_t *obj, int hz)
169173
SPI_MasterSetBaud(spi_address[obj->instance], (uint32_t)hz, 12000000);
170174
}
171175

172-
static inline int spi_readable(spi_t * obj)
176+
static inline int spi_readable(spi_t *obj)
173177
{
174178
return (SPI_GetStatusFlags(spi_address[obj->instance]) & kSPI_RxNotEmptyFlag);
175179
}
@@ -186,7 +190,8 @@ int spi_master_write(spi_t *obj, int value)
186190
}
187191

188192
int spi_master_block_write(spi_t *obj, const char *tx_buffer, int tx_length,
189-
char *rx_buffer, int rx_length, char write_fill) {
193+
char *rx_buffer, int rx_length, char write_fill)
194+
{
190195
int total = (tx_length > rx_length) ? tx_length : rx_length;
191196

192197
for (int i = 0; i < total; i++) {

targets/TARGET_STM/can_api.c

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -100,12 +100,8 @@ static void _can_init_freq_direct(can_t *obj, const can_pinmap_t *pinmap, int hz
100100
pin_function(pinmap->rd_pin, pinmap->rd_function);
101101
pin_function(pinmap->td_pin, pinmap->td_function);
102102
// Add pull-ups
103-
if (pinmap->rd_pin != NC) {
104-
pin_mode(pinmap->rd_pin, PullUp);
105-
}
106-
if (pinmap->td_pin != NC) {
107-
pin_mode(pinmap->td_pin, PullUp);
108-
}
103+
pin_mode(pinmap->rd_pin, PullUp);
104+
pin_mode(pinmap->td_pin, PullUp);
109105

110106
// Default values
111107
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
599595
pin_function(pinmap->rd_pin, pinmap->rd_function);
600596
pin_function(pinmap->td_pin, pinmap->td_function);
601597
// Add pull-ups
602-
if (pinmap->rd_pin != NC) {
603-
pin_mode(pinmap->rd_pin, PullUp);
604-
}
605-
if (pinmap->td_pin != NC) {
606-
pin_mode(pinmap->td_pin, PullUp);
607-
}
598+
pin_mode(pinmap->rd_pin, PullUp);
599+
pin_mode(pinmap->td_pin, PullUp);
608600

609601
/* Use default values for rist init */
610602
obj->CanHandle.Instance = (CAN_TypeDef *)pinmap->peripheral;

targets/TARGET_STM/pinmap.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,9 @@ const uint32_t ll_pin_defines[16] = {
5959
*/
6060
void pin_function(PinName pin, int data)
6161
{
62-
MBED_ASSERT(pin != (PinName)NC);
62+
if (pin == NC) {
63+
return;
64+
}
6365

6466
// Get the pin informations
6567
uint32_t mode = STM_PIN_FUNCTION(data);
@@ -163,7 +165,9 @@ void pin_function(PinName pin, int data)
163165
*/
164166
void pin_mode(PinName pin, PinMode mode)
165167
{
166-
MBED_ASSERT(pin != (PinName)NC);
168+
if (pin == NC) {
169+
return;
170+
}
167171

168172
uint32_t port_index = STM_PORT(pin);
169173
uint32_t ll_pin = ll_pin_defines[STM_PIN(pin)];

targets/TARGET_STM/serial_api.c

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -157,14 +157,10 @@ static void _serial_init_direct(serial_t *obj, const serial_pinmap_t *pinmap)
157157
MBED_ASSERT(obj_s->index >= 0);
158158

159159
// Configure UART pins
160-
if (pinmap->tx_pin != NC) {
161-
pin_function(pinmap->tx_pin, pinmap->tx_function);
162-
pin_mode(pinmap->tx_pin, PullUp);
163-
}
164-
if (pinmap->rx_pin != NC) {
165-
pin_function(pinmap->rx_pin, pinmap->rx_function);
166-
pin_mode(pinmap->rx_pin, PullUp);
167-
}
160+
pin_function(pinmap->tx_pin, pinmap->tx_function);
161+
pin_mode(pinmap->tx_pin, PullUp);
162+
pin_function(pinmap->rx_pin, pinmap->rx_function);
163+
pin_mode(pinmap->rx_pin, PullUp);
168164

169165
// Configure UART
170166
obj_s->baudrate = 9600; // baudrate default value
@@ -355,13 +351,9 @@ void serial_free(serial_t *obj)
355351
#endif /* DUAL_CORE */
356352

357353
// Configure GPIOs
358-
if (obj_s->pin_tx != NC) {
359-
pin_function(obj_s->pin_tx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
360-
}
354+
pin_function(obj_s->pin_tx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
361355

362-
if (obj_s->pin_rx != NC) {
363-
pin_function(obj_s->pin_rx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
364-
}
356+
pin_function(obj_s->pin_rx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
365357

366358
serial_irq_ids[obj_s->index] = 0;
367359
}

targets/TARGET_STM/stm_spi_api.c

Lines changed: 5 additions & 1 deletion
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);
@@ -218,8 +220,10 @@ static void _spi_init_direct(spi_t *obj, const spi_pinmap_t *pinmap)
218220
// Configure the SPI pins
219221
pin_function(pinmap->mosi_pin, pinmap->mosi_function);
220222
pin_mode(pinmap->mosi_pin, PullNone);
223+
221224
pin_function(pinmap->miso_pin, pinmap->miso_function);
222225
pin_mode(pinmap->miso_pin, PullNone);
226+
223227
pin_function(pinmap->sclk_pin, pinmap->sclk_function);
224228
pin_mode(pinmap->sclk_pin, PullNone);
225229
spiobj->pin_miso = pinmap->miso_pin;

0 commit comments

Comments
 (0)