From 538bd52ee995884635cbad5f99ca0807e1be65cb Mon Sep 17 00:00:00 2001
From: Emilio Corigliano <emilio.corigliano@skywarder.eu>
Date: Wed, 21 Jun 2023 19:24:55 +0200
Subject: [PATCH] [SPI] Fixed transmission at low baudrates for the f7 spi
busses on APB1
---
src/shared/drivers/spi/SPIBus.h | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/src/shared/drivers/spi/SPIBus.h b/src/shared/drivers/spi/SPIBus.h
index 5e93f58c7..73914c9ca 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)
;
--
GitLab