Hello,
Currently we are working with the EVMDM6437 and we cannot make EDMA3 works fine on DM6437 as we did on DM642 and DM6446.
The project is really complex and large so we decided to symplify it
and try to fix the EDMA3 troubles with an small program. The problem is
related with linked transfers. The aplication works fine if three
transfers are linked but when we link 4 transfers the following error
appear: TC Program Set already active.
We transfer the contexts of the transfers with IDMA from internal
memory to the Parameter Set table, specifically PaRam 20, 21, 22 and 23.
Transfers (through channel 2) are configured to be auto-triggered when
the seventh word of 23th PaRam Set was written. We get the error just
when the first auto-trigger transfer is performed and the program stop
the execution.
We tested this code on a DM6446 DSP with 4 and more linked transfers without problems.
Next We show a piece of the code we have written.
Does anybody know what mean exactly "TC Program Set already active" ?
How could we solve this problem? Any ideas?
Regards,
Fernando & Gonzalo
CODE:
void ddr2_a_L2_2(void) // cuatro Y de 8x8 enlazadas params:20-23
{
*(volatile uint *)((uint)QEESR)= (1<<2);
*(volatile uint *)((uint)QCHMAPn+(2<<2))= (23<<5)|(7<<2);
/* contexto de la transferencia Y1 */
Params[0].option = 0x0011F00C;
Params[0].src = (unsigned int)y_mb_DDR2;
Params[0].bcnt_acnt = ((8)<<16)|8;
Params[0].dst = (unsigned int)y_mb_L2;
Params[0].dstbidx_srcbidx = ((8)<<16)|32;
Params[0].bcntrld_link = 0xFFFF;
Params[0].dstcidx_srccidx = 0;
Params[0].ccnt = 1;
/* contexto de la transferencia Y2 */
Params[1].option = 0x0001F004;
Params[1].src = (unsigned int)(y_mb_DDR2+8);
Params[1].bcnt_acnt = ((8)<<16)|8;
Params[1].dst = (unsigned int)(y_mb_L2+8*8);
Params[1].dstbidx_srcbidx = ((8)<<16)|32;
Params[1].bcntrld_link = 0x4280;
Params[1].dstcidx_srccidx = 0;
Params[1].ccnt = 1;
/* contexto de la transferencia Y3 */
Params[2].option = 0x0001F004;
Params[2].src = (unsigned int)(y_mb_DDR2+8*32);
Params[2].bcnt_acnt = ((8)<<16)|8;
Params[2].dst = (unsigned int)(y_mb_L2+8*8*2);
Params[2].dstbidx_srcbidx = ((8)<<16)|32;
Params[2].bcntrld_link = 0x42A0;
Params[2].dstcidx_srccidx = 0;
Params[2].ccnt = 1;
/* contexto de la transferencia Y4 */
Params[3].option = 0x0001F004;
Params[3].src = (unsigned int)(y_mb_DDR2+8+8*32);
Params[3].bcnt_acnt = ((8)<<16)|8;
Params[3].dst = (unsigned int)(y_mb_L2+8*8*3);
Params[3].dstbidx_srcbidx = ((8)<<16)|32;
Params[3].bcntrld_link = 0x42C0;
Params[3].dstcidx_srccidx = 0;
Params[3].ccnt = 1;
/* copio param a la tabla y se autodispara QDMA */
*(volatile uint *)((uint)IDMA0_MASK)= (uint)0x00000000;
*(volatile uint *)((uint)IDMA0_SOURCE)= (uint)Params;
*(volatile uint *)((uint)IDMA0_DEST)= (uint)0x01C04280; // PaRAM 20
*(volatile uint *)((uint)IDMA0_COUNT)= (uint)0x00000000; // trigger IDMA0
}