From 53a8aeb6e7a89ad169ad3f9e5553d51fb86c03b8 Mon Sep 17 00:00:00 2001 From: Damien George Date: Wed, 3 Jun 2015 23:20:23 +0100 Subject: [PATCH] stmhal: Fix slow SPI DMA transfers by removing wfi from DMA wait loop. Addresses issue #1268. --- stmhal/spi.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/stmhal/spi.c b/stmhal/spi.c index da24b701fc..19c36d0a3b 100644 --- a/stmhal/spi.c +++ b/stmhal/spi.c @@ -290,12 +290,14 @@ void spi_deinit(SPI_HandleTypeDef *spi) { } STATIC HAL_StatusTypeDef spi_wait_dma_finished(SPI_HandleTypeDef *spi, uint32_t timeout) { + // Note: we can't use WFI to idle in this loop because the DMA completion + // interrupt may occur before the WFI. Hence we miss it and have to wait + // until the next sys-tick (up to 1ms). uint32_t start = HAL_GetTick(); while (HAL_SPI_GetState(spi) != HAL_SPI_STATE_READY) { if (HAL_GetTick() - start >= timeout) { return HAL_TIMEOUT; } - __WFI(); } return HAL_OK; }