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-Q1:连续触发 EDMA 链的问题

Guru**** 1791630 points
Other Parts Discussed in Thread: AM2634
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1391605/am2634-q1-question-of-triggering-edma-chain-continuously

器件型号:AM2634-Q1
主题中讨论的其他器件:AM2634

工具与软件:

你(们)好、

我正在使用 AM2634 MCAL 9.2 、并尝试通过 PWM SOCA 触发 EDMA 链、但在此处有疑问:

1. EDMA 链中可以触发的通道数量是否有限制?

2.每次触发 EDMA 传输后,我发现必须重置所有的参数输入  

    Cdd_Dma_Param (handleId0、0、paramEntry0);
    Cdd_Dma_Param (handleId1、0、paramEntry1);
    Cdd_Dma_Chain (0,0,1,chainOptions);
是否有任何方法我不需要每次都设置这些 ParameteSet? 因为重置它大约需要20us。
谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Phoenix:

    1.没有链中所涉及的通道数量的限制。
    2.您是触发手动触发器还是基于事件? 只应为与通道关联的每个参数设置一次"ParamSet"、如果您要链接2个以上的通道、则必须使用 ChainChannel 将其全部链接在一起。 完成此操作后、您无需执行此操作、直到所有参数集长度(acount*bCount*ccount)值都变为"0"。

    谢谢!

    Mutit Bhansali  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Mudit:

    感谢您的答复、但是、

    1.由 PWM SOCA 触发。 根据我的理解、触发器是手动的或事件都没有关系。 对于每个触发器、所有链接的通道都将执行一次。

    2.我的问题是、在所有链式通道执行一次之后、我必须在下一次触发通信之前通过调用这些函数来重新初始化所有 ParamEntry、否则链式通道不会在第二次触发时执行。 是否可以在开始时初始化 ParamSet 一次、然后对每个触发执行它?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Phoenix:

    您能否向我发送您为所有链式通道设置的参数集配置? 无需重新初始化所有参数
    我询问了触发模式、因为在事件模式下、仅当从 PWM 接收到任何硬件事件时才会触发 DMA、但在另一种情况下、一旦调用启用传输、就会触发 DMA。

    谢谢!

    Mutit Bhansali

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 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();

    那么它将再次工作。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在本例中、我们使用 AB-SYNC 模式、由于在此链示例中、ccount 值为1、因此 param-set 长度只有在首次触发后才会变为"0"、因此不需要传输任何数据。
    如果您更改例如: cdd_dma_test_C_count 从2更改为4 ,那么在这种情况下 DMA 链将需要总共2个触发器来传输整个长度。

    谢谢!

    Mutit Bhansali

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Mudit:

    我的问题是、如果我在本示例中将触发器更改为 PWM 周期性触发器、链通道是否会针对每个触发器运行?

    根据我的测试、它无法正常工作。

    您有没有任何 定期对链接的通道进行微调的示例?

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 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?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是否有此主题的更新?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在这种情况下,它将迭代,直到分配给参数的长度变为"0"意味着所有的都被转移。
    如果您调用 enable transfer 1000次、那么在这种情况下、如果 DMA 传输需要1000个触发、那么它会触发1k 次、但如果长度本身以更少的迭代方式传输、那么这个1k 迭代就是浪费。
    希望这能澄清您的疑问。

    谢谢!

    Mutit Bhansali

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Mudit:

    在上面的示例中、如果我调用它1000次、它只会在第一次触发时传输一次数据。 所有其余的触发条件都不会导致数据传输。

    我想我在上一篇文章中解释得非常清楚、我希望 PWM 触发链 DMA 通道定期传输数据。 您说的是、如果数据长度已传输、即使触发器存在但没有数据传输。 我是对吗?

    我的问题是、如果我希望在每次触发时传输数据、我该怎么办?