Quantcast
Channel: Infineon Forums
Viewing all articles
Browse latest Browse all 9892

DMA with Linked List

$
0
0
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:

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/threa...-DAVE-4-XMCLib
Please help without Apps.

Kind regards Gera

Viewing all articles
Browse latest Browse all 9892

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>