aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal/ports/STM32/LLD/SPIv2/spi_lld.c
diff options
context:
space:
mode:
Diffstat (limited to 'os/hal/ports/STM32/LLD/SPIv2/spi_lld.c')
-rw-r--r--os/hal/ports/STM32/LLD/SPIv2/spi_lld.c35
1 files changed, 24 insertions, 11 deletions
diff --git a/os/hal/ports/STM32/LLD/SPIv2/spi_lld.c b/os/hal/ports/STM32/LLD/SPIv2/spi_lld.c
index d7e766359..608c568be 100644
--- a/os/hal/ports/STM32/LLD/SPIv2/spi_lld.c
+++ b/os/hal/ports/STM32/LLD/SPIv2/spi_lld.c
@@ -117,6 +117,7 @@ SPIDriver SPID6;
/*===========================================================================*/
static const uint16_t dummytx = 0xFFFFU;
+static uint16_t dummyrx;
/*===========================================================================*/
/* Driver local functions. */
@@ -145,11 +146,12 @@ static void spi_lld_serve_rx_interrupt(SPIDriver *spip, uint32_t flags) {
#if STM32_SPI_USE_BIDIMODE
spip->spi->CR1 |= SPI_CR1_BIDIOE;
-#endif
- /* Errors reset sequence.*/
+ /* Errors reset sequence. It is required becaue BIDIOE could cause extra
+ clock pulses after DMA stopped reading.*/
(void)spip->spi->DR;
(void)spip->spi->SR;
+#endif
/* Portable SPI ISR code defined in the high level driver, note, it is
a macro.*/
@@ -532,12 +534,18 @@ void spi_lld_ignore(SPIDriver *spip, size_t n) {
if ((spip->spi->CR1 & SPI_CR1_BIDIMODE) != 0) {
osalDbgAssert((spip->spi->CR1 & SPI_CR1_BIDIOE) != 0,
"BIDIOE not set");
+ }
#endif
+ dmaStreamSetMemory0(spip->dmarx, &dummyrx);
+ dmaStreamSetTransactionSize(spip->dmarx, n);
+ dmaStreamSetMode(spip->dmarx, spip->rxdmamode);
+
dmaStreamSetMemory0(spip->dmatx, &dummytx);
dmaStreamSetTransactionSize(spip->dmatx, n);
dmaStreamSetMode(spip->dmatx, spip->txdmamode);
+ dmaStreamEnable(spip->dmarx);
dmaStreamEnable(spip->dmatx);
}
@@ -595,13 +603,19 @@ void spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf) {
if ((spip->spi->CR1 & SPI_CR1_BIDIMODE) != 0) {
osalDbgAssert((spip->spi->CR1 & SPI_CR1_BIDIOE) != 0,
"BIDIOE not set");
+ }
#endif
- dmaStreamSetMemory0(spip->dmatx, txbuf);
- dmaStreamSetTransactionSize(spip->dmatx, n);
- dmaStreamSetMode(spip->dmatx, spip->txdmamode | STM32_DMA_CR_MINC);
+ dmaStreamSetMemory0(spip->dmarx, &dummyrx);
+ dmaStreamSetTransactionSize(spip->dmarx, n);
+ dmaStreamSetMode(spip->dmarx, spip->rxdmamode);
- dmaStreamEnable(spip->dmatx);
+ dmaStreamSetMemory0(spip->dmatx, txbuf);
+ dmaStreamSetTransactionSize(spip->dmatx, n);
+ dmaStreamSetMode(spip->dmatx, spip->txdmamode | STM32_DMA_CR_MINC);
+
+ dmaStreamEnable(spip->dmarx);
+ dmaStreamEnable(spip->dmatx);
}
/**
@@ -620,10 +634,11 @@ void spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf) {
void spi_lld_receive(SPIDriver *spip, size_t n, void *rxbuf) {
#if STM32_SPI_USE_BIDIMODE
- osalDbgAssert((spip->spi->CR1 & SPI_CR1_BIDIOE) != 0,
- "BIDIOE not set");
-
if ((spip->spi->CR1 & SPI_CR1_BIDIMODE) != 0) {
+
+ osalDbgAssert((spip->spi->CR1 & SPI_CR1_BIDIOE) != 0,
+ "BIDIOE not set");
+
dmaStreamSetMemory0(spip->dmarx, rxbuf);
dmaStreamSetTransactionSize(spip->dmarx, n);
dmaStreamSetMode(spip->dmarx, spip->rxdmamode | STM32_DMA_CR_MINC);
@@ -667,8 +682,6 @@ uint16_t spi_lld_polled_exchange(SPIDriver *spip, uint16_t frame) {
#if STM32_SPI_USE_BIDIMODE
osalDbgAssert((spip->spi->CR1 & SPI_CR1_BIDIMODE) == 0,
"spiPolledExchange() not possible with BIDIMODE");
- osalDbgAssert((spip->spi->CR1 & SPI_CR1_BIDIOE) != 0,
- "BIDIOE not set");
#endif
/*