From 99d55185a21703611b862f6ce4b80bba70a9c4b5 Mon Sep 17 00:00:00 2001 From: Kevin O'Connor Date: Wed, 9 Feb 2022 13:07:32 -0500 Subject: [PATCH] stm32: Wait for transmission to complete before returning from spi_transfer() It's possible for the SCLK pin to still be updating even after the last byte of data has been read from the receive pin. (In particular in spi mode 0 and 1.) Exiting early from spi_transfer() in this case could result in the CS pin being raised before the final updates to SCLK pin. Add an additional wait at the end of spi_transfer() to avoid this issue. Signed-off-by: Kevin O'Connor --- src/stm32/spi.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/stm32/spi.c b/src/stm32/spi.c index b78196d86..f1ba33cf2 100644 --- a/src/stm32/spi.c +++ b/src/stm32/spi.c @@ -109,12 +109,15 @@ spi_transfer(struct spi_config config, uint8_t receive_data, { SPI_TypeDef *spi = config.spi; while (len--) { - writeb((void *)&spi->DR, *data); + writeb((void*)&spi->DR, *data); while (!(spi->SR & SPI_SR_RXNE)) ; - uint8_t rdata = readb((void *)&spi->DR); + uint8_t rdata = readb((void*)&spi->DR); if (receive_data) *data = rdata; data++; } + // Wait for any remaining SCLK updates before returning + while ((spi->SR & (SPI_SR_TXE|SPI_SR_BSY)) != SPI_SR_TXE) + ; }