ports/stm32: Fix SPI HAL DMA/blocking transfers.

This commit is contained in:
iabdalkader 2023-06-24 20:43:31 +02:00
parent 13b0ad50d4
commit b27aed8138
2 changed files with 20 additions and 9 deletions

View File

@ -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,

View File

@ -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;
}