Hello!
I've got a strange problem of the edma and the timing of emifa. My project is about external GPIO4 interupt triggers the edma and the edma is transfering data from EMIFA CE2 to L2 sram. I use the chipscope of FPGA to see the signals of EMIFA and I found a really strange problem. The timing of EMIFA is affected by the data amout of edma. The data width of EMIFA is 64 bit and the clock of EMIFA is 100MHz. If the amount of edma transfer is less than 1024*64bit, the timing of EMIFA is correct. But if the amount is larger than 1024*64bits, the timing of EMIFA isn't correct, especially the signal of CE2 and OE. These two signals stop for one clock every 15 data, as the picture shows below.
Under normal conditions, the signal of CE2 and OE should be low until the total transfer is over, while the picture shows that these stop for one clock and continues to transfer.
The EMIFA is configured to 64 bit width and standard synchronous FIFO read. Here is the configuration of EMIFA.
CSL_EmifaSync syncMem = { (Uint8)CSL_EMIFA_SYNCCFG_READBYTEEN_DEFAULT, \
(Uint8)CSL_EMIFA_SYNCCFG_CHIPENEXT, \
(Uint8)CSL_EMIFA_SYNCCFG_READEN, \
(Uint8)CSL_EMIFA_SYNCCFG_WLTNCY_DEFAULT, \
(Uint8)CSL_EMIFA_SYNCCFG_RLTNCY_1CYCLE, \
(Uint8)CSL_EMIFA_SYNCCFG_SBSIZE_64BIT \
};
/* setting for synchronous type */
syncVal.ssel = 1; //EMIFA_MEMTYPE_SYNC
syncVal.async = NULL;
syncVal.sync = &syncMem;
/* setup the hardware parameters */
hwSetup.asyncWait = NULL;
hwSetup.ceCfg[0] = &syncVal; //CE2
hwSetup.ceCfg[1] = NULL; //CE3
hwSetup.ceCfg[2] = NULL; //CE4
hwSetup.ceCfg[3] = NULL; //CE5
The edma is configured to transfer 1024*64bit data in the interrupt service of GPIO4 int. Here is the configuration of the edma3.
/* Setup the first param set */
myParamSetup.option = CSL_EDMA3_OPT_MAKE (CSL_EDMA3_ITCCH_DIS, \
CSL_EDMA3_TCCH_DIS, \
CSL_EDMA3_ITCINT_DIS, \
CSL_EDMA3_TCINT_EN,\
0, CSL_EDMA3_TCC_NORMAL,\
CSL_EDMA3_FIFOWIDTH_NONE, \
CSL_EDMA3_STATIC_EN, \
CSL_EDMA3_SYNC_AB, \
CSL_EDMA3_ADDRMODE_INCR, \
CSL_EDMA3_ADDRMODE_INCR
);
myParamSetup.srcAddr = EMIFA_CE2_BASE_ADDR;
myParamSetup.aCntbCnt = CSL_EDMA3_CNT_MAKE(8,1024);
myParamSetup.dstAddr = L2_DATA_ADDR;
myParamSetup.srcDstBidx = CSL_EDMA3_BIDX_MAKE(8,8);
myParamSetup.linkBcntrld = CSL_EDMA3_LINKBCNTRLD_MAKE(CSL_EDMA3_LINK_NULL,0);
myParamSetup.srcDstCidx = CSL_EDMA3_CIDX_MAKE(0,0);
myParamSetup.cCnt = 1;
If I change the number 1024 to any number between 1-1023, the timing of EMIFA is correct. If I set the number equal or larger than 1024, the timing of EMIFA isn’t correct.
I need your help, thanks for your reply!



