TI中文支持网
TI专业的中文技术问题搜集分享网站

EDMA3通过EMIFA读FPGA时,取值异常!

硬件平台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:

由遇到过相似问题的大神吗?

赞(0)
未经允许不得转载:TI中文支持网 » EDMA3通过EMIFA读FPGA时,取值异常!
分享到: 更多 (0)