我的project是外部GPIO4中断触发edma,edma从EMIFA CE2搬运数据至L2 SRAM。EMIFA配置成64位数据宽度,同步FIFO读模式,时钟为100MHz。利用Chipscope查看EMIFA的时序存在一个奇怪的问题。EMIFA的时序受edma搬运的数据量影响。当一次的edma的数据量小于1024*64bits,EMIFA的时序正常;当一次的edma的数据量大于等于1024*64bits,EMIFA的时序出现问题,尤其是CE2和OE信号,这两个信号每隔15个数据点停一个周期,如图所示。
在正常情况下,CE2和OE信号应该保持低电平直到一次传输完毕,而上图显示的情况则是一次传输中会有多次停顿。
EMIFA配置成64位数据宽度,同步FIFO读模式,时钟为100MHz。下面是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
EDMA每次传输1024个64bit数据。下面是EDMA的配置。
/* 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;
如果将传输数据量改成1-1023之间任何数,EMIFA的时序都是正确的。如果数据量设置成大于等于1024,EMIFA的时序出现问题。
I need your help, thanks for your reply!
Jacob1:
你好,看你这个仿真软件是Chipscope,是否还连接了FPGA?
Thomas Young:
回复 Jacob1:
恩,是的,谢谢你的回答!我已经在TI E2E上找到解决方法了。
Jacob1:
回复 Thomas Young:
你好,能否将您找到的解决方法发出来,我们也好学习一下,呵呵。