diff --git a/src/shared/drivers/spi/SPIBus.h b/src/shared/drivers/spi/SPIBus.h
index 2578a3ae8242af53dd4f336313bf14ed6b69c6d6..a58b4b035cf9acfb2edb8d67f9b3d3972cd2c710 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)
             ;