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.

TCI6486: EDMA3 signals transfer is complete but no data is actually written

Hi,

I am trying to set a manual DMA transfer (can't use the driver at the moment due to tooling issues), and I have a simple function that configures the registers according to the manual and starts a transfer.

The transfer is complete (I get the interrupt) but has not actually executed (no data is transfered).

The function is really very basic: enable the event, the interrupt, set the param and manually initilize the access. any thoughts on what I might be missing?

_______________________________________________

int Edma3Tx(int chan, U32 param, int len, U8* Src, U8* Dst)
{
 U32 *DChMap = ((U32 *)(EDMA3_DCHMAP0 + 4*chan));
 U32 *EESR   = (U32 *)EDMA3_EESR;
 U32 *EESRH  = (U32 *)EDMA3_EESRH;
 U32 *PaRAM  = ((U32 *)(EDMA3_PARAM_RAM_BASE + 0x20*param));
 U32 *IER    = (U32 *)EDMA3_IER;
 U32 *IERH   = (U32 *)EDMA3_IERH;
 U32 *ESR    = (U32 *)EDMA3_ESR;
 U32 *ESRH   = (U32 *)EDMA3_ESRH;

 //Param num config:
 *DChMap = (param << 5); //set the param number in the relvant channel register
 
 //Event triggering:
 if (chan < 32)
  *EESR  |= 1<<chan; //set the correct bit that will trigger the EDMA event in either low or high register
 else
  *EESRH |= 1<<(chan-32);

 //PaRAM programming:
 PaRAM[0] =  0x80100000;            // options: supervisor access, int enabled
 PaRAM[1] =  (U32)(Src);               // src
 PaRAM[2] =  0x10000 | (len & 0xFFFF); // bcnt,acnt (b = 1, a = len)
 PaRAM[3] =  (U32)(Dst);               // dst
 PaRAM[4] =  0x0;
 PaRAM[5] =  0x0;
 PaRAM[6] =  0x0;
 PaRAM[7] =  0x1;                      //ccnt = 1

 //Int enable:
 if (chan < 32)
  *IER = *IER | 1<<chan;
 else
  *IERH = *IERH | 1<<(chan-32);

 //Initiate transfer:
 if (chan < 32)
  *ESR = *ESR | 1<<chan; //set the correct bit that will trigger the EDMA event in either low or high register
 else
  *ESRH = *ESRH | 1<<(chan-32);

};