AnsweredAssumed Answered

Ping Pong EDMA

Question asked by Lacouture Patrice on Sep 27, 2017
Latest reply on Oct 27, 2017 by Lacouture Patrice

Hello,

 

I want to store flexio data (FLEXIO_CAMERA_GetRxBufferAddress) into 2 buffers (Ping pong) with Flexio + EDMA:

 

- The First buffer will contain the first N data (step 1) when the buffer 1 is full, data will be written into buffer 2

-  the second buffer will contain N+1 data to 2*N  (step 2), when the buffer 2 is full, data will be written into buffer 1 ...

 

I am using MCUXpresso IDE v10.0.0_344 and SDK_2.2_TWR-K80F150M.

 

I succeed to write into the first buffer but not into the second buffer. Do you know why I can not write into the second buffer or have any example ?

 

Thank you in advance

Regards,

 

Patrice

 

Bellow my code

 

 

 

 

__attribute__((aligned(32))) uint32_t FrameBuffer1[BUFF_LENGTH] = {0U};
__attribute__((aligned(32))) uint32_t FrameBuffer2[BUFF_LENGTH] = {0U};
 /* User callback function for EDMA transfer. */
 void EDMA_Callback(edma_handle_t *handle, void *param, bool transferDone, uint32_t tcds)
 {
     if (transferDone)
     {
      isTransferCompleted = true;
     }
 }
void Max2769_Init_V2(void)
  {
  uint32_t errCount;
  edma_transfer_config_t transferConfig;
   edma_config_t edmaConfig;
   edma_handle_t g_edmaHandle;
   flexio_camera_edma_handle_t g_cameraEdmaHandle;
   flexio_camera_transfer_t cameraTransfer;
   isTransferCompleted = false;

     /*Init the flexio to the camera mode */
     FLEXIO_MAX2769Init();

     /* Configure DMAMUX */
     DMAMUX_Init(DMAMUX0);
     DMAMUX_SetSource(DMAMUX0, DMA_CHN_FLEXIO_TO_FRAMEBUFF, (s_FlexioMax2769Device. shifterStartIdx + 1U));
     DMAMUX_EnableChannel(DMAMUX0, DMA_CHN_FLEXIO_TO_FRAMEBUFF);
     /* Configure DMA */
     EDMA_GetDefaultConfig(&edmaConfig);
     EDMA_Init(DMA0, &edmaConfig);
     //First TCD ( to FrameBuffer1)
    
     s_TcdMemoryPtrFlexioToFrame[0].SADDR = FLEXIO_CAMERA_GetRxBufferAddress(&s_FlexioMax2769Device);
     s_TcdMemoryPtrFlexioToFrame[0].SOFF = 0;
     s_TcdMemoryPtrFlexioToFrame[0].ATTR =
     DMA_ATTR_SSIZE(kEDMA_TransferSize32Bytes) | DMA_ATTR_DSIZE(kEDMA_TransferSize32Bytes);
     s_TcdMemoryPtrFlexioToFrame[0].NBYTES = 32;
     s_TcdMemoryPtrFlexioToFrame[0].SLAST = 0;
     s_TcdMemoryPtrFlexioToFrame[0].DADDR = (uint32_t)&FrameBuffer1;
     s_TcdMemoryPtrFlexioToFrame[0].DOFF = 32;
     s_TcdMemoryPtrFlexioToFrame[0].CITER = 1;
     s_TcdMemoryPtrFlexioToFrame[0].DLAST_SGA = (uint32_t) &s_TcdMemoryPtrFlexioToFrame[1];
     s_TcdMemoryPtrFlexioToFrame[0].CSR = 0;
     s_TcdMemoryPtrFlexioToFrame[0].BITER = 1;
    
     //First TCD ( to FrameBuffer2)
     s_TcdMemoryPtrFlexioToFrame[1].SADDR = FLEXIO_CAMERA_GetRxBufferAddress(&s_FlexioMax2769Device);
     s_TcdMemoryPtrFlexioToFrame[1].SOFF = 0;
     s_TcdMemoryPtrFlexioToFrame[1].ATTR =
     DMA_ATTR_SSIZE(kEDMA_TransferSize32Bytes) | DMA_ATTR_DSIZE(kEDMA_TransferSize32Bytes);
     s_TcdMemoryPtrFlexioToFrame[1].NBYTES = 32;
     s_TcdMemoryPtrFlexioToFrame[1].SLAST = 0;
     s_TcdMemoryPtrFlexioToFrame[1].DADDR = (uint32_t)&FrameBuffer2;
     s_TcdMemoryPtrFlexioToFrame[1].DOFF = 32;
     s_TcdMemoryPtrFlexioToFrame[1].CITER = 1;
     s_TcdMemoryPtrFlexioToFrame[1].DLAST_SGA = (uint32_t) &s_TcdMemoryPtrFlexioToFrame[0];
     s_TcdMemoryPtrFlexioToFrame[1].CSR = 0;
     s_TcdMemoryPtrFlexioToFrame[1].BITER = 1;
     // DMA INIT
     EDMA_CreateHandle(&g_edmaHandle, DMA0, DMA_CHN_FLEXIO_TO_FRAMEBUFF);
     EDMA_SetCallback(&g_edmaHandle, EDMA_Callback, NULL);
     EDMA_TcdSetTransferConfig(&s_TcdMemoryPtrFlexioToFrame[0], &transferConfig, &s_TcdMemoryPtrFlexioToFrame[1]);
     EDMA_InstallTCDMemory(&g_edmaHandle, s_TcdMemoryPtrFlexioToFrame, 2);
     EDMA_PrepareTransfer(&transferConfig, (void *)FLEXIO_CAMERA_GetRxBufferAddress(&s_FlexioMax2769Device), 32,  FrameBuffer1,
                                       32, 32, sizeof(FrameBuffer1) , kEDMA_PeripheralToMemory);
     EDMA_SubmitTransfer(&g_edmaHandle, &transferConfig);
     EDMA_StartTransfer(&g_edmaHandle);
     FLEXIO_CAMERA_EnableRxDMA(&s_FlexioMax2769Device, true);
   while (!(isTransferCompleted))
   {
  }
   sTransferCompleted= false;
  
   /* debug */
  for(uint32_t i=0;i<64;i++)
     {
     printf("0x%08X\n", FrameBuffer1[i]);
     }
  errCount =0;
  for(uint32_t i=0;i<BUFF_LENGTH;i++)
  {
         if (FrameBuffer1[i] != i+1)
         {
          errCount++;
         }
  }
   printf("errorCount == %d\n", errCount);
     
   while (!(isTransferCompleted))
   {
  }
   PRINTF("isTransferCompleted : \n");
 /* debug */
  for(uint32_t i=0;i<64;i++)
     {
     printf("0x%08X\n", FrameBuffer2[i]);
     }
errCount =0;
  for(uint32_t i=0;i<BUFF_LENGTH;i++)
  {
         if (FrameBuffer1[i] != i+1)
         {
          errCount++;
         }
  }
   printf("errorCount == %d\n", errCount);
  
  }

Original Attachment has been moved to: code.c.zip

Outcomes