|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
9054板卡采用的是plx_sdk的驱动,写了个应用程序,读取文件大约1Mbyte大小,存到片外sdram中,
然后再读回来。采用的是scatter/gather DMA方式。
我先在vc程序中把分配的内存,全初始化为“c”,然后装载文件,这部分内存就被文件内容覆盖,
然后通过sglDMA传入sdram,(当然写的内存被释放了的)。等传完了才读取。读取分配的内存我初始化
为“f”,然后等sdram传入的数据来进行覆盖,最后把这段分配的内存用writehuge()还原文件,然后
和原文件比较,发现只要有不同的地方都是“f”,说明这段内存没有被影响,就是说没有数据覆盖,
其他的地方都是正确的。我采用的是40M的时钟频率,9054采用C模式。
具体表现如下:
0001252fh: 62 53 46 59 68 92 64 68 94 92 45 12 0A F5 CD 69
00012530h: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
...........
0001253ah: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF //有11行的FF
0001253bh: B1 68 C8 07 5E 4F 4A C4 0D 86 EB 57 AD 65 39 14
........
0001254bh: 3C 9F C6 BA 7A 63 BF 4A 6B E3 A8 3C 51 B0 74 25 //这17行都是正确的和原文件对应的
0001254ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
.........
00012556h: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF //又出现11行的FF,极少时候又有数据
00012557h: FA 52 39 07 A5 4B 64 31 AE 41 E0 1E 71 4E 52 F5
.......又隔一段(长度不确定)再出现上面的情况
其中有数据的都是和原文件对应的,没有错位的情况,我想问一下那些中间的数据到哪去了?
如果我的SDRAM有问题,至少也应该把FF给覆盖掉。
因为我用的是scatter/gatter DMA
控制9054内部FIFO的空满状态局部端用的是LHOLD和blast(都是由9054发出)控制的,
而host端口是9054内部和PCI端口就协议好的吧
我采用的驱动,是PLX自己带的api函数
我曾经就是想问题就可能出现在9054内部FIFO空满的时候,但是我修改eeprom的值:
比如: Local register(08):Enable Pause Timer ,Pause Timer我给的为08
Release Bus on FIFO Full(read)/Empty(write);
防止内部FIFO出现空满的时候丢失数据
下面的是VC中初始化DMA的情况
// Initialize the DMA channel
DmaDesc.EnableReadyInput = 1;
DmaDesc.EnableBTERMInput = 0;
DmaDesc.EnableIopBurst = 1;
DmaDesc.EnableWriteInvalidMode = 0;
DmaDesc.EnableDmaEOTPin = 0;
DmaDesc.DmaStopTransferMode = AssertBLAST;
DmaDesc.HoldIopAddrConst = 0;
DmaDesc.HoldIopSourceAddrConst = 0;
DmaDesc.HoldIopDestAddrConst = 0;
DmaDesc.DemandMode = 1;
DmaDesc.EnableTransferCountClear = 0;
DmaDesc.WaitStates = 0;
DmaDesc.IopBusWidth = 3; // 32-bit
DmaDesc.EOTEndLink = 0;
DmaDesc.ValidStopControl = 0;
DmaDesc.ValidModeEnable = 0;//
DmaDesc.EnableDualAddressCycles = 0;
DmaDesc.Reserved1 = 0;
DmaDesc.TholdForIopWrites = 0;
DmaDesc.TholdForIopReads = 0;
DmaDesc.TholdForPciWrites = 0;
DmaDesc.TholdForPciReads = 0;
DmaDesc.EnableFlybyMode = 0;
DmaDesc.FlybyDirection = 0;
DmaDesc.EnableDoneInt = 0;
DmaDesc.Reserved2 = 0;
DmaDesc.DmaChannelPriority = Channel0Highest;*/
9054局部端控制模块使用FPGA写的,我没有用到中断,全部是用ADS_n,Blast_n,LHOLD,LHOLDA控制的
望兄弟姐妹们帮帮忙,看我哪儿错了,问题有可能出现在哪?给我点建议:兄弟我万分谢谢
[ 本帖最后由 lorchid 于 2007-9-10 16:24 编辑 ] |
|