mirror of
https://github.com/openmv/openmv.git
synced 2025-09-26 23:09:13 +08:00
Merge pull request #2862 from openmv/fix_alif_spi_
ports/alif: Poll events in spi_transfer.
This commit is contained in:
commit
d1a422174d
@ -93,19 +93,19 @@ int omv_spi_transfer_start(omv_spi_t *spi, omv_spi_transfer_t *xfer) {
|
|||||||
if (xfer->flags & OMV_SPI_XFER_BLOCKING) {
|
if (xfer->flags & OMV_SPI_XFER_BLOCKING) {
|
||||||
volatile uint32_t *dr = spi->inst->SPI_DR;
|
volatile uint32_t *dr = spi->inst->SPI_DR;
|
||||||
spi_set_tmod(spi->inst, SPI_TMOD_TX_AND_RX);
|
spi_set_tmod(spi->inst, SPI_TMOD_TX_AND_RX);
|
||||||
|
|
||||||
size_t tx_sent = 0;
|
size_t tx_sent = 0;
|
||||||
size_t rx_received = 0;
|
size_t rx_received = 0;
|
||||||
|
|
||||||
// FIFO depth is 16 words
|
// FIFO depth is 16 words
|
||||||
const size_t rx_threshold = (SPI_RX_FIFO_DEPTH - 1);
|
const size_t rx_threshold = (SPI_RX_FIFO_DEPTH - 1);
|
||||||
|
|
||||||
while (rx_received < xfer->size) {
|
while (rx_received < xfer->size) {
|
||||||
// Fill TX FIFO as much as possible without causing RX overflow
|
// Fill TX FIFO as much as possible without causing RX overflow
|
||||||
while (tx_sent < xfer->size &&
|
while (tx_sent < xfer->size &&
|
||||||
(tx_sent - rx_received) < rx_threshold &&
|
(tx_sent - rx_received) < rx_threshold &&
|
||||||
(spi->inst->SPI_SR & SPI_SR_TFNF)) {
|
(spi->inst->SPI_SR & SPI_SR_TFNF)) {
|
||||||
|
|
||||||
// Send data
|
// Send data
|
||||||
if (xfer->txbuf == NULL) {
|
if (xfer->txbuf == NULL) {
|
||||||
*dr = 0xFFFFFFFFU;
|
*dr = 0xFFFFFFFFU;
|
||||||
@ -118,11 +118,11 @@ int omv_spi_transfer_start(omv_spi_t *spi, omv_spi_transfer_t *xfer) {
|
|||||||
}
|
}
|
||||||
tx_sent++;
|
tx_sent++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Receive available data
|
// Receive available data
|
||||||
while (rx_received < tx_sent &&
|
while (rx_received < tx_sent &&
|
||||||
(spi->inst->SPI_SR & SPI_SR_RFNE)) {
|
(spi->inst->SPI_SR & SPI_SR_RFNE)) {
|
||||||
|
|
||||||
if (xfer->rxbuf == NULL) {
|
if (xfer->rxbuf == NULL) {
|
||||||
(void) *dr;
|
(void) *dr;
|
||||||
} else if (spi->datasize > 16) {
|
} else if (spi->datasize > 16) {
|
||||||
@ -134,7 +134,7 @@ int omv_spi_transfer_start(omv_spi_t *spi, omv_spi_transfer_t *xfer) {
|
|||||||
}
|
}
|
||||||
rx_received++;
|
rx_received++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we're not making progress, use blocking wait
|
// If we're not making progress, use blocking wait
|
||||||
if (tx_sent < xfer->size && (tx_sent - rx_received) >= rx_threshold) {
|
if (tx_sent < xfer->size && (tx_sent - rx_received) >= rx_threshold) {
|
||||||
// Wait for RX data to free up space
|
// Wait for RX data to free up space
|
||||||
@ -152,8 +152,11 @@ int omv_spi_transfer_start(omv_spi_t *spi, omv_spi_transfer_t *xfer) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Handle pending events
|
||||||
|
mp_event_handle_nowait();
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
|
Loading…
Reference in New Issue
Block a user