This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DMA writing in reverse

Am I able to have DMA write the last element first and work backwards? I want the result to be in the original order, but the low address memory to be written last. It seems like this should be possible in indexed mode, but it doesn't seem to be working. I have DMA working writing in normal forward order, but doing it backwards like this makes some things simpler.

To reiterate, a transfer of a frame consisting of WXYZ where each letter is an element should look like this

1) ____

2)___Z

3)__YZ

4)_XYZ

5)WXYZ

Here is the function I am using to configure a control packet that seems like it should work to me, but it doesn't.

void dmaConfigCtrlPacket64bReverse(g_dmaCTRL *dmaCtrlPkt, uint32 sadd,uint32 dadd,uint32 dsize, uint32 frcnt)
{
dmaCtrlPkt->SADD = sadd + dsize - 1; /* source address */
dmaCtrlPkt->DADD = dadd + dsize - 1; /* destination address */
dmaCtrlPkt->CHCTRL = 0; /* channel control */
dmaCtrlPkt->FRCNT = frcnt; /* frame count */
dmaCtrlPkt->ELCNT = dsize / 8; /* element count */
dmaCtrlPkt->ELDOFFSET = -8; /* element destination offset */
dmaCtrlPkt->ELSOFFSET = -8; /* element source offset */
dmaCtrlPkt->FRDOFFSET = dsize; /* frame destination offset */
dmaCtrlPkt->FRSOFFSET = 0; /* frame source offset */
dmaCtrlPkt->PORTASGN = 4; /* port b */
dmaCtrlPkt->RDSIZE = ACCESS_64_BIT; /* read size */
dmaCtrlPkt->WRSIZE = ACCESS_64_BIT; /* write size */
dmaCtrlPkt->TTYPE = FRAME_TRANSFER; /* transfer type */
dmaCtrlPkt->ADDMODERD = ADDR_OFFSET; /* address mode read */
dmaCtrlPkt->ADDMODEWR = ADDR_OFFSET; /* address mode write */
dmaCtrlPkt->AUTOINIT = AUTOINIT_ON; /* autoinit */
}