@@ -170,16 +170,36 @@ static cy_en_sysclk_status_t spi_init_clock(spi_obj_t *obj, uint32_t frequency)
170170 */
171171static 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