各位专家好:
我在使用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, ¶mSet);
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;