I am supporting a legacy product that is using the 21065L. I would like to replace a memcpy() with a DMA copy to improve the throughput.
The original code is:
UNSIGNED32 *extMem = 0x10000000;
UNSIGNED32 *intMem = 0x0000D000;
memcpy(extMem, intMem, 100);
The DMA code is:
// DMA off *pDMAC1 = 0;
// set DMA control regs *pIIEP1 = (UNSIGNED32)(intMem); // internal RAM *pIMEP1 = 1; // single increment *pCEP1 = 100; // count *pEIEP1 = (UNSIGNED32)(extMem); // external RAM *pEMEP1 = 1; // single increment *pECEP1 = 100; // count
// turn DMA on *pDMAC1 = (DEN | TRAN | MASTER);
// wait for DMA to finish, to keep the same flow as with memcpy while ((*pDMASTAT & DMA7ST) != 0);
When I run this, nothing happens. It doesn't hang, it just falls through with no memory writes at all.
I'm sure it's something simple, as I'm not familiar with this device.
After further experimenting, I determined that the reason the DMA didn't start was a bad destination address, as you suggested. It now works correctly.
However, I do observe that bit 7 is the correct one to monitor in DMASTAT for polling, as stated in the manual. Bit 9 does not work for me.