I have been trying all morning ... no success !
The code looks like this:
void DMA_callback(void *param, dma_channel_status_t chanStatus)
{ OSA_SemaPost(&sema); }
// Init DMA module.
dma_state_t state;
memset(&state, 0, sizeof(dma_state_t));
DMA_DRV_Init(&state);
// Create semaphore to synchronize dma transaction
osa_status_t syncStatus;
OSA_SemaCreate(&sema, 0);
//p365, p??
//DMAMUX0_CHCFG1 = (DMAMUX0_CHCFG_SOURCE_PORTC | DMAMUX_CHCFG_ENBL);
DMAMUX0_CHCFG1|=0x33;
DMAMUX0_CHCFG1|=0x80;
PORTC_PCR9|=PORT_PCR_IRQC(0x02); //Interrupt on falling edge 0010 p205 0x02
uint32_t channel = 1;
uint32_t i;
// Fill zero to dest buffer
for (i = 0; i < BUFFER_SIZE ; i ++)
{ destAddr[i] = 0;
}
//Possibly overwrite the register; SEE fsl_dma_request.h
if (kDmaInvalidChannel == DMA_DRV_RequestChannel(channelID,kDmaRequestMux0PortC,channelstate))
{ PRINTF("\r\nCannot request channel for interrupt No. %d", channelID); DMA_DRV_Deinit();
}
debug_printf("\r\nRequested channel for PORTC ... "); //With/Without : does not change
//DMAMUX0_CHCFG1|=0x33; DMAMUX0_CHCFG1|=0x80;
//PORTC_PCR9|=PORT_PCR_IRQC(0x02);
if(kStatus_DMA_Success != DMA_DRV_ConfigTransfer(&dmatest_ChnState0, \
kDmaMemoryToMemory, \
TRANSFER_SIZE, \
(uint32_t)srcAddr, \
(uint32_t)destAddr, \
BUFFER_SIZE)){ debug_printf("\r\nERROR with DMA configuration"); }
// Add callback for dma handler
DMA_DRV_RegisterCallback(&dmatest_ChnState0, DMA_callback, NULL);
while(1) { PRINTF("\r\n Press to start transfer ..."); // Wait until transfer is complete
do
{ syncStatus = OSA_SemaWait(&sema, OSA_WAIT_FOREVER);
} while(syncStatus == kStatus_OSA_Idle);
for (i = 0; i < BUFFER_SIZE; i ++)
{ PRINTF(" %u", destAddr[i]); }
}
The same version for DMA memory to memory works. Basically, the difference is in requesting the DMA
(kDmaRequestMux0PortC) and I have tried adding the low-level lines as suggested by Mark (although in my
understanding PE should care for this).
I have the additional PE components Init_GPIO, Init_DMAMUX, fsl_dma in my project. Definitely something I am missing ...