How to deal with this kind of dma problem.

Feb 29, 2008 0 Replies

Hi, I have a big problem, please give me some help.



I have a PCI Card use PLX9656 as a bridge. The PCI Card has a DSP write datas into dual-ram in every 3 seconds.After DSP writting complete, there will be a interrupt to notice the data is available. My job is copy these data from the dual-ram and send them out by socket.I have transfer these data successfully by use memcpy.Now I want to use DMA to finish the job.After I complete the codes, DMA is work and I can receive the DMA interrupt when the DMA is done.Then I can get these data transfered by DMA, but the data is incorrect.The situation is like this:



first group Correct data: 0xAAAAAAAA, 0xB10043AA, 0x00000055, 0x00000098,



0x00000041, 0x00000001 Incorrect data:0x0000000000, 0xAAEAAAAA, 0xB1004355, 0x00400098,
0x00000041, 0x004000001

second group Correct data: 0xAAAAAAAA, 0xB10043AA, 0x00000055, 0x00000098,



0x00000041, 0x00000002 Incorrect data:0x0000000000, 0xAAEAAAAA, 0xB1004355, 0x00400098,
0x00000041, 0x004000002

third group Correct data: 0xAAAAAAAA, 0xB10043AA, 0x00000055, 0x00000098,



0x00000041, 0x00000003 Incorrect data:0x0000000000, 0xAAEAAAAA, 0xB1004355, 0x00400098,
0x00000041, 0x004000003

......


Look at these carefully, you could find that some data has been add a number 0x00400000, some are not.



The codes about start dma are like these: //clear DMA Channel 0 interrupt HAL_PLX9656_REG_WRITE_BYTE(plxRegAddr, PLX9656_DMACSR0, 0x8);


//open DMA Channel x Done Interrupt,DMA Channel 0 Clear Count Mode bit(0xe2100080) HAL_PLX9656_REG_WRITE_WORD(plxRegAddr, PLX9656_DMAMODE0,0x20443);


//write address to DMA Channel 0 PCI Address$B!$(B(0xE2100084) HAL_PLX9656_REG_WRITE_WORD(plxRegAddr, PLX9656_DMAPADR0, ubpHAL_PLX9656_BufferBase);


//write address to DMA Channel 0 Local Address$B!$(B(0xE2100088) HAL_PLX9656_REG_WRITE_WORD(plxRegAddr, PLX9656_DMALADR0, fifoBase);


//write the size of data will be transfered(0xE210008C) HAL_PLX9656_REG_WRITE_WORD(plxRegAddr, PLX9656_DMASIZ0, IBUFFER_SIZE);


//set from local to pci address,0xE2100090) HAL_PLX9656_REG_WRITE_WORD(plxRegAddr, PLX9656_DMADPR0, 0x8);


//start dma HAL_PLX9656_REG_WRITE_BYTE(plxRegAddr, PLX9656_DMACSR0, 0x3);


I can assure I write these DMA registers correctly.But I don't know I get these wrong datas.



if anybody know this problem, please tell me . thanks


Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required