lorchid
驱动牛犊
驱动牛犊
  • 注册日期2007-03-07
  • 最后登录2007-12-13
  • 粉丝0
  • 关注0
  • 积分110分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
阅读:2386回复:1

pci9054 scatter/gather DMA 传输问题,希望帮忙

楼主#
更多 发布于:2007-09-05 16:23
   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控制的
望兄弟姐妹们帮帮忙,看我哪儿错了,问题有可能出现在哪?给我点建议:兄弟我万分谢谢
      
xp4105
论坛版主
论坛版主
  • 注册日期2006-04-02
  • 最后登录2014-03-29
  • 粉丝1
  • 关注0
  • 积分905分
  • 威望570点
  • 贡献值1点
  • 好评度162点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2007-09-06 18:12
收到你的EMAIL了
因为你用的是PLX的驱动,应用程序也没看出什么问题。

所以我感觉问题似乎是出在硬件那边。你再检查检查,板子上的连线,有没有虚焊,或者短接。还有,你发的数据最好是连续的整数,这样有助于发现问题。用中断要好一些,你再用CS逮一下各路信号,看看吧。

有什么发现,贴上来,大家一起看看。
时光如流水 抓紧时间实现自我价值
游客

返回顶部