Hi,
I noticed that I'd occasionally hit an error when calling into nrf_drv_spi_transfer
using the SPIM driver (SPI0_USE_EASY_DMA set). nrf_drv_spi_transfer
was returning NRF_ERROR_BUSY
:
if (p_cb->transfer_in_progress)
{
return NRF_ERROR_BUSY;
}
The problem turned out to be a race condition, where transfer_in_progress
was set after the SPIM module was started; thus, occasionally it would complete the SPI transaction (and clear transfer_in_progress
and call the callback) before the transfer_in_progress
flag was set. Thus, transfer_in_progress
was essentially getting set when the transaction was complete, thus preventing further transactions from occurring.
I could reproduce this issue very easily by setting the compiler optimization to -O0
. It would occasionally happen with -O3
.
Attached is a patch which I believe fixes the issue - it sets the flag before initiating the transfer.
If you could, please confirm this is the correct patch - thanks! diff.txt