aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/rp2040/spi.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/rp2040/spi.c b/src/rp2040/spi.c
index 57231966..a92a0358 100644
--- a/src/rp2040/spi.c
+++ b/src/rp2040/spi.c
@@ -132,11 +132,15 @@ void
spi_transfer(struct spi_config config, uint8_t receive_data,
uint8_t len, uint8_t *data)
{
+ uint8_t* wptr = data;
+ uint8_t* end = data + len;
spi_hw_t *spi = config.spi;
- while (len--) {
- spi->dr = *data;
- while (!(spi->sr & SPI_SSPSR_RNE_BITS))
- ;
+ while (data < end) {
+ uint32_t sr = spi->sr & (SPI_SSPSR_TNF_BITS | SPI_SSPSR_RNE_BITS);
+ if ((sr == SPI_SSPSR_TNF_BITS) && wptr < end)
+ spi->dr = *wptr++;
+ if (!(sr & SPI_SSPSR_RNE_BITS))
+ continue;
uint8_t rdata = spi->dr;
if(receive_data)
*data = rdata;