diff --git a/src/omv/common/omv_spi.h b/src/omv/common/omv_spi.h index a17ccf378..edb38287b 100644 --- a/src/omv/common/omv_spi.h +++ b/src/omv/common/omv_spi.h @@ -22,6 +22,7 @@ typedef enum { OMV_SPI_XFER_NONBLOCK = (1 << 2), OMV_SPI_XFER_CIRCULAR = (1 << 3), OMV_SPI_XFER_FAILED = (1 << 4), + OMV_SPI_XFER_COMPLETE = (1 << 5), } omv_spi_xfer_flags_t; typedef struct _omv_spi_config { @@ -61,7 +62,7 @@ typedef struct _omv_spi { void *userdata; omv_spi_callback_t callback; uint32_t xfer_error; - omv_spi_xfer_flags_t xfer_flags; + volatile omv_spi_xfer_flags_t xfer_flags; #ifdef OMV_SPI_PORT_BITS // Additional port-specific fields like device base pointer, // dma handles, more I/Os etc... are included directly here, diff --git a/src/omv/ports/stm32/omv_spi.c b/src/omv/ports/stm32/omv_spi.c index cef084d68..9efa0f97c 100644 --- a/src/omv/ports/stm32/omv_spi.c +++ b/src/omv/ports/stm32/omv_spi.c @@ -178,24 +178,34 @@ int omv_spi_transfer_start(omv_spi_t *spi, omv_spi_transfer_t *xfer) if (spi->xfer_flags & OMV_SPI_XFER_BLOCKING) { if (xfer->txbuf && xfer->rxbuf) { - if (HAL_SPI_TransmitReceive(spi->descr, - xfer->rxbuf, xfer->rxbuf, xfer->size, xfer->timeout) != HAL_OK) { + if (HAL_SPI_TransmitReceive(spi->descr, xfer->txbuf, + xfer->rxbuf, xfer->size, xfer->timeout) != HAL_OK) { return -1; } } else if (xfer->txbuf) { - if (HAL_SPI_Transmit(spi->descr, - xfer->txbuf, xfer->size, xfer->timeout) != HAL_OK) { + if (HAL_SPI_Transmit(spi->descr, xfer->txbuf, xfer->size, xfer->timeout) != HAL_OK) { return -1; } } else if (xfer->rxbuf) { - if (HAL_SPI_Receive(spi->descr, - xfer->rxbuf, xfer->size, xfer->timeout) != HAL_OK) { + if (HAL_SPI_Receive(spi->descr, xfer->rxbuf, xfer->size, xfer->timeout) != HAL_OK) { return -1; } } } else if (spi->xfer_flags & OMV_SPI_XFER_DMA) { - //HAL_NVIC_EnableIRQ(ISC_SPI_DMA_IRQn); - HAL_SPI_Receive_DMA(spi->descr, xfer->rxbuf, xfer->size); + if (xfer->txbuf && xfer->rxbuf) { + if (HAL_SPI_TransmitReceive_DMA(spi->descr, xfer->txbuf, + xfer->rxbuf, xfer->size) != HAL_OK) { + return -1; + } + } else if (xfer->txbuf) { + if (HAL_SPI_Transmit_DMA(spi->descr, xfer->txbuf, xfer->size) != HAL_OK) { + return -1; + } + } else if (xfer->rxbuf) { + if (HAL_SPI_Receive_DMA(spi->descr, xfer->rxbuf, xfer->size) != HAL_OK) { + return -1; + } + } } else { return -1; }