This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

EasyDMA array list

Hello, in the nrf52832 PS I've stumbled over the "EasyDMA array list mode". From the description, I'm unable to understand, how this works and what I can archive with this mode (or which problem this mode solves).

Does this simply means, that after an EasyDMA transfer has ended, the READER.PTR is forwared to the next 32 bit aligned address and that the next EasyDMA transfer can be startet, without the need to reset the READER.PTR? Does the same apply to a WRITTER.PTR?

kind regards, Torsten

  • Updated

    Yes, you got it perfectly. In normal EasyDMA , you just need to update the pointers and the size and the transfer will be done. This is one transfer and after that you need to update the pointers again and do a start again for the next transfer.

    But in the array list you avoid updating the pointer register. But you still need to trigger the TASKS_START for the next transaction , the PTR will automatically be updated by adding the the buffer size to itself.

    USE_CASE:

    1. You can use the shortcut between END_EVENT and START_TASKS.
      Now configure a PPI and TImer in counter mode that every END_EVENT increments the timer counter. You are counting transactions here. You will set timer CC with maximum number of transactions you need and when the timer counter has reached that value, you use that event to trigger TASKS_STOP. Since everything is configured in hardware now with no software involved for every transaction, all the data in the lists will be transferred with no pauses or no dependency on CPU state.

    2. enable the shortcut between END_EVENT and START_TASKS. If you know that you have N bytes of data in one transafer and you have M lists in array to transfer at say T Mbps. You can configure a timer to expire in (N * M * 8 )/(T) micro seconds using this event to trigger the TASK_STOP of the peripheral.

    It would have been nice if we could have number of arrays in list to be configured in a register but we do not have this

    For example as shown in infocenter

      ArrayList_type ReaderList[3];
      channel.MAXCNT = BUFFER_SIZE;
      channel.PTR = &ReaderList;
    

    Then the EasyDMA will update .PTR by itself after the transaction is complete by adding BUFFER_SIZE to it and triggering a start automatically. This will avoid a lot of software involvement in many cases.

    The transfer size remain the same through out the whole transactions of the list and all the buffers have to be linear in memory. Linear buffer needed is

    BUFFER_SIZE * number_of_arrays_in_list

    number_of_arrays_in_list in the above example is 3

  • How do the EasyDMA knows the number_of_arrays_in_list ? I can't find the code to set number_of_arrays_in_list to the any register in the document or any sample code

  • I am sorry Haruki and Torsten, You need to manually trigger the start task after every transaction unless you use the SHORTS if available between END event and START task, I will update my answer with this and a use case where this will be more meaningful.

  • Thank you aryan for updating answer. It became easier to understand. But can I ask one more question? In use_case1, END_EVENT trigger START_TASKS and TASKS_COUNT. So, when timer count reaches CC, its flow is below.

    END_EVENT -> START_TASKS
              -> TASKS_COUNT -> COMPARE_EVENT -> STOP_TASKS.
    

    Then, how much is the time between last START_TASKS and STOP_TASKS? no time? I'm afraid of sending some bytes before STOP_TASKS is executed.

Related