diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/stm32/spi.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/src/stm32/spi.c b/src/stm32/spi.c index 376e11d0..f3d83e83 100644 --- a/src/stm32/spi.c +++ b/src/stm32/spi.c @@ -84,10 +84,14 @@ spi_transfer(struct spi_config config, uint8_t receive_data, uint8_t len, uint8_t *data) { SPI_TypeDef *spi = config.spi; - while (len--) { - writeb((void *)&spi->DR, *data); - while (!(spi->SR & SPI_SR_RXNE)) - ; + uint8_t *wptr = data; + uint8_t *end = data + len; + + while (data < end) { + if (spi->SR & SPI_SR_TXE && wptr < end) + writeb((void *)&spi->DR, *wptr++); + if (!(spi->SR & SPI_SR_RXNE)) + continue; uint8_t rdata = readb((void *)&spi->DR); if (receive_data) *data = rdata; |