From e39c44e5e485a670315f877a1eddf025097e6f23 Mon Sep 17 00:00:00 2001 From: Luca Erbetta <luca.erbetta105@gmail.com> Date: Tue, 30 May 2023 18:54:56 +0200 Subject: [PATCH] [SPI] Fix bug on stm32f7 where 16 bits would be transferred instead of 8 --- src/shared/drivers/spi/SPIBus.h | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/shared/drivers/spi/SPIBus.h b/src/shared/drivers/spi/SPIBus.h index 2578a3ae8..a58b4b035 100644 --- a/src/shared/drivers/spi/SPIBus.h +++ b/src/shared/drivers/spi/SPIBus.h @@ -501,6 +501,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) ; @@ -541,6 +547,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) ; @@ -560,7 +572,13 @@ inline uint8_t SPIBus::transfer(uint8_t data) ; // Write the data item to transmit - spi->DR = static_cast<uint8_t>(data); + *(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) @@ -582,6 +600,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) ; @@ -629,6 +653,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) ; -- GitLab