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>
This commit is contained in:
Kevin O'Connor 2022-02-09 13:07:32 -05:00
parent 1c594ef27a
commit 99d55185a2
1 changed files with 5 additions and 2 deletions

View File

@ -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)
;
}