Skip to content
Snippets Groups Projects
Commit e39c44e5 authored by Luca Erbetta's avatar Luca Erbetta :rocket: Committed by Alberto Nidasio
Browse files

[SPI] Fix bug on stm32f7 where 16 bits would be transferred instead of 8

parent 2a94a873
No related branches found
No related tags found
No related merge requests found
...@@ -501,6 +501,12 @@ inline void SPIBus::read16(uint16_t* data, size_t nBytes) ...@@ -501,6 +501,12 @@ inline void SPIBus::read16(uint16_t* data, size_t nBytes)
// Write the data item to transmit // Write the data item to transmit
spi->DR = 0; 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 // Wait until data is received
while ((spi->SR & SPI_SR_RXNE) == 0) while ((spi->SR & SPI_SR_RXNE) == 0)
; ;
...@@ -541,6 +547,12 @@ inline void SPIBus::write16(const uint16_t* data, size_t nBytes) ...@@ -541,6 +547,12 @@ inline void SPIBus::write16(const uint16_t* data, size_t nBytes)
// Write the data item to transmit // Write the data item to transmit
spi->DR = static_cast<uint16_t>(data[i]); 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 // Wait until data is received
while ((spi->SR & SPI_SR_RXNE) == 0) while ((spi->SR & SPI_SR_RXNE) == 0)
; ;
...@@ -560,7 +572,13 @@ inline uint8_t SPIBus::transfer(uint8_t data) ...@@ -560,7 +572,13 @@ inline uint8_t SPIBus::transfer(uint8_t data)
; ;
// Write the data item to transmit // 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 // Wait until data is received
while ((spi->SR & SPI_SR_RXNE) == 0) while ((spi->SR & SPI_SR_RXNE) == 0)
...@@ -582,6 +600,12 @@ inline uint16_t SPIBus::transfer16(uint16_t data) ...@@ -582,6 +600,12 @@ inline uint16_t SPIBus::transfer16(uint16_t data)
// Write the data item to transmit // Write the data item to transmit
spi->DR = static_cast<uint16_t>(data); 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 // Wait until data is received
while ((spi->SR & SPI_SR_RXNE) == 0) while ((spi->SR & SPI_SR_RXNE) == 0)
; ;
...@@ -629,6 +653,12 @@ inline void SPIBus::transfer16(uint16_t* data, size_t nBytes) ...@@ -629,6 +653,12 @@ inline void SPIBus::transfer16(uint16_t* data, size_t nBytes)
// Write the data item to transmit // Write the data item to transmit
spi->DR = static_cast<uint16_t>(data[i]); 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 // Wait until data is received
while ((spi->SR & SPI_SR_RXNE) == 0) while ((spi->SR & SPI_SR_RXNE) == 0)
; ;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment