阅读:1123回复:2
请教一个9054读写RAM的问题
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); |
|
最新喜欢:mapofl |
沙发#
发布于:2002-08-23 16:15
先把LOCAL的时钟降下来,确定不是硬件的问题.
|
|
|
板凳#
发布于:2002-08-24 11:02
LCLK是32M。不知怎么回事,我把原来的程序重新写入7128,再读或者写RAM就死机,用示波器看是LHOLDA一直为高,可是这和原来的程序是一样的呀?原来还是能读写RAM的,奇怪。我把LHOLDA和7128断开,把LHOLD和LHOLDA直接相连,这回是读写都没有问题了(没有数据出错现象)。可是我用示波器看了7128的那个输出脚(原来接LHOLDA的引脚)也没有一直为高啊,可是为什么一但接到一起就不对了呢?
|
|