主题中讨论的其他器件:AM2634
工具与软件:
你(们)好、
我正在使用 AM2634 MCAL 9.2 、并尝试通过 PWM SOCA 触发 EDMA 链、但在此处有疑问:
1. EDMA 链中可以触发的通道数量是否有限制?
2.每次触发 EDMA 传输后,我发现必须重置所有的参数输入
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.
工具与软件:
你(们)好、
我正在使用 AM2634 MCAL 9.2 、并尝试通过 PWM SOCA 触发 EDMA 链、但在此处有疑问:
1. EDMA 链中可以触发的通道数量是否有限制?
2.每次触发 EDMA 传输后,我发现必须重置所有的参数输入
尊敬的 Phoenix:
1.没有链中所涉及的通道数量的限制。
2.您是触发手动触发器还是基于事件? 只应为与通道关联的每个参数设置一次"ParamSet"、如果您要链接2个以上的通道、则必须使用 ChainChannel 将其全部链接在一起。 完成此操作后、您无需执行此操作、直到所有参数集长度(acount*bCount*ccount)值都变为"0"。
谢谢!
Mutit Bhansali
尊敬的 Mudit:
感谢您的答复、但是、
1.由 PWM SOCA 触发。 根据我的理解、触发器是手动的或事件都没有关系。 对于每个触发器、所有链接的通道都将执行一次。
2.我的问题是、在所有链式通道执行一次之后、我必须在下一次触发通信之前通过调用这些函数来重新初始化所有 ParamEntry、否则链式通道不会在第二次触发时执行。 是否可以在开始时初始化 ParamSet 一次、然后对每个触发执行它?
尊敬的 Mudit:
以下是 MCAL 9.2.0的示例示例 DmaChainingModeApp.c
/* Filling the paramEntry for param 0 of channel0*/ paramEntry0.srcPtr = srcPtr; paramEntry0.destPtr = dstPtr; paramEntry0.aCnt = CDD_DMA_TEST_A_COUNT; paramEntry0.bCnt = CDD_DMA_TEST_B_COUNT; paramEntry0.cCnt = CDD_DMA_TEST_C_COUNT/2; paramEntry0.bCntReload = 0; paramEntry0.srcBIdx = CDD_DMA_TEST_A_COUNT; paramEntry0.destBIdx = CDD_DMA_TEST_A_COUNT; paramEntry0.srcCIdx = CDD_DMA_TEST_A_COUNT*CDD_DMA_TEST_B_COUNT; paramEntry0.destCIdx = CDD_DMA_TEST_A_COUNT*CDD_DMA_TEST_B_COUNT; paramEntry0.opt = opt0; /* Filling the paramEntry for param 0 of channel1 */ paramEntry1.srcPtr = srcPtr+shift; paramEntry1.destPtr = dstPtr+shift; paramEntry1.aCnt = CDD_DMA_TEST_A_COUNT; paramEntry1.bCnt = CDD_DMA_TEST_B_COUNT; paramEntry1.cCnt = CDD_DMA_TEST_C_COUNT/2; paramEntry1.bCntReload = 0; paramEntry1.srcBIdx = CDD_DMA_TEST_A_COUNT; paramEntry1.destBIdx = CDD_DMA_TEST_A_COUNT; paramEntry1.srcCIdx = CDD_DMA_TEST_A_COUNT*CDD_DMA_TEST_B_COUNT; paramEntry1.destCIdx = CDD_DMA_TEST_A_COUNT*CDD_DMA_TEST_B_COUNT; paramEntry1.opt = opt1; Cdd_Dma_ParamSet(handleId,0,0,paramEntry0); Cdd_Dma_ParamSet(handleId,1,0,paramEntry1); Cdd_Dma_ChainChannel(handleId,0,0,1,chainOption); void * appdata = (void *) &Cdd_Dma_TestDoneSem; /* Registering the callback */ Cdd_Dma_CbkRegister(handleId,appdata,&Cdd_Dma_RegionIsrFxn); /* * Enable transfer on dmaCh0 only. * Because of chaining the dmaCh1 will be triggered automatically. * Transfer is done in AB sync mode, Number of triggeres required is * cCnt value programmed in param (EDMA_TEST_C_COUNT / 2) */ for(uint32 count=0;count<(CDD_DMA_TEST_C_COUNT/2);count++) { Cdd_Dma_EnableTransferRegion(handleId,CDD_EDMA_TRIG_MODE_MANUAL); while(Cdd_Dma_TestDoneSem == 1); Cdd_Dma_TestDoneSem = 1; }
所有链接通道运行后,如果我尝试再次触发它,由,handleId,cdd_edma_trig_mode_manual; Cdd_Dma_Enable
不管用。 我需要 在 Cdd_Dma_Enable ferArea(handleId,cdd_eDMA_TRIG_MODE_MANUAL )之前再次致电 Cdd_Dma_Param 4540();
那么它将再次工作。
尊敬的 Mudit:
我的问题是否有答案?或者您是否理解我的问题?
在上面的代码中、如果 像这样移动它
for(uint32 count=0;count<1000;count++) { Cdd_Dma_EnableTransferRegion(handleId,CDD_EDMA_TRIG_MODE_MANUAL); while(Cdd_Dma_TestDoneSem == 1); Cdd_Dma_TestDoneSem = 1; }
调用触发函数1000次、是否每次都可以触发 DMA?