@@ -170,16 +170,36 @@ static cy_en_sysclk_status_t spi_init_clock(spi_obj_t *obj, uint32_t frequency)
170
170
*/
171
171
static void spi_init_pins (spi_obj_t * obj )
172
172
{
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 ) {
177
200
error ("SPI pin reservation conflict." );
178
201
}
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
+
183
203
// Pin configuration in PinMap defaults to Master mode; revert for Slave.
184
204
if (obj -> ms_mode == CY_SCB_SPI_SLAVE ) {
185
205
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
276
296
}
277
297
#endif // DEVICE_SLEEP && DEVICE_LOWPOWERTIMER
278
298
} 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." );
280
300
}
281
301
}
282
302
@@ -367,9 +387,10 @@ int spi_master_block_write(spi_t *obj_in, const char *tx_buffer, int tx_length,
367
387
++ rx_count ;
368
388
}
369
389
}
370
- // Read any ramaining bytes from the fifo.
390
+ // Read any remaining bytes from the fifo.
371
391
while (rx_count < rx_length ) {
372
392
* rx_buffer ++ = (char )Cy_SCB_SPI_Read (obj -> base );
393
+ ++ rx_count ;
373
394
}
374
395
// Clean up if we have read less bytes than available.
375
396
Cy_SCB_SPI_ClearRxFifo (obj -> base );
0 commit comments