AWR2944EVM: How does this EDMA work?

Part Number: AWR2944EVM
Other Parts Discussed in Thread: AWR2944

Tool/software:

 Dear Designer:

      During studying LVDS in AWR2944EVM demo, I find it hard to understand that LVDS uses EDMA to transfer ADC data. As shown in the above figures which are source code about LVDS configing EDMA to transfer ADC data, there are four ADC Channels from which ADC data is transfered to CBUFF FIFO.

      According to value in PaRAM,  I have some questions:

     1. Why does srcBidx equal 0, does it mean that bCnt arrays of aCnt bytes reuse the address of ADC channel?

     2. Why is destAddr same,  doesn't it result in data race because completion of previous channel will trigger current channel?

  • Hello User,

    1)This is 0 and your understanding is correct and for every chirp it will go back to beginning of source address.
    2) The Dest address is the same as it points to a FIFO. This FIFO automatically flushes the data as soon as it is received so you will not be facing any race conditions as such.

    Regards,
    Saswat Kumar

  • Hello Designer,

    FIrst thanks for your explanation, it's really helpful.

    I have another question:

    I recently accepted a mission transferring original ADC data to a PC connected with AWR2944EVM. Based on my understanding and your helpful explanation, I have a plan as following:

    1) use a globle variable of array as destAddr

    2)pend on the completion of every transfer request 's register ,then transfer it using enet(ps:I don't know if it will work under the condition of enabling completion interupt)

    Do you think it will work?

    Would you give me some advice if it won't?

  • Hello User,

    How are you planning on transferring it to PC?

    Regards,
    Saswat Kumar

  • My plan is like this:

    pasudo code:

    1 define a globle variable :uint8_t data[aCnt]

    2 based on LVDS demo, modify EDMA option from "edmaParam.destAddr = (uint32_t)SOC_virToPhy((void *)gCbuffAttrs->fifobaseAddr"  to

                                                                                       "edmaParam.destAddr = &data

    3 create a thread to pend on completion of every transfer:

                  while ( is_EDMA_transfer_complete() ):

                         memcpy( enet_send_buffer, data, aCnt)

                         clear_EDMA_transfer_complete_relate_register()

    4 enet thread transfer ADC data to PC connected with the board:

                 while ( there_is_data_in_buffer() ):

                       enet_write( enet_send_buffer, aCnt )

    It is a shabby plan with possiblity of meaningless, so I want to know the feasibility of my plan or would you provide some feasible plan.

    Thanks.

  • Hello User,

    In the AWR2944 demo we have the enet streamed application.
    It is better to refer to that and use it instead of the process you have defined as such.
    In that we are sending the processed data over the ethernet, you can modify it to use the ADC instead.

    Regards,
    Saswat Kumar

  • Hello Saswat

    The central problem confronting me is how to get ADC data, my plan to get ADC data is based on LVDS application's configEDMA() function where I modify its destAddr as well as a thread to pend on every transfer completion.

    But in the configEDMA function it use chain technique, it will set and clear relate register of completion which I create a thread to pend on it.I want to know if it will result in a situation that my thread miss transfer completion?

  • Hello User,

    You can try it out your way, but I would strongly suggest first understanding the demo application and then modifying that instead.

    Regards,
    Saswat Kumar