This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
当前功能是EDMA3对McASP设备进行数据搬运,用2个edma channel进行数据传输并且使用chain方式传输。每个channel都配置为(ACNT=8,BCNT=2,CCNT=1,ASYNC),linkAddr都指向对方的PaRAM地址。测试结果是两个edma channel都能够正确进行一次EDMA事件(搬运16个字节),但无法进行chain的交替使用,请问我的配置问题出在哪里呢?
具体代码如下: 1. channel 申请 ,PaRAM配置
edma_mcasp_chn1 = edma_alloc_channel(EDMA3_CHA_MCASP0_RX,mcasp_callback_rxedma,NULL,EVENTQ_0); if (edma_mcasp_chn1 < 0) { DMA_PRINTK(", error:%d", edma_mcasp_chn1); goto error_alloc_channel; }
edma_mcasp_chn2 = edma_alloc_channel(-1,mcasp_callback_rxedma,NULL,EVENTQ_0);
if (edma_mcasp_chn1 < 0) { DMA_PRINTK(", error:%d", edma_mcasp_chn2); goto error_alloc_channel1; }
// two channel chained configuration.
edma_set_src (edma_mcasp_chn1, (unsigned long)(AM335X_MCASP0_Data), INCR, W8BIT);
edma_set_dest (edma_mcasp_chn1, (unsigned long)(mcaspadc_dev->r_dma_Iping), INCR, W8BIT);
edma_set_src_index (edma_mcasp_chn1, iacnt, iacnt);
edma_set_dest_index (edma_mcasp_chn1, iacnt, iacnt); /* A Sync Transfer Mode */
edma_set_transfer_params (edma_mcasp_chn1, iacnt, 1, 1, 1, ASYNC);
edma_set_src (edma_mcasp_chn2, (unsigned long)(AM335X_MCASP0_Data), INCR, W8BIT);
edma_set_dest (edma_mcasp_chn2, (unsigned long)(mcaspadc_dev->r_dma_Qping), INCR, W8BIT);
edma_set_src_index (edma_mcasp_chn2, iacnt, iacnt);
edma_set_dest_index (edma_mcasp_chn2, iacnt, iacnt); /* A Sync Transfer Mode */
edma_set_transfer_params (edma_mcasp_chn2, iacnt, 1, 1, 1, ASYNC);
/* Chain both the channels */
edma_read_slot(edma_mcasp_chn1, ¶mSet);
paramSet.opt |= (1 << TCCHEN_SHIFT);
paramSet.opt |= EDMA_TCC(EDMA_CHAN_SLOT(edma_mcasp_chn2));
edma_write_slot(edma_mcasp_chn1, ¶mSet);
/* * Enable the Intermediate and Final Interrupts on Channel 1. * Also, Enable the Intermediate Chaining. */
edma_read_slot(edma_mcasp_chn1, ¶mSet);
paramSet.opt |= (1 << ITCCHEN_SHIFT);
paramSet.opt |= (1 << TCINTEN_SHIFT);
paramSet.opt |= (1 << ITCINTEN_SHIFT);
edma_write_slot(edma_mcasp_chn1, ¶mSet);
/* Enable the Intermediate and Final Interrupts on Channel 2 */
edma_read_slot(edma_mcasp_chn2, ¶mSet);
paramSet.opt |= (1 << TCINTEN_SHIFT);
paramSet.opt |= (1 << ITCINTEN_SHIFT);
edma_write_slot(edma_mcasp_chn2, ¶mSet);
2. channel 回调函数 mcasp_callback_rxedma只进行数据copy到buffer.
EDMA的事件是外设产生或者手动设置寄存器产生,当前使用McASP作为EDMA的源地址,在McASP将RDATA中断打开,只要有数据ready就会产生一个McASPRx事件中断给EDMA,这样EDMA就可以开始工作。
第一次执行完后,我通过打印McASP RDATA flag可以判断是有数据ready的,中断应该给到EDMA controll了,但不知道为何没有触发DMA搬数据?感觉就是DMA的PaRAM只工作一次,没有完成chain的工作,是不是哪里配置不对吗?
在读取数据时,我将EDMA channel control的相关寄存器打印出了,
CER(0x00000000)
IER(0x00001200) 这个代表channel 9 12的传输完成中断是enable的。
IPR(0x00000000)
ER (0x00000000)
ERR(0x00000000)