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.

AM3352 EDMA3的chain模式无法进行循环交替数据搬运,问题出在哪里????

当前功能是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, &paramSet);  

paramSet.opt |= (1 << TCCHEN_SHIFT);

 paramSet.opt |= EDMA_TCC(EDMA_CHAN_SLOT(edma_mcasp_chn2));  

edma_write_slot(edma_mcasp_chn1, &paramSet);

 

/*   * Enable the Intermediate and Final Interrupts on Channel 1.   * Also, Enable the Intermediate Chaining.   */  

edma_read_slot(edma_mcasp_chn1, &paramSet);  

paramSet.opt |= (1 << ITCCHEN_SHIFT);

 paramSet.opt |= (1 << TCINTEN_SHIFT);

 paramSet.opt |= (1 << ITCINTEN_SHIFT);

 edma_write_slot(edma_mcasp_chn1, &paramSet);

  /* Enable the Intermediate and Final Interrupts on Channel 2 */  

edma_read_slot(edma_mcasp_chn2, &paramSet);  

paramSet.opt |= (1 << TCINTEN_SHIFT);  

paramSet.opt |= (1 << ITCINTEN_SHIFT);  

edma_write_slot(edma_mcasp_chn2, &paramSet);        

 

 

2. channel 回调函数 mcasp_callback_rxedma只进行数据copy到buffer.

  • EDMA的事件是怎样触发的?第一次执行完了后,是因为触发了没有响应,还是没有触发?

  • 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)