Hi all,
**********************************************************************************
I want to test the DDR3 bandwidth.
In the beginning, I used the codes below to test if the DDR3 controller's configuration was OK.
while(1) { *(DDR3_ADDR) = temp_w;//w temp_r = *(DDR3_ADDR);//r if(temp_w == temp_r) break; temp_w++; DDR3_ADDR++; }
Then the test was OK and I could find the data I wanted to write into the DDR3 using Memory Broswer in CCSv5.3.
**********************************************************************************
Then I tried to use EDMA to move data from DDR3 to DDR3.
My code was based on the EDMA examples in MCSDK and used the SYS/BIOS.
static Int32 EDMA_test (Int32 instNum, Uint8 channelNum);
In the main function, I called this sub function with this code below
EDMA_test(1,6);
means that I used the channel 6 in EDMACC1.
The example code works on ping-pong mode. But I don't need this. So I changed the code to just move data from src to dst.
1.Firstly, I changed the src and dst addresses.
Uint16 * srcBuff1 = (Uint16 *)0x10800000;//src,L2 Uint16 * dstBuff1= (Uint16 *)0x80000000;//dst,DDR3
2. Secondly, I initialized the data in the src and dst addresses.
for (loopIndex = 0; loopIndex < 256; loopIndex++) { srcBuff1[loopIndex] = 0xABCD; dstBuff1[loopIndex] = 0; }
3. Then the code initialized the EDMA3 module, EDMA3 channel, param set and so on. This part was same as the example codes without any changes.
CSL_edma3Init(&context) hModule = CSL_edma3Open(&edmaObj, instNum, NULL, &status); chAttr.regionNum = CSL_EDMA3_REGION_GLOBAL; chAttr.chaNum = channelNum; chChannel = CSL_edma3ChannelOpen(&chObj, instNum, &chAttr, &status); CSL_edma3HwChannelSetupQue(hChannel,CSL_EDMA3_QUE_3); CSL_edma3MapDMAChannelToParamBlock (hModule, channelNum, 2); hParamPing = CSL_edma3GetParamHandle(hChannel, 2, &status);
4. After that, I modified the param set. Acnt=256, bcnt=ccnt=1 without LINK.
myParamSetup.option = CSL_EDMA3_OPT_MAKE(CSL_EDMA3_ITCCH_DIS, \ CSL_EDMA3_TCCH_DIS, \ CSL_EDMA3_ITCINT_DIS, \ CSL_EDMA3_TCINT_EN, \ 0x6, CSL_EDMA3_TCC_NORMAL,\ CSL_EDMA3_FIFOWIDTH_NONE, \ CSL_EDMA3_STATIC_EN, \ CSL_EDMA3_SYNC_A, \ CSL_EDMA3_ADDRMODE_INCR, \ CSL_EDMA3_ADDRMODE_INCR ); myParamSetup.srcAddr = (Uint32)srcBuff1; myParamSetup.aCntbCnt = CSL_EDMA3_CNT_MAKE(256,1); myParamSetup.dstAddr = (Uint32)dstBuff1; myParamSetup.srcDstBidx = CSL_EDMA3_BIDX_MAKE(0,0); myParamSetup.linkBcntrld= 0xFFFF; myParamSetup.srcDstCidx = CSL_EDMA3_CIDX_MAKE(0,0); myParamSetup.cCnt = 1; if (CSL_edma3ParamSetup(hParamPing,&myParamSetup) != CSL_SOK) { printf ("Error: EDMA Parameter Entry Setup failed\n"); return -1; }
5. Then I enabled the transfer completion interrupt.
/* Interrupt enable (Bits 0-1) for the global region interrupts */ regionIntr.region = CSL_EDMA3_REGION_GLOBAL; regionIntr.intr = 0x40; regionIntr.intrh = 0x0000; CSL_edma3HwControl(hModule,CSL_EDMA3_CMD_INTR_ENABLE,®ionIntr);
6.Triggered the EDMA manually.
CSL_edma3HwChannelControl(hChannel,CSL_EDMA3_CMD_CHANNEL_SET,NULL);
7. Finally, polled the completion interrupt bit.
regionIntr.region = CSL_EDMA3_REGION_GLOBAL; regionIntr.intr = 0; regionIntr.intrh = 0; do { CSL_edma3GetHwStatus(hModule,CSL_EDMA3_QUERY_INTRPEND,®ionIntr); } while (!(regionIntr.intr & 0x40));
*******************************************************************
With this codes above I set the src and dst address in L2, the completion interrupt bit raises and I can find the data in the dst.
But the problem is,
When I set the src address in L2 and the dst address in DDR3, the completion interrupt bit raises but I can not find the data in the dst!!
*******************************************************************
So, can anyone one help me? I'll appreciate that!