硬件平台OMAPL138
我在测试一个简单的功能,使用EDMA3通过总线EMIFA 读取FPGA的值。同时使用CPU直接通过EMIFA读取FPGA做对比。
EDMA3设置为A模式,ACOUNT:320*2, BCOUNT:1, CCOUNT:1
EMIFA使能16bit读取
测试现象是:CPU读值正常,EDMA3读值会出现相邻的两个值相等。
举例:
CPU取值为 1 2 3 4 5 6 7 9 10
EMDA取值为 1 1 2 2 3 3 4 4 5 5
如果相同的EDMA3设置,把源地址改成一个内存地址,取值就正常。
推测EDMA3读值的源地址的增加与EMIFA不匹配导致异常。
我反复研究用户手册,也没有看到EMIFA在使能EDMA3时,需要额外设置什么。请大神指点一下:
附:
short chkadtemp[320];
EDMA3读FPGA程序
void chkad(void)
{
short loop, i, *ptr;
memset(chkadtemp, 0 ,sizeof(chkadtemp));
eDMAParamSet.srcAddr = EMIF_YC_ADDR;
eDMAParamSet.destAddr = chkadtemp; AD_ReadWithEDMA();
printf("\r\n start*************\r\n");
for(loop=0;loop<4;loop++)
{
for(i=0; i<80; i++)
{
printf("%d ,",chkadtemp[i+loop*80]);
}
printf("—-\n\n");
}
printf("\r\n end*************\r\n");
}
CPU读FPGA程序
void chkemifa(void)
{
short loop, i, *ptr;
memset(chkadtemp, 0 ,sizeof(chkadtemp));
for(loop=0; loop<320; loop++)
{
chkadtemp[loop] = EMIF_RD(EMIF_YC_ADDR, loop);
}
printf("\r\n start*************\r\n");
for(loop=0;loop<4;loop++)
{
for(i=0; i<80; i++)
{
printf("%d ,",chkadtemp[i+loop*80]);
}
printf("—-\n\n");
}
printf("\r\n end*************\r\n");
}
Tony Tang:
我想看看EMIFA与FPGA的硬件控制信号连接方式。
user4228367:
回复 Tony Tang:
Tong:
你是想看地址线怎么接的吧?
BA0被使能了,也连接到了FPGA上,但是在FPGA端的程序把这个脚忽略了,FPGA把自己使能成一个16bit设备。
其他控制信号就CS WE RD三个了。
其中我很困惑,EDMA3怎么知道EMIFA当前是不是16bit,寻址的时候会不会按32bit或者8bit寻址,如果寻址的方式不对,那上面的错误应该可以解释。
但是这一点怎么设置?
StarterWare中有一个EDMA3通过EMIFA读取FPGA的例程,设置很简单:使能A传输模式,然后ACOUNT=65536,BCOUNT=1,CCOUNT=1,EMIFA使能16bit寻址,然后就直接交给EDMA3了。
user4228367:
回复 user4228367:
EDMA3我使能其串口2的收发功能都正常
EMIFA总线通过CPU读写正常
相同配置下EDMA3从内存搬运到内存也正常
EDMA3读EMIFA总线,资料上就说直接读就可以了,也不需要额外设置。
这个问题我暂无思路
Shine:
请看一下是否设置了SAM=0, SRCBIDX=0?
user4228367:
回复 Shine:
Shine Zhang:
该设置没有问题,我自己在检查时也重点查看了这一点设置。我设置完OPT后,打印出来检查过。SRCBIDEX被设置成了ACOUNT,但其实因为我使能的的A模式,SRCBIDEX设置成0也可以。
附:
void AD_ReadWithEDMA(void){ unsigned int tccNum = 0; eDMAParamSet.opt = 0x00000000; // 编程 TCC eDMAParamSet.opt |= ((tccNum << EDMA3CC_OPT_TCC_SHIFT) & EDMA3CC_OPT_TCC); // 使能 Final 传输完成中断 eDMAParamSet.opt |= TCINTEN; eDMAParamSet.opt |= STATIC;
printf("opt->0x%08X\n",eDMAParamSet.opt); // 写参数 RAM EDMA3SetPaRAM(EDMA_EMIFA, edmaChNum, &eDMAParamSet); EDMA_MANNUL_ENABLE(edmaChNum);}
user4228367:
回复 user4228367:
由遇到过相似问题的大神吗?