diff --git a/src/shared/drivers/spi/SPIBus.h b/src/shared/drivers/spi/SPIBus.h index 5e93f58c79e4f3b022ff29434d755f95f432077d..73914c9cabf850e95c7bf963c34ee8303fe01481 100644 --- a/src/shared/drivers/spi/SPIBus.h +++ b/src/shared/drivers/spi/SPIBus.h @@ -505,6 +505,12 @@ inline void SPIBus::read16(uint16_t* data, size_t nBytes) // Write the data item to transmit spi->DR = 0; + // Make sure transmission is complete + while ((spi->SR & SPI_SR_TXE) == 0) + ; + while ((spi->SR & SPI_SR_BSY) > 0) + ; + // Wait until data is received while ((spi->SR & SPI_SR_RXNE) == 0) ; @@ -548,6 +554,12 @@ inline void SPIBus::write16(const uint16_t* data, size_t nBytes) // Write the data item to transmit spi->DR = static_cast<uint16_t>(data[i]); + // Make sure transmission is complete + while ((spi->SR & SPI_SR_TXE) == 0) + ; + while ((spi->SR & SPI_SR_BSY) > 0) + ; + // Wait until data is received while ((spi->SR & SPI_SR_RXNE) == 0) ; @@ -572,6 +584,12 @@ inline uint8_t SPIBus::transfer(uint8_t data) // Write the data item to transmit *(volatile uint8_t*)&spi->DR = static_cast<uint8_t>(data); + // Make sure transmission is complete + while ((spi->SR & SPI_SR_TXE) == 0) + ; + while ((spi->SR & SPI_SR_BSY) > 0) + ; + // Wait until data is received while ((spi->SR & SPI_SR_RXNE) == 0) ; @@ -595,6 +613,12 @@ inline uint16_t SPIBus::transfer16(uint16_t data) // Write the data item to transmit spi->DR = static_cast<uint16_t>(data); + // Make sure transmission is complete + while ((spi->SR & SPI_SR_TXE) == 0) + ; + while ((spi->SR & SPI_SR_BSY) > 0) + ; + // Wait until data is received while ((spi->SR & SPI_SR_RXNE) == 0) ; @@ -647,6 +671,12 @@ inline void SPIBus::transfer16(uint16_t* data, size_t nBytes) // Write the data item to transmit spi->DR = static_cast<uint16_t>(data[i]); + // Make sure transmission is complete + while ((spi->SR & SPI_SR_TXE) == 0) + ; + while ((spi->SR & SPI_SR_BSY) > 0) + ; + // Wait until data is received while ((spi->SR & SPI_SR_RXNE) == 0) ;