This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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");
}

  • 我想看看EMIFA与FPGA的硬件控制信号连接方式。 

  • 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了。

  • EDMA3我使能其串口2的收发功能都正常

    EMIFA总线通过CPU读写正常

    相同配置下EDMA3从内存搬运到内存也正常

    EDMA3读EMIFA总线,资料上就说直接读就可以了,也不需要额外设置。

    这个问题我暂无思路

  • 请看一下是否设置了SAM=0, SRCBIDX=0?

  • 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);
    }

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