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.

[参考译文] Linux/AM3352:GPMC 多重读取问题

Guru**** 2964230 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/674417/linux-am3352-gpmc-multiple-read-issue

器件型号:AM3352

工具/软件:Linux

大家好:

在我的设计中、AM335x 的 GPMC 方向性在 MVB 器件的帮助下连接到 SRAM、MVB 器件可以接收来自 GPMC 总线的 CS、WR、RD 信号、然后决定将 CS、WR、RD 信号发送到 SRAM。

我将 GPMC 配置为非多路复用连接的器件、连接16位、使用 wait1输入引脚、读取/写入异步、并尽可能长地设置时序、因为连接是间接的、因此我们必须降低速度。

在执行完所有以下操作后,我可以通过单个读取和写入 SRAM,也可以 通过示波器获取正确的时序序列,并获得正确的地址行值和数据行值,但是!!!!!!!

如果我对 SRAM 执行封面测试、例如将0xFFF 写入 SRAM 的所有地址、 然后读取所有数据、始终无法获得所需结果、有时我发现读取值错误、但当我手动读取同一地址时、我发现返回读取值正确!  

首先、我想读/写访问之间的间隔是短的、然后我将寄存 器 CYCLE2CYCLEDELAY 设置为15、启用 CYCLE2CYCLEDIFFCSEN 和 CYCLE2CYCLESAMECSEN、但修改操作似乎无用、我可以发现读/写周期长达2us、足够长 但还是得到同样的结果,我被这个问题困扰了将近半个月,请帮我!! 非常感谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我看不到我们如何根据这些信息为您提供帮助。 我们没有硬件来复制您的用例、我们不知道您是如何进行测试的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复,我的核心问题是:在单个 GPMC 读/写操作全部正确时,是否有任何问题会影响 GPMC 的连续读/写操作? 或者是否有其他人与我的情况相同?


    我的连续 GPMC 读/写测试代码如下:

    for (iTestStep=0;iTestStep<4;iTestStep++)
    {
    for (iAddrLoop = WRTEST_START_ADDR;iAddrLoop <(WRTEST_START_ADDR + MVBSRAM_memsize);iAddrLoop += 2)
    {
    //准备数据
    memset (aucWriteBuf、0、2);

    aucWriteBuf[1]=(usWriteValue[iTestStep]& 0x00FF);
    aucWriteBuf[0]=(usWriteValue[iTestStep]& 0xFF00)>8;

    //写入
    写入(fdTargetDev、&raucWriteBuf、iAddrLoop);
    usleep(100);
    }
    usleep(2000000);
    for (iAddrLoop = WRTEST_START_ADDR;iAddrLoop <(WRTEST_START_ADDR + MVBSRAM_memsize);iAddrLoop += 2)
    {
    memset (aucReadBuf、0、2);
    //读取
    读(fdTargetDev、&ReadaucBuf、iAddrLoop);
    usleep(100);
    读(fdTargetDev、&ReadaucBuf、iAddrLoop);
    if ((aucReadBuf[1]!=(usWriteValue[iTestStep]& 0x00FF))||\
    (aucReadBuf[0]!=(usWriteValue[iTestStep]& 0xFF00)>8)
    {
    printf ("地址0x%x 中出错!\n"、iAddrLoop);
    printf ("\t 读取数据 H 为0x%x\r\n"、aucReadBuf[1]);
    printf ("\t 读取数据 L 为0x%x\r\n"、aucReadBuf[0]);
    }
    //usleep(1000);
    }

    printf ("完成 SRAM 测试步骤%d\n"、iTestStep);
    }

    我的单个 GPMC 读/写测试代码如下:

    /*
    函数名称:MvbSram_WriteTest
    *
    void MvbSram_WriteTest (int fdTargetDev)
    {
    unsigned char tempbubuy[2]={0};

    int iWriteAddr、iWriteValue;

    printf ("\r\n 请输入写入地址:");

    scanf ("%x"、&iWriteAddr);

    printf ("\r\n 请输入写入值:");

    scanf ("%x"、&iWriteValue);

    printf ("\r\nstart to write value 0x%x to addr 0x%x.\r\n\r\n、iWriteValue、iWriteAddr);

    tempbuff[0]=(char)(iWriteValue & 0x00FF);
    tempbuff[1]=(char)((iWriteValue & 0xFF00)>>8);

    //写入
    写入(fdTargetDev、tempbuff、(size_t) iWriteAddr);

    返回;
    }

    /*
    函数名称:MvbSram_ReadTest
    *
    void MvbSram_ReadTest (int fdTargetDev)
    {
    unsigned char tempbubuy[2]={0};

    int iReadAddr、iReadValue;

    printf ("\r\n 请输入读 addr:");

    scanf ("%x"、&iReadAddr);

    printf ("\r\nstart to read value from addr 0x%x.\r\n"、iReadAddr);

    读取(fdTargetDev、tempbuff、(size_t)(iReadAddr));
    iReadValue =(int)((tempbuff[0]& 0x00FF)|(tempbuff[1]& 0x00FF)<<8);

    //读取
    printf ("\r\n 从 addr 0x%x 返回的读取值为0x%x.\r\n\r\n、iReadAddr、iReadValue);

    返回;
    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不、我们没有听说过任何连续 GPMC 读取的问题。 很多客户使用 GPMC 进行 XIP 引导、这正是这样。 请检查您的测试程序、尤其是数据类型不匹配的情况。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是因为中间 MVB 器件(芯片)? 我被告知时间安排应该更长
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    现在我尝试在读取/写入访问之间增加延迟时间(10us),连续 GPMC 读取/写入结果将会更好,但仍然显示数十个错误