阅读:1901回复:7
9054的DMA传输的疑问
我在配置9054的DMA寄存器的时候,我选用的channel 0 ,block mode(我是用windrive 中的P9054_DMAReadWriteBlock (P9054_HANDLE hPlx, DWORD dwLocalAddr, PVOID buf, DWORD dwBytes, BOOL fIsRead, P9054_MODE mode, P9054_DMA_CHANNEL dmaChannel)来实现DMA传输的)
.那我是不是只要配置DMAMODE0(DMA channel 0 mode)和DMACSR0(DMA channel 0 command/status)这两个寄存器就可以了。PCI address和local address 以及transfer size 这三个寄存器要配置吗?如果需要,我应该怎样配置?PCI address是不是指PCIBAR2的基地址,local address 是不是指PCIBAR2映射过来的,即我在eeprom中LAS0BA写下的基地址? |
|
沙发#
发布于:2003-06-11 09:00
PCI address和local address 以及transfer size 这三个寄存器要配置吗?
我认为应该配置,要不怎么操作?具体配置参考PLXMon的操作手册,大概PCI address为物理内存地址,而Local address为本地的Remap地址,可以从9054的寄存器得到,transfer size 为传送的长度。 |
|
板凳#
发布于:2003-06-11 22:33
我在配置9054的DMA寄存器的时候,我选用的channel 0 ,block mode(我是用windrive 中的P9054_DMAReadWriteBlock (P9054_HANDLE hPlx, DWORD dwLocalAddr, PVOID buf, DWORD dwBytes, BOOL fIsRead, P9054_MODE mode, P9054_DMA_CHANNEL dmaChannel)来实现DMA传输的) 这三个寄存器是一定要配置的,其中PCI address指的是你的PCI设备所DMA传输到的缓冲区的物理地址;local address 是你的PCI设备的局部地址。 其实关于PCI9054的DMA寄存器的配置,本论坛有很多的帖子,找一下吧。 |
|
|
地板#
发布于:2003-06-12 21:45
fwzfwz1和QIZHI:太感谢你们了。我这几天被DMA折腾死了。感觉愈做愈糊涂!
我的9054外接的是CPLD和SRAM ,那在CPLD 中我是不是可以直接将LA的16:2位赋给SA0:SA14?现在我是把READY信号一直置为低电平。 |
|
地下室#
发布于:2003-06-13 14:02
CPLD和SRAM:我没有使用过SRAM,但是我用过FIFO。在RDK中,恰好有一个SRAM的例子,可以参考一下其逻辑设计。但是我认为应该是可以的。但是,把READY一直置位低可能会有潜在的问题。关于READY的产生方法,RDK有,本站的帖子内也有,我也写过一个帖子,具体位置忘了,但是这几天的,可以搜索一下。
|
|
5楼#
发布于:2003-06-14 16:35
我应该怎样给分呢?
我已经把各个寄存器配置好了,可还是不能DMA。可能是我的CPLD中的是时序有问题。 我的LOCAL ADDRESS是20000000,那在CPLD中怎样对这个地址进行响应?我是让READY的信号在ADS为0,LA为20000000时,READY 为0,在BLAST为0时,READY 为1。这样写可以吗? |
|
6楼#
发布于:2003-06-15 18:40
READY信号应该在ADS#上升沿后为低,在BLAST#上升沿后为高。可能需要寄存器逻辑,如果这样,可以将其D端接LHOLD信号。
|
|
7楼#
发布于:2003-06-15 23:07
你的Ready#驱动有问题!
Ready#有效时表示本次交易的数据已准备好! 当9054读操作时,表示外设已将数据准备好,可以让9054读取了 当9054写操作时,表示9054已将数据准备好,外设可以读9054的LD总线取数据了。
当ADS=0,LA=20000000H时,可以作为译码来片选该外设。而不能作为Ready#信号,因为当9045ADS#有效时,在LA总线上会驱动有效的地址信息,所以此时不可能进行数据传输的! 具体的CPLD产生时序和9054的工作方式和模式等有关,你可以参考RDK的Verilog代码中的状态机设计你的Ready#信号。 |
|