Hi,
My chip is belong to C67x.
I use EDMA to transfer data between on-chip memory and off-chip memory with manually-trig.
I use EDMA3 LLD to operate the EDMA. I register a callback function for EDMA completion.
For debug , the EDMA use early completion mode.
The work flow is as below.
Every time cpu trig the EDMA to transfer data, pint the information, then cpu wait 12 seconds.
If EDMA complete a data transfer, some information will be printed by the callback function.
Then next data transfer will do as before.
I find cpu trig 100 EDMA data transfer, but only finish 80 data transfer.
Only the manually-triggered EDMA use queue 2. The cpu read the EMR\EMRH\CCERR registers after cpu wait 12 seconds and these registers's value is all zeros. So manually-triggered EDMA do not miss, but why EDMA data transfer don't finish?
The regitser reading method is as below.
#define EDMA_CC_BASE (0X9000000)
#define EDMA_EMR (volatile int *)(EDMA_CC_BASE+0x300))
DBGprintf(msg,"DMA reg2:=%x,%x",(*(EDMA_EMR)),(*(EDMA_CCERR)));
The DBGprintf of my will print information on serial port.
Then I find ARM also use EDMA, ARM ues 4 channel and mapping to queue 0 which have the highest priority.
I cann't close or change ARM 's EDMA setting directly.But I try to close the EDMA channels used by ARM in DSP before my manually-trig.
By this way, the EDMA channels used by ARM are partly closed. And I find my manually-trig change to seldom fail.
Can EDMA used by ARM have so big affect on my manually-trig?
I catch watermark of queue 0, it's value is one.
I can not make sure if EDMA channels used by ARM affect my manually-triggered EDMA. Can anyone help me?