程序中对DMA配置如下:
dmaConfig.pingPongMode = CSL_DMA_PING_PONG_DISABLE; dmaConfig.autoMode = CSL_DMA_AUTORELOAD_ENABLE; //自动加载 dmaConfig.burstLen = CSL_DMA_TXBURST_1WORD; dmaConfig.trigger = CSL_DMA_SOFTWARE_TRIGGER;//软件触发DMA传输 dmaConfig.dmaEvt = CSL_DMA_EVT_NONE; dmaConfig.dmaInt = CSL_DMA_INTERRUPT_ENABLE; // 使能DMA中断 dmaConfig.chanDir = CSL_DMA_WRITE; // 方向为写,即发送 dmaConfig.trfType = CSL_DMA_TRANSFER_MEMORY; // 在内存之间传输 dmaConfig.dataLen = I2S_DMA_BUF_LEN*2; // 传输长度 dmaConfig.destAddr = (Uint32)dmaDstBuf; dmaConfig.srcAddr = (Uint32)dmaSrcBuf;
在调用一次DMA_start(dmaHandle)之后,产生了一次中断,完成I2S_DMA_BUF_LEN*2字节的数据dmaSrcBuf到dmaDstBuf的传输。
由于设置了dmaConfig.autoMode = CSL_DMA_AUTORELOAD_ENABLE,DMA会继续自动完成传输。
所以,当更新dmaSrcBuf中的数据时,dmaDstBuf也会被更新。
但是,传输完成后,并没有再次产生中断,为什么?
中断函数中,已经对DMAIFR寄存器的标志位进行了清零:
ifrValue = CSL_SYSCTRL_REGS->DMAIFR;
CSL_SYSCTRL_REGS->DMAIFR |= ifrValue;