[M487] Refine SPI PDMA code

pull/4608/head
ccli8 2017-03-08 17:03:48 +08:00
parent a76d55a555
commit 422871ab4d
1 changed files with 10 additions and 6 deletions

View File

@ -328,8 +328,10 @@ void spi_master_transfer(spi_t *obj, const void *tx, size_t tx_length, void *rx,
MBED_ASSERT(modinit != NULL); MBED_ASSERT(modinit != NULL);
MBED_ASSERT(modinit->modname == obj->spi.spi); MBED_ASSERT(modinit->modname == obj->spi.spi);
PDMA_T *pdma_base = dma_modbase();
// Configure tx DMA // Configure tx DMA
PDMA->CHCTL |= 1 << obj->spi.dma_chn_id_tx; // Enable this DMA channel pdma_base->CHCTL |= 1 << obj->spi.dma_chn_id_tx; // Enable this DMA channel
PDMA_SetTransferMode(obj->spi.dma_chn_id_tx, PDMA_SetTransferMode(obj->spi.dma_chn_id_tx,
((struct nu_spi_var *) modinit->var)->pdma_perp_tx, // Peripheral connected to this PDMA ((struct nu_spi_var *) modinit->var)->pdma_perp_tx, // Peripheral connected to this PDMA
0, // Scatter-gather disabled 0, // Scatter-gather disabled
@ -353,7 +355,7 @@ void spi_master_transfer(spi_t *obj, const void *tx, size_t tx_length, void *rx,
dma_set_handler(obj->spi.dma_chn_id_tx, (uint32_t) spi_dma_handler_tx, (uint32_t) obj, DMA_EVENT_ALL); dma_set_handler(obj->spi.dma_chn_id_tx, (uint32_t) spi_dma_handler_tx, (uint32_t) obj, DMA_EVENT_ALL);
// Configure rx DMA // Configure rx DMA
PDMA->CHCTL |= 1 << obj->spi.dma_chn_id_rx; // Enable this DMA channel pdma_base->CHCTL |= 1 << obj->spi.dma_chn_id_rx; // Enable this DMA channel
PDMA_SetTransferMode(obj->spi.dma_chn_id_rx, PDMA_SetTransferMode(obj->spi.dma_chn_id_rx,
((struct nu_spi_var *) modinit->var)->pdma_perp_rx, // Peripheral connected to this PDMA ((struct nu_spi_var *) modinit->var)->pdma_perp_rx, // Peripheral connected to this PDMA
0, // Scatter-gather disabled 0, // Scatter-gather disabled
@ -394,6 +396,7 @@ void spi_master_transfer(spi_t *obj, const void *tx, size_t tx_length, void *rx,
void spi_abort_asynch(spi_t *obj) void spi_abort_asynch(spi_t *obj)
{ {
SPI_T *spi_base = (SPI_T *) NU_MODBASE(obj->spi.spi); SPI_T *spi_base = (SPI_T *) NU_MODBASE(obj->spi.spi);
PDMA_T *pdma_base = dma_modbase();
if (obj->spi.dma_usage != DMA_USAGE_NEVER) { if (obj->spi.dma_usage != DMA_USAGE_NEVER) {
// Receive FIFO Overrun in case of tx length > rx length on DMA way // Receive FIFO Overrun in case of tx length > rx length on DMA way
@ -402,18 +405,18 @@ void spi_abort_asynch(spi_t *obj)
} }
if (obj->spi.dma_chn_id_tx != DMA_ERROR_OUT_OF_CHANNELS) { if (obj->spi.dma_chn_id_tx != DMA_ERROR_OUT_OF_CHANNELS) {
PDMA_DisableInt(obj->spi.dma_chn_id_tx, 0); PDMA_DisableInt(obj->spi.dma_chn_id_tx, PDMA_INT_TRANS_DONE);
// FIXME: On NUC472, next PDMA transfer will fail with PDMA_STOP() called. Cause is unknown. // FIXME: On NUC472, next PDMA transfer will fail with PDMA_STOP() called. Cause is unknown.
//PDMA_STOP(obj->spi.dma_chn_id_tx); //PDMA_STOP(obj->spi.dma_chn_id_tx);
PDMA->CHCTL &= ~(1 << obj->spi.dma_chn_id_tx); pdma_base->CHCTL &= ~(1 << obj->spi.dma_chn_id_tx);
} }
SPI_DISABLE_TX_PDMA(((SPI_T *) NU_MODBASE(obj->spi.spi))); SPI_DISABLE_TX_PDMA(((SPI_T *) NU_MODBASE(obj->spi.spi)));
if (obj->spi.dma_chn_id_rx != DMA_ERROR_OUT_OF_CHANNELS) { if (obj->spi.dma_chn_id_rx != DMA_ERROR_OUT_OF_CHANNELS) {
PDMA_DisableInt(obj->spi.dma_chn_id_rx, 0); PDMA_DisableInt(obj->spi.dma_chn_id_rx, PDMA_INT_TRANS_DONE);
// FIXME: On NUC472, next PDMA transfer will fail with PDMA_STOP() called. Cause is unknown. // FIXME: On NUC472, next PDMA transfer will fail with PDMA_STOP() called. Cause is unknown.
//PDMA_STOP(obj->spi.dma_chn_id_rx); //PDMA_STOP(obj->spi.dma_chn_id_rx);
PDMA->CHCTL &= ~(1 << obj->spi.dma_chn_id_rx); pdma_base->CHCTL &= ~(1 << obj->spi.dma_chn_id_rx);
} }
SPI_DISABLE_RX_PDMA(((SPI_T *) NU_MODBASE(obj->spi.spi))); SPI_DISABLE_RX_PDMA(((SPI_T *) NU_MODBASE(obj->spi.spi)));
} }
@ -786,6 +789,7 @@ static void spi_dma_handler_rx(uint32_t id, uint32_t event_dma)
/** Return FIFO depth of the SPI peripheral /** Return FIFO depth of the SPI peripheral
* *
* @details * @details
* M487
* SPI0 8 * SPI0 8
* SPI1/2/3/4 8 if data width <=16; 4 otherwise * SPI1/2/3/4 8 if data width <=16; 4 otherwise
*/ */