DMA with Linked List

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Not applicable
Dear all,

i have trouble to start a Linked List DMA Transfer triggered by an ADC event.
I´m using the XMC4500 hexagon board v2 with Dave 4 and the XMClib.

My Problem:
I´ve got a periodic synchronized ADC conversion (G0CH0, G0CH1 with G1CH0, G1CH1). The result event (of G0CH1) should trigger the DMA Transfer.
As there are two ADC Groups and therefore different group result registers, i would like to use a DMA Transfer with a linked list for the source/destination adress.

Here is my code:


uint16_t verify_ADC_Result1[2],verify_ADC_Result2[2];
XMC_DMA_LLI_t liste1, liste2;

void DmaInit(void)
{
XMC_DMA_LLI_t liste1 =
{
.src_addr = (uint32_t)&VADC_G0->RES[0],
.dst_addr = (uint32_t)&verify_ADC_Result1[0],
.llp = &liste2,
.block_size = 8,
.dst_transfer_width = XMC_DMA_CH_TRANSFER_WIDTH_16,
.src_transfer_width = XMC_DMA_CH_TRANSFER_WIDTH_16,
.dst_address_count_mode = XMC_DMA_CH_ADDRESS_COUNT_MODE_INCREMENT,
.src_address_count_mode = XMC_DMA_CH_ADDRESS_COUNT_MODE_INCREMENT,
.dst_burst_length = XMC_DMA_CH_BURST_LENGTH_8,
.src_burst_length = XMC_DMA_CH_BURST_LENGTH_8,
.enable_dst_linked_list = true,
.enable_src_linked_list = true,
.transfer_flow = XMC_DMA_CH_TRANSFER_FLOW_P2M_DMA,
.enable_src_gather = true,
.enable_dst_scatter = false,
};
XMC_DMA_LLI_t liste2 =
{
.enable_interrupt = true,
.src_addr = (uint32_t)&VADC_G1->RES[0],
.dst_addr = (uint32_t)&verify_ADC_Result2[0],
.llp = 0,
.block_size = 8,
.dst_transfer_width = XMC_DMA_CH_TRANSFER_WIDTH_16,
.src_transfer_width = XMC_DMA_CH_TRANSFER_WIDTH_16,
.dst_address_count_mode = XMC_DMA_CH_ADDRESS_COUNT_MODE_INCREMENT,
.src_address_count_mode = XMC_DMA_CH_ADDRESS_COUNT_MODE_INCREMENT,
.dst_burst_length = XMC_DMA_CH_BURST_LENGTH_8,
.src_burst_length = XMC_DMA_CH_BURST_LENGTH_8,
.enable_dst_linked_list = true,
.enable_src_linked_list = true,
.transfer_flow = XMC_DMA_CH_TRANSFER_FLOW_P2M_DMA,
.enable_src_gather = true,
.enable_dst_scatter = false,
};

XMC_DMA_CH_CONFIG_t GPDMA0_Ch0_config =
{
{
.enable_interrupt = true,
.dst_transfer_width = XMC_DMA_CH_TRANSFER_WIDTH_16,
.src_transfer_width = XMC_DMA_CH_TRANSFER_WIDTH_16,
.dst_address_count_mode = XMC_DMA_CH_ADDRESS_COUNT_MODE_INCREMENT,
.src_address_count_mode = XMC_DMA_CH_ADDRESS_COUNT_MODE_INCREMENT,
.dst_burst_length = XMC_DMA_CH_BURST_LENGTH_8,
.src_burst_length = XMC_DMA_CH_BURST_LENGTH_8,
.enable_src_gather = true,
.enable_dst_scatter = false,
.transfer_flow = XMC_DMA_CH_TRANSFER_FLOW_P2M_DMA,
},
.src_gather_interval = 1,
.src_gather_count = 1,
.dst_scatter_interval = 0,
.dst_scatter_count = 0,
.block_size = 8,
.transfer_type = XMC_DMA_CH_TRANSFER_TYPE_MULTI_BLOCK_SRCADR_LINKED_DSTADR_LINKED,
.priority = XMC_DMA_CH_PRIORITY_7,
.src_handshaking = XMC_DMA_CH_SRC_HANDSHAKING_HARDWARE,
.src_peripheral_request = DMA0_PERIPHERAL_REQUEST_VADC_G0SR2_1,
.linked_list_pointer = &liste1,
};
XMC_DMA_Init(XMC_DMA0);
XMC_DMA_CH_Init(XMC_DMA0, 0, &GPDMA0_Ch0_config);
XMC_DMA_CH_EnableEvent(XMC_DMA0, 0U, XMC_DMA_CH_EVENT_TRANSFER_COMPLETE);
NVIC_SetPriority(GPDMA0_0_IRQn, 9U);
NVIC_EnableIRQ(GPDMA0_0_IRQn);
XMC_DMA_CH_Enable(XMC_DMA0, 0);
}


Somehow i don´t get into my DMA interrupt handler and there is only one result in verify_ADC_Result1[0].
If i manually check verify_ADC_Result1[] and verify_ADC_Result2[] without the DMA by the ADC interrupt handler i get all results.
I just don´t get what is missing in my code.
The example did not help.
https://www.infineonforums.com/threads/3079-Linked-list-multi-block-DMA-transfer-with-DAVE-4-XMCLib
Please help without Apps.

Kind regards Gera
0 Likes
1 Reply
lock attach
Attachments are accessible only for community members.
User10505
Level 1
Level 1
Hi,

here are two examples...but I can´t creat a project with 2Channels???

0 Likes