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:连续 3D DMA 移动

Guru**** 2538930 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1554673/am2634-continuous-3d-dma-movement

器件型号:AM2634


工具/软件:

您好!

我正在尝试设置由 ePWM 触发的 DMA。  

在 ePWM 触发之后、DMA 将获取 2 个字节 (ACnt)、4 次 (BCnt)、2 次 (CCnt)。  

我希望重新配置 DMA、以便在接下来的 ePWM 触发条件下再次执行完整传输(包括 CCnt)。

我看到的问题是、在开始时传输只进行一次(或两次)、然后不会在每次 ePWM 触发时继续 DMA 传输。 当我知道源正在更改时、我在目的地看不到新数据。

如果我将其更改为仅进行 2D 传输(即 set cCnt = 1、 p.srcCIdx = 0;p.destCIdx = 0;)、它会执行连续的 DMA 传输、我会在目标位置看到新数据

我目前正在使用 AB 转接、但如果有更好的方法、我愿意进行更改。

下面是我使用的参数:

    EDMACCPaRAMEntry p;
    EDMA_ccPaRAMEntry_init(&p);

    p.srcAddr    = src_addr;
    p.destAddr   = dest_addr;
    p.aCnt       = 2;
    p.bCnt       = 4;
    p.cCnt       = 2;
    p.bCntReload = p.bCnt;

    p.srcBIdx  = 0x100;
    p.destBIdx = 0x2;
    p.srcCIdx  = 0x1000;
    p.destCIdx = 0x2 * 0x4;

    p.srcBIdxExt  = 0;
    p.destBIdxExt = 0;
    p.linkAddr    = 0xFFFFU; // Disable linking here, will be set explicitly later.

    p.opt = 0U;
    if (!is_empty_buffer) {
        p.opt |= EDMA_OPT_TCINTEN_MASK;
    }
    // AB-sync transfer
    p.opt |= ((EDMA_SYNC_AB << EDMA_OPT_SYNCDIM_SHIFT) & EDMA_OPT_SYNCDIM_MASK);

    uint32_t baseAddr = EDMA_getBaseAddr(gEdmaHandle[0]);
    uint32_t regionId = EDMA_getRegionId(gEdmaHandle[0]);

    uint32_t channel_id = EDMA_RESOURCE_ALLOC_ANY;
    uint32_t tcc = EDMA_RESOURCE_ALLOC_ANY;
    uint32_t param = EDMA_RESOURCE_ALLOC_ANY;

    EDMA_configureChannelRegion(
        baseAddr, regionId, EDMA_CHANNEL_TYPE_DMA, channel_id, tcc, param, 0);

    // Clear and set TCC in opt
    p.opt &= ~EDMA_OPT_TCC_MASK;
    p.opt |= ((static_cast<std::uint32_t>(tcc) << EDMA_OPT_TCC_SHIFT) & EDMA_OPT_TCC_MASK);

    EDMA_setPaRAM(baseAddr, param, &p);

    // Link the DMA Param to itself to enable continuous operation
    EDMA_linkChannel(baseAddr, param, param);

    EDMA_enableTransferRegion(baseAddr, regionId, channel_id, EDMA_TRIG_MODE_EVENT);

如果有人指出如何配置 3D 以将此传输链接到在每个 ePWM 触发时持续运行、我将不胜感激。

谢谢!