mirror of https://github.com/ARMmbed/mbed-os.git
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()pull/8905/head
parent
86915d9a7e
commit
172ababc27
|
@ -170,16 +170,36 @@ static cy_en_sysclk_status_t spi_init_clock(spi_obj_t *obj, uint32_t frequency)
|
||||||
*/
|
*/
|
||||||
static void spi_init_pins(spi_obj_t *obj)
|
static void spi_init_pins(spi_obj_t *obj)
|
||||||
{
|
{
|
||||||
if (cy_reserve_io_pin(obj->pin_sclk) ||
|
bool conflict = false;
|
||||||
cy_reserve_io_pin(obj->pin_mosi) ||
|
conflict = cy_reserve_io_pin(obj->pin_sclk);
|
||||||
cy_reserve_io_pin(obj->pin_miso) ||
|
if (!conflict) {
|
||||||
cy_reserve_io_pin(obj->pin_ssel)) {
|
pin_function(obj->pin_sclk, pinmap_function(obj->pin_sclk, PinMap_SPI_SCLK));
|
||||||
|
}
|
||||||
|
if (obj->pin_mosi != NC) {
|
||||||
|
if (!cy_reserve_io_pin(obj->pin_mosi)) {
|
||||||
|
pin_function(obj->pin_mosi, pinmap_function(obj->pin_mosi, PinMap_SPI_MOSI));
|
||||||
|
} else {
|
||||||
|
conflict = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (obj->pin_miso != NC) {
|
||||||
|
if (!cy_reserve_io_pin(obj->pin_miso)) {
|
||||||
|
pin_function(obj->pin_miso, pinmap_function(obj->pin_miso, PinMap_SPI_MISO));
|
||||||
|
} else {
|
||||||
|
conflict = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (obj->pin_ssel != NC) {
|
||||||
|
if (!cy_reserve_io_pin(obj->pin_ssel)) {
|
||||||
|
pin_function(obj->pin_ssel, pinmap_function(obj->pin_ssel, PinMap_SPI_SSEL));
|
||||||
|
} else {
|
||||||
|
conflict = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (conflict) {
|
||||||
error("SPI pin reservation conflict.");
|
error("SPI pin reservation conflict.");
|
||||||
}
|
}
|
||||||
pin_function(obj->pin_sclk, pinmap_function(obj->pin_sclk, PinMap_SPI_SCLK));
|
|
||||||
pin_function(obj->pin_mosi, pinmap_function(obj->pin_mosi, PinMap_SPI_MOSI));
|
|
||||||
pin_function(obj->pin_miso, pinmap_function(obj->pin_miso, PinMap_SPI_MISO));
|
|
||||||
pin_function(obj->pin_ssel, pinmap_function(obj->pin_ssel, PinMap_SPI_SSEL));
|
|
||||||
// Pin configuration in PinMap defaults to Master mode; revert for Slave.
|
// Pin configuration in PinMap defaults to Master mode; revert for Slave.
|
||||||
if (obj->ms_mode == CY_SCB_SPI_SLAVE) {
|
if (obj->ms_mode == CY_SCB_SPI_SLAVE) {
|
||||||
pin_mode(obj->pin_sclk, PullNone);
|
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
|
||||||
}
|
}
|
||||||
#endif // DEVICE_SLEEP && DEVICE_LOWPOWERTIMER
|
#endif // DEVICE_SLEEP && DEVICE_LOWPOWERTIMER
|
||||||
} else {
|
} else {
|
||||||
error("Serial pinout mismatch. Requested pins Rx and Tx can't be used for the same Serial communication.");
|
error("SPI pinout mismatch. Requested Rx and Tx pins can't be used for the same SPI communication.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -367,9 +387,10 @@ int spi_master_block_write(spi_t *obj_in, const char *tx_buffer, int tx_length,
|
||||||
++rx_count;
|
++rx_count;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Read any ramaining bytes from the fifo.
|
// Read any remaining bytes from the fifo.
|
||||||
while (rx_count < rx_length) {
|
while (rx_count < rx_length) {
|
||||||
*rx_buffer++ = (char)Cy_SCB_SPI_Read(obj->base);
|
*rx_buffer++ = (char)Cy_SCB_SPI_Read(obj->base);
|
||||||
|
++rx_count;
|
||||||
}
|
}
|
||||||
// Clean up if we have read less bytes than available.
|
// Clean up if we have read less bytes than available.
|
||||||
Cy_SCB_SPI_ClearRxFifo(obj->base);
|
Cy_SCB_SPI_ClearRxFifo(obj->base);
|
||||||
|
|
Loading…
Reference in New Issue