Skip to content

Commit 172abab

Browse files
committed
FUTURE_SEQUANA SPI fixes:
- fix to allow using only a subset of pins for SPI communication - added missing conter increment in spi_master_block_write()
1 parent 86915d9 commit 172abab

File tree

1 file changed

+31
-10
lines changed

1 file changed

+31
-10
lines changed

targets/TARGET_Cypress/TARGET_PSOC6/spi_api.c

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -170,16 +170,36 @@ static cy_en_sysclk_status_t spi_init_clock(spi_obj_t *obj, uint32_t frequency)
170170
*/
171171
static void spi_init_pins(spi_obj_t *obj)
172172
{
173-
if (cy_reserve_io_pin(obj->pin_sclk) ||
174-
cy_reserve_io_pin(obj->pin_mosi) ||
175-
cy_reserve_io_pin(obj->pin_miso) ||
176-
cy_reserve_io_pin(obj->pin_ssel)) {
173+
bool conflict = false;
174+
conflict = cy_reserve_io_pin(obj->pin_sclk);
175+
if (!conflict) {
176+
pin_function(obj->pin_sclk, pinmap_function(obj->pin_sclk, PinMap_SPI_SCLK));
177+
}
178+
if (obj->pin_mosi != NC) {
179+
if (!cy_reserve_io_pin(obj->pin_mosi)) {
180+
pin_function(obj->pin_mosi, pinmap_function(obj->pin_mosi, PinMap_SPI_MOSI));
181+
} else {
182+
conflict = true;
183+
}
184+
}
185+
if (obj->pin_miso != NC) {
186+
if (!cy_reserve_io_pin(obj->pin_miso)) {
187+
pin_function(obj->pin_miso, pinmap_function(obj->pin_miso, PinMap_SPI_MISO));
188+
} else {
189+
conflict = true;
190+
}
191+
}
192+
if (obj->pin_ssel != NC) {
193+
if (!cy_reserve_io_pin(obj->pin_ssel)) {
194+
pin_function(obj->pin_ssel, pinmap_function(obj->pin_ssel, PinMap_SPI_SSEL));
195+
} else {
196+
conflict = true;
197+
}
198+
}
199+
if (conflict) {
177200
error("SPI pin reservation conflict.");
178201
}
179-
pin_function(obj->pin_sclk, pinmap_function(obj->pin_sclk, PinMap_SPI_SCLK));
180-
pin_function(obj->pin_mosi, pinmap_function(obj->pin_mosi, PinMap_SPI_MOSI));
181-
pin_function(obj->pin_miso, pinmap_function(obj->pin_miso, PinMap_SPI_MISO));
182-
pin_function(obj->pin_ssel, pinmap_function(obj->pin_ssel, PinMap_SPI_SSEL));
202+
183203
// Pin configuration in PinMap defaults to Master mode; revert for Slave.
184204
if (obj->ms_mode == CY_SCB_SPI_SLAVE) {
185205
pin_mode(obj->pin_sclk, PullNone);
@@ -276,7 +296,7 @@ void spi_init(spi_t *obj_in, PinName mosi, PinName miso, PinName sclk, PinName s
276296
}
277297
#endif // DEVICE_SLEEP && DEVICE_LOWPOWERTIMER
278298
} else {
279-
error("Serial pinout mismatch. Requested pins Rx and Tx can't be used for the same Serial communication.");
299+
error("SPI pinout mismatch. Requested Rx and Tx pins can't be used for the same SPI communication.");
280300
}
281301
}
282302

@@ -367,9 +387,10 @@ int spi_master_block_write(spi_t *obj_in, const char *tx_buffer, int tx_length,
367387
++rx_count;
368388
}
369389
}
370-
// Read any ramaining bytes from the fifo.
390+
// Read any remaining bytes from the fifo.
371391
while (rx_count < rx_length) {
372392
*rx_buffer++ = (char)Cy_SCB_SPI_Read(obj->base);
393+
++rx_count;
373394
}
374395
// Clean up if we have read less bytes than available.
375396
Cy_SCB_SPI_ClearRxFifo(obj->base);

0 commit comments

Comments
 (0)