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.

Multiple DMA

Welcome
The task is to generate multiple sinusoidal signals with different frequencies.
The first DMA channel is working properly, but not the second.

May be there is some mistake, please help to find it.

EALLOW;
PieVectTable.DINTCH1 = &dma_isr;
EDIS;

DINT;
// clear any pending interrupt for DMA
PieCtrlRegs.PIEIER7.bit.INTx1 = 1; //INT7.1 is DMA_CH1_INT
IER |= M_INT7; // Enable CPU Interrupt 7
EINT; // Enable Global interrupt INTM

EALLOW;

// Enable DMA clock
SysCtrlRegs.PCLKCR3.bit.DMAENCLK = 1;

// Reset the DMA (also sets round-robin priority scheme)
DmaRegs.DMACTRL.bit.HARDRESET = 1;

asm(" NOP");

// DMA channel 1:
// triggered by ePWM1 SOCA
// writes one 16-bit word to ePWM1 CMPA
//DmaRegs.CH1.CONTROL.bit.SOFTRESET = 1;

DmaRegs.CH1.MODE.bit.CHINTE = 1; // want to get interrupts to CPU
DmaRegs.CH1.MODE.bit.CHINTMODE = 0; // at the beginning of each transfer
DmaRegs.CH1.MODE.bit.DATASIZE = 0; // 16-bit words
DmaRegs.CH1.MODE.bit.CONTINUOUS = 1; // no need to restart
DmaRegs.CH1.MODE.bit.ONESHOT = 0; // 1 burst per event
DmaRegs.CH1.MODE.bit.PERINTSEL = 18; // ePWM1 SOCA triggers this channel
DmaRegs.CH1.MODE.bit.PERINTE = 1; // enable peripheral interrupt

DmaRegs.CH1.BURST_SIZE.bit.BURSTSIZE = SAMPLE_SIZE - 1; // 0 is one word in a burst
DmaRegs.CH1.TRANSFER_SIZE = active_context->samples - 1; // bursts in a transfer

DmaRegs.CH1.SRC_BURST_STEP = 1; // go to next word in sample
DmaRegs.CH1.SRC_TRANSFER_STEP = 1; // go to next sample
DmaRegs.CH1.SRC_WRAP_SIZE = active_context->samples - 1;
DmaRegs.CH1.SRC_WRAP_STEP = 0; // BEG_ADDR remains unchanged
DmaRegs.CH1.SRC_BEG_ADDR_SHADOW = (Uint32)(&(active_context->buffer[0]));
DmaRegs.CH1.SRC_ADDR_SHADOW = (Uint32)(&(active_context->buffer[0]));

DmaRegs.CH1.DST_BURST_STEP = SAMPLE_SIZE - 1;
DmaRegs.CH1.DST_TRANSFER_STEP = -(SAMPLE_SIZE - 1);
// wrap disabled (>TRANSFER_SIZE)
DmaRegs.CH1.DST_WRAP_SIZE = BUF_SAMPLES;
DmaRegs.CH1.DST_WRAP_STEP = 0;
if(USE_HIRES)
{
DmaRegs.CH1.DST_ADDR_SHADOW = (Uint32)(&(EPwm1Regs.CMPA));
}
else
{
DmaRegs.CH1.DST_ADDR_SHADOW = (Uint32)(&(EPwm1Regs.CMPA.half.CMPA));
}

// Start CH1
DmaRegs.CH1.CONTROL.bit.RUN = 1;

// DMA channel 2:
// triggered by ePWM2 SOCA
// writes one 16-bit word to ePWM1 CMPA
//DmaRegs.CH2.CONTROL.bit.SOFTRESET = 1;

DmaRegs.CH2.MODE.bit.CHINTE = 0; // want to get interrupts to CPU
DmaRegs.CH2.MODE.bit.CHINTMODE = 0; // at the beginning of each transfer
DmaRegs.CH2.MODE.bit.DATASIZE = 0; // 16-bit words
DmaRegs.CH2.MODE.bit.CONTINUOUS = 1; // no need to restart
DmaRegs.CH2.MODE.bit.ONESHOT = 0; // 1 burst per event
DmaRegs.CH2.MODE.bit.PERINTSEL = 20; // ePWM2 SOCA triggers this channel
DmaRegs.CH2.MODE.bit.PERINTE = 1; // enable peripheral interrupt

DmaRegs.CH2.BURST_SIZE.bit.BURSTSIZE = SAMPLE_SIZE - 1; // 0 is one word in a burst
DmaRegs.CH2.TRANSFER_SIZE = active_context2->samples - 1; // bursts in a transfer

DmaRegs.CH2.SRC_BURST_STEP = 1; // go to next word in sample
DmaRegs.CH2.SRC_TRANSFER_STEP = 1; // go to next sample
DmaRegs.CH2.SRC_WRAP_SIZE = active_context2->samples - 1;
DmaRegs.CH2.SRC_WRAP_STEP = 0; // BEG_ADDR remains unchanged
DmaRegs.CH2.SRC_BEG_ADDR_SHADOW = (Uint32)(&(active_context2->buffer[0]));
DmaRegs.CH2.SRC_ADDR_SHADOW = (Uint32)(&(active_context2->buffer[0]));

DmaRegs.CH2.DST_BURST_STEP = SAMPLE_SIZE - 1;
DmaRegs.CH2.DST_TRANSFER_STEP = -(SAMPLE_SIZE - 1);
// wrap disabled (>TRANSFER_SIZE)
DmaRegs.CH2.DST_WRAP_SIZE = BUF_SAMPLES;
DmaRegs.CH2.DST_WRAP_STEP = 0;
if(USE_HIRES)
{
DmaRegs.CH2.DST_ADDR_SHADOW = (Uint32)(&(EPwm2Regs.CMPA));
}
else
{
DmaRegs.CH2.DST_ADDR_SHADOW = (Uint32)(&(EPwm2Regs.CMPA.half.CMPA));
}

// Start CH2
DmaRegs.CH2.CONTROL.bit.RUN = 1;

EDIS;
}

Best regards, Vitaliy