SPI send double buffered, so the DMA completes one byte too early. Use
the recv DMA to know when the SPI transfer is complete.
Signed-off-by: Keith Packard <keithp@keithp.com>
void
ao_spi_send_bus(void __xdata *block, uint16_t len) __reentrant
{
void
ao_spi_send_bus(void __xdata *block, uint16_t len) __reentrant
{
ao_dma_set_transfer(ao_spi_dma_in_id,
&SPI_BUF,
&ao_spi_const,
ao_dma_set_transfer(ao_spi_dma_in_id,
&SPI_BUF,
&ao_spi_const,
DMA_CFG1_SRCINC_0 |
DMA_CFG1_DESTINC_0 |
DMA_CFG1_PRIORITY_NORMAL);
DMA_CFG1_SRCINC_0 |
DMA_CFG1_DESTINC_0 |
DMA_CFG1_PRIORITY_NORMAL);
ao_dma_set_transfer(ao_spi_dma_out_id,
block,
&SPI_BUF,
ao_dma_set_transfer(ao_spi_dma_out_id,
block,
&SPI_BUF,
DMA_CFG1_DESTINC_0 |
DMA_CFG1_PRIORITY_NORMAL);
DMA_CFG1_DESTINC_0 |
DMA_CFG1_PRIORITY_NORMAL);
ao_dma_start(ao_spi_dma_in_id);
ao_dma_start(ao_spi_dma_in_id);
ao_dma_start(ao_spi_dma_out_id);
ao_dma_trigger(ao_spi_dma_out_id);
#if !AO_SPI_SLAVE
ao_dma_start(ao_spi_dma_out_id);
ao_dma_trigger(ao_spi_dma_out_id);
#if !AO_SPI_SLAVE
void
ao_spi_send_wait(void)
{
void
ao_spi_send_wait(void)
{
- __critical while (!ao_spi_dma_out_done)
- ao_sleep(&ao_spi_dma_out_done);
+ __critical while (!ao_spi_dma_in_done)
+ ao_sleep(&ao_spi_dma_in_done);