This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

EDMA Data Sorting



各位专家好:

         我在使用EDMA3进行数据转置搬移(DDR3 -> DDR3)时,采用AB型同步,根据资料需要传输CCNT 次才能传输完成;

        但现在调试发现只需要一次传输就可以转置完成,这是为什么?  (66AK2L06);

         如果传输CCNT次,第二次传输就会报错“edma3_test: Event Miss Occured!!!”,这是为什么?

另外,这还有个QMSS与EDMA3的问题: 请您指导一下。


         与EDMA3相关的程序如下所示:

         hEdma = edma3init(edmaInstance, &edmaResult);
        if (hEdma)
        {
            printf("edma3init() Passed\n");
        }
        else
        {
            printf("edma3init() Failed, error code: %d\n", (int)edmaResult);
        }

//        tcc = EDMA3_DRV_TCC_ANY;
//        chId= EDMA3_DRV_DMA_CHANNEL_ANY;
        result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc, (EDMA3_RM_EventQueue)0, &callback1, NULL);      //&callback1
        if (result == EDMA3_DRV_SOK)
        {
            printf("DMA channel 0: %d\n", chId);
        }
        else
        {
            printf("DMA channel 0 request failed!\n");
        }
        /* Fill the PaRAM Set with transfer specific information */
        paramSet.srcAddr    = (uint32_t)(Data);
        paramSet.destAddr   = (uint32_t)(Data_Twi);

        /**
        * Be Careful !!!
        * Valid values for SRCBIDX/DSTBIDX are between -32768 and 32767
        * Valid values for SRCCIDX/DSTCIDX are between -32768 and 32767
        */
        paramSet.srcBIdx    = acnt;
        paramSet.destBIdx   = acnt*ccnt;
        paramSet.srcCIdx    = acnt*bcnt;
        paramSet.destCIdx   = acnt;

        /**
        * Be Careful !!!
        * Valid values for ACNT/BCNT/CCNT are between 0 and 65535.
        * ACNT/BCNT/CCNT must be greater than or equal to 1.
        * Maximum number of bytes in an array (ACNT) is 65535 bytes
        * Maximum number of arrays in a frame (BCNT) is 65535
        * Maximum number of frames in a block (CCNT) is 65535
        */

        paramSet.aCnt       = acnt;  //4
        paramSet.bCnt       = bcnt;  //128
        paramSet.cCnt       = ccnt;  //2048

        paramSet.linkAddr   = 0xFFFFU;
        paramSet.opt        = 0x00900004u;
        result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
        if (result == EDMA3_DRV_SOK)
        {
            printf("EDMA3_DRV_setPaRAM() Passed\n");
        }
        else
        {
            printf("EDMA3_DRV_setPaRAM() Failed, error code: %d\n", (int)edmaResult);
        }

        for (i = 0; i < ccnt; i++)
        {
            irqRaised1 = 0;
            result = EDMA3_DRV_enableTransfer (hEdma, chId,  EDMA3_DRV_TRIG_MODE_MANUAL);
            if (result != EDMA3_DRV_SOK)
            {
                printf ("edma3_test: EDMA3_DRV_enableTransfer " \
                    "Failed, error code: %d\r\n", (int)result);
            }

//            printf ("%d \n", i);
            while (irqRaised1 == 0u)
            {
                /* Wait for the Completion ISR. */
                printf ("waiting for interrupt...\n");
            }

            /* Check the status of the completed transfer */
            if (irqRaised1 < 0)
            {
                /* Some error occured, break from the FOR loop. */
                printf ("\r\nedma3_test: Event Miss Occured!!!\r\n");

                /* Clear the error bits first */
                result = EDMA3_DRV_clearErrorBits (hEdma, chId);
            }
       }
            for(k=0; k<128; k++)
            {
                for(jj=0; jj<2048; jj++)
                {
                    if((Data[jj*128+k].real == Data_Twi[k*2048+jj].real) || (Data[jj*128+k].imag == Data_Twi[k*2048+jj].imag))
                    {
                        ;
                    }
                    else
                    {
                        printf("(%d , %d)", k,jj);
                    }
                }
            }

            k = 0;