Dear all,
as I had a hard time figuering the DMA out, i created a simple example, showing a simple copy example for the DMA with error checking maybe somebody will find this useful.
uint8_t source[]={0,1,2,3,4,5,6,7,8,9}; uint8_t dest[10]; void dma_idiotentest(void){ SIM->SCGC6|=SIM_SCGC6_DMAMUX0_MASK; SIM->SCGC7|=SIM_SCGC7_DMA_MASK; DMAMUX0->CHCFG[1]=0; //set to zero during configuration //Enable request signal for channel 1 DMA0->ERQ=DMA_ERQ_ERQ1_MASK; //Set memory address DMA0->TCD[1].SADDR=(uint32_t) &source; DMA0->TCD[1].DADDR=(uint32_t) &dest; //Offset for source and destination DMA0->TCD[1].SOFF=1; //We increment the address by one, after each cycle DMA0->TCD[1].DOFF=1; //Source and destination data transfer size DMA0->TCD[1].ATTR=DMA_ATTR_SSIZE(0)|DMA_ATTR_DSIZE(0); DMA0->TCD[1].NBYTES_MLNO=10; DMA0->TCD[1].CITER_ELINKNO=DMA_CITER_ELINKNO_CITER(1); DMA0->TCD[1].BITER_ELINKNO=DMA_BITER_ELINKNO_BITER(1); DMAMUX0->CHCFG[1]=DMAMUX_CHCFG_ENBL_MASK|DMAMUX_CHCFG_TRIG_MASK | DMAMUX_CHCFG_SOURCE(58); //always enabled DMA0->TCD[1].CSR=DMA_CSR_DREQ_MASK | DMA_CSR_START_MASK; if(DMA0->ES){ //Page 396 if(DMA0->ES & (1<<0)) { //Destination Bus error redLedOn(); } if(DMA0->ES & (1<<1)) { //Source Bus error redLedOn(); } if(DMA0->ES & (1<<2)) { //Scatter/Gather Configuration Error redLedOn(); } if(DMA0->ES & (1<<3)) { //NBYTES/CITER configuration Error redLedOn(); } if(DMA0->ES & (1<<4)) { //Destination Offset error redLedOn(); } if(DMA0->ES & (1<<5)) { //Destination Address Error redLedOn(); } if(DMA0->ES & (1<<6)) { //Source offset error redLedOn(); } if(DMA0->ES & (1<<7)) { //Source address error redLedOn(); } }else{ redLedOff(); } }
This example is based on the pretty old "Using the DMA module in Kinetis devices.