aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2022-02-09 13:07:32 -0500
committerKevin O'Connor <kevin@koconnor.net>2022-02-10 17:27:55 -0500
commit99d55185a21703611b862f6ce4b80bba70a9c4b5 (patch)
tree2159421ee428817056729fa086c3ed8abf9e6f62 /src
parent1c594ef27a252a844c22cdbeffc839292155134a (diff)
downloadkutter-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')
-rw-r--r--src/stm32/spi.c7
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)
+ ;
}