From 35ade68bb3256fe2b3d1b25582e335593d30ffd0 Mon Sep 17 00:00:00 2001 From: jflyper Date: Mon, 21 Jan 2019 01:02:10 +0900 Subject: [PATCH 1/2] Discard excess/bogus data in DR --- src/main/drivers/bus_spi_stdperiph.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/drivers/bus_spi_stdperiph.c b/src/main/drivers/bus_spi_stdperiph.c index 5795c86f81..08ed3e3a22 100644 --- a/src/main/drivers/bus_spi_stdperiph.c +++ b/src/main/drivers/bus_spi_stdperiph.c @@ -113,6 +113,8 @@ uint8_t spiTransferByte(SPI_TypeDef *instance, uint8_t txByte) { uint16_t spiTimeout = 1000; + instance->DR; + while (SPI_I2S_GetFlagStatus(instance, SPI_I2S_FLAG_TXE) == RESET) if ((spiTimeout--) == 0) return spiTimeoutUserCallback(instance); From f96508ceec9b2b72f4d38b6d3c7f220a4ff8961e Mon Sep 17 00:00:00 2001 From: jflyper Date: Mon, 21 Jan 2019 04:59:21 +0900 Subject: [PATCH 2/2] Define and use DISCARD --- src/main/common/utils.h | 4 +++- src/main/drivers/bus_spi_stdperiph.c | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/common/utils.h b/src/main/common/utils.h index 076b4680f2..e11ac32e88 100644 --- a/src/main/common/utils.h +++ b/src/main/common/utils.h @@ -55,9 +55,11 @@ #define PP_CALL(macro, ...) macro(__VA_ARGS__) #if !defined(UNUSED) -#define UNUSED(x) (void)(x) +#define UNUSED(x) (void)(x) // Variables and parameters that are not used #endif +#define DISCARD(x) (void)(x) // To explicitly ignore result of x (usually an I/O register access). + #define STATIC_ASSERT(condition, name) _Static_assert((condition), #name) diff --git a/src/main/drivers/bus_spi_stdperiph.c b/src/main/drivers/bus_spi_stdperiph.c index 08ed3e3a22..76f636b16a 100644 --- a/src/main/drivers/bus_spi_stdperiph.c +++ b/src/main/drivers/bus_spi_stdperiph.c @@ -113,7 +113,7 @@ uint8_t spiTransferByte(SPI_TypeDef *instance, uint8_t txByte) { uint16_t spiTimeout = 1000; - instance->DR; + DISCARD(instance->DR); while (SPI_I2S_GetFlagStatus(instance, SPI_I2S_FLAG_TXE) == RESET) if ((spiTimeout--) == 0) @@ -154,7 +154,7 @@ bool spiTransfer(SPI_TypeDef *instance, const uint8_t *txData, uint8_t *rxData, uint16_t spiTimeout = 1000; uint8_t b; - instance->DR; + DISCARD(instance->DR); while (len--) { b = txData ? *(txData++) : 0xFF; while (SPI_I2S_GetFlagStatus(instance, SPI_I2S_FLAG_TXE) == RESET) {