diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2022-02-09 13:07:32 -0500 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2022-02-10 17:27:55 -0500 |
commit | 99d55185a21703611b862f6ce4b80bba70a9c4b5 (patch) | |
tree | 2159421ee428817056729fa086c3ed8abf9e6f62 /src/stm32/spi.c | |
parent | 1c594ef27a252a844c22cdbeffc839292155134a (diff) | |
download | kutter-99d55185a21703611b862f6ce4b80bba70a9c4b5.tar.gz kutter-99d55185a21703611b862f6ce4b80bba70a9c4b5.tar.xz kutter-99d55185a21703611b862f6ce4b80bba70a9c4b5.zip |
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 <kevin@koconnor.net>
Diffstat (limited to 'src/stm32/spi.c')
-rw-r--r-- | src/stm32/spi.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/src/stm32/spi.c b/src/stm32/spi.c index b78196d8..f1ba33cf 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) + ; } |