AM2634: Continuous 3D DMA movement

Part Number: AM2634

Tool/software:

Hi!

I am trying to set up my DMA to be triggered by an EPWM. 

After the EPWM trigger, the DMA will grab 2 Bytes (ACnt), 4 times (BCnt), 2 times (CCnt). 

I want the DMA to be reconfigured to do the full transfer again (including the CCnt) the next the EPWM triggers.

The issue I am seeing is it only does the transfer once (or twice) at the very beginning, then does not continue the dma transfer upon every time the EPWM triggers. I don't see new data at the destination when I know the source is changing.

If I change this to only do the 2D transfer (i.e. set cCnt = 1,  p.srcCIdx = 0; p.destCIdx = 0;) it does do continuous dma transfer and I see new data at the destination

I am currently using AB transfer but open to change if theres a better way.

Here are the params I'm using:

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

Would really appreciate if someone could point out how to configure the 3D to link this transfer to continuously run at every epwm trigger.

Thanks!