阅读:2518回复:1
pci9054 scatter/gather DMA 传输问题,希望帮忙
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控制的 望兄弟姐妹们帮帮忙,看我哪儿错了,问题有可能出现在哪?给我点建议:兄弟我万分谢谢 |
|
沙发#
发布于:2007-09-06 18:12
收到你的EMAIL了
因为你用的是PLX的驱动,应用程序也没看出什么问题。所以我感觉问题似乎是出在硬件那边。你再检查检查,板子上的连线,有没有虚焊,或者短接。还有,你发的数据最好是连续的整数,这样有助于发现问题。用中断要好一些,你再用CS逮一下各路信号,看看吧。 有什么发现,贴上来,大家一起看看。 |
|
|