zab
zab
驱动小牛
驱动小牛
  • 注册日期2001-07-04
  • 最后登录2008-01-10
  • 粉丝0
  • 关注0
  • 积分126分
  • 威望14点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
阅读:1123回复:2

请教一个9054读写RAM的问题

楼主#
更多 发布于:2002-08-23 15:17
9054的LOCAL端有256K的SRAM(CY721021-15两片),映射到LOCAL SPACE0,32位,burst,prifetch方式禁止。通过EPM7128SLC-15做时序的匹配。我用9054的SDK中的API函数写RAM,每次写0X1000个DWORD,然后再用API函数读出数据进行校验,发现数据偶尔出错(几次)。但是如果我每次写0X100个DWORD,出错次数就会增加;如果我只写0X1000个然后就读出校验则没有错误,也就是说如果连续写RAM次数增加则出错增加。可是如果我用PLXMON的fillmemory以一定方式写入RAM中,再用API函数读出校验就没有问题。也就是说读RAM没有问题,但是为什么用API函数写有问题而用fillmemory没有问题呢?如果是时序的问题,那么用fillmemory应该也有问题才对啊?不知fillmemory使用的什么方式写的RAM?
另外,我用WINDRIVER时也是这样。
程序如下:


#define BUFFERSIZE 0x1000//缓冲区大小,每次写的DWORD数
#define RAMSIZE 0X40000//RAM总大小,256K
U32  BufferDest[BUFFERSIZE];//[0x4];
U32  BufferSrc[BUFFERSIZE];//[0x4];
//////////////////////////////////////
int ii,jj,Num_error=0;
U32 data;
//////////////////////////////////////


/*********************************************/
data=0;

for(ii=0;ii<RAMSIZE/(BUFFERSIZE*sizeof(U32));ii++)
//共写0X40000/0X1000/4=0X10次
{
    for(jj=0;jj<BUFFERSIZE;jj++,data++)
BufferSrc[jj]=data;//数据从0开始以1为步距递增
    rc = PlxBusIopWrite(
             hDevice,
                IopSpace,
             ii*BUFFERSIZE*sizeof(U32),
                FALSE,             // No Re-map
             BufferSrc,
                sizeof(BufferSrc),
                BitSize32
             );

    if (rc != ApiSuccess)
        {
        printf(\"*ERROR* - Write failed, code = %d\\n\", rc);
        return;
        }
}
printf(\"Ok\\n\");

/**********************************************************/
data=0;

for(ii=0;ii<RAMSIZE/(BUFFERSIZE*sizeof(U32));ii++)
    {
    for(jj=0;jj<BUFFERSIZE;jj++,data++)
BufferSrc[jj]=data;


    rc = PlxBusIopRead(
             hDevice,
             IopSpace,
             ii*BUFFERSIZE*sizeof(U32),
             FALSE,               // No Re-map
             BufferDest,
             sizeof(BufferDest),
             BitSize32
             );

    if (rc != ApiSuccess)
    {
        printf(\"*ERROR* - Read failed, code = %d\\n\", rc);
        return;
    }

    if (memcmp(
            BufferSrc,
            BufferDest,
            sizeof(BufferSrc)
            ) != 0)
    {
        Num_error++;
    }

}
    
printf(\"Verifying data Num_error:%d\\n\",Num_error);

最新喜欢:

mapoflmapofl
jst7792
论坛版主
论坛版主
  • 注册日期2001-12-10
  • 最后登录2006-11-16
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-08-23 16:15
先把LOCAL的时钟降下来,确定不是硬件的问题.
兄弟们,给点分吧
zab
zab
驱动小牛
驱动小牛
  • 注册日期2001-07-04
  • 最后登录2008-01-10
  • 粉丝0
  • 关注0
  • 积分126分
  • 威望14点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-08-24 11:02
LCLK是32M。不知怎么回事,我把原来的程序重新写入7128,再读或者写RAM就死机,用示波器看是LHOLDA一直为高,可是这和原来的程序是一样的呀?原来还是能读写RAM的,奇怪。我把LHOLDA和7128断开,把LHOLD和LHOLDA直接相连,这回是读写都没有问题了(没有数据出错现象)。可是我用示波器看了7128的那个输出脚(原来接LHOLDA的引脚)也没有一直为高啊,可是为什么一但接到一起就不对了呢?
游客

返回顶部