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.

EDMA doesn't transfer data on TMDXEVM6657LE

Hello,

I use a TMDXEVM6657LE Evaluation Module to test the C6657's DMA.

My test program simulates a 50MHz-McBSP with 40us-cycle that receives 12Byte per cycle.
The timer releases an Interrupt each 640ns (32 bittimes @ 50MHz) and timerIrq() calls mcbsp0RcvDummy().
mcbsp0RcvDummy() is used to write to dummyMcbspSrc (used as dummy DataReceiveRegister) and triggers the Event (MCMSP0_REVT).

The MCMSP0_REVT triggers the EDMA channel 36, that copies the data wordwise into a 2*12 byte ping-pong buffer (m_mcbspBuffer[PING_AND_PONG][12]).
When the transfer into m_mcbspBuffer[] is finished, a second DMA-transfer is started by chaining. The data from m_mcbspBuffer[PING] is copied into the circular buffer dummyRing[PING], the data from m_mcbspBuffer[PONG] is copied into the circular buffer dummyRing[PONG].

That's how I expected it to work. What I see is the following:
Wen the timer-ISR triggers the McBSP-event, BCNT and DST in PaRam-set 100 (assigned to channel 36) are updated (as expected), but no data is transfered from dummyMcbspSrc to m_mcbspBuffer[].
When one m_mcbspBuffer[] is full, channel 40 is chained by PING and 41 by by PONG. BCNT and DST in PaRam-set 110 for PING and 111 for PONG are updated (as expected), but no data is transfered from m_mcbspBuffer[] to dummyRing[].

My first suspicion was something with MPU. But everthing is at default setting, so I couldn't find anything there.

I attached the complete project as zip-file, so you might reproduce the behaviour.

5340.EdmaTest.zip

Thanks,

Norbert

  • It looks you are passing core-local adresses to EDMA - whereas EDMA requires the core-number encoded in the upper bits of the address for memory located inside corepacks.

  • Regina,

    Where can I find more information about core-local and global addressing?
    At a quick search, Ionly found chapter 5.1 in the C6657 device manual.
    But how can I tell the compiler to make a global address, when referencing a variable with & ?
    I checked the CSL sources, but I couldn't find any special handling in the EDMA functions.

    Where can I define the address locations for my variables?
    I generated my test project with the wizard for C6657, so I was wondering where the device specific memory map is defined.
    Before I worked with C2000 and C64x, where I had to define a Linker Command File.

    Thanks,

    Norbert

  • You have to convert the local address manually before your pass it to an peripheral outside of the corepak, i use a macro like this one:

    extern cregister volatile unsigned int DNUM;
    #define MAP_LOCAL_TO_GLOBAL_ADDR(addr) ((1<<28)|(DNUM<<24)|(((unsigned int)addr)&0x00ffffff))


    Regarding the section placement: You still can use linker command files for non-rtsc Projects, otherwise you specify Placement in your rtsc config file (*.cfg).

    Greets

  • With the macro my program works fine!

    Thank you!

    If anyone is interested, here is my working code:

    7318.EdmaTest.zip

    Norbert