Estoy intentando configurar el DMA en el PIC24FJ1024 de Microchip, el canal DMA transferirá los datos, desde el origen al destino, cada vez que el programa active el canal DMA.
-
Modo One Shot
-
SRC incrementa cada transferencia
-
La dirección DST incrementa cada transferencia
-
DMACNT0 = 2
He escrito este código simple para probar el DMA
#include "xc.h"
#include <stdio.h>
#pragma config FWDTEN = OFF
int ArraySRC[100];
int ArrayDST[100];
void DMA_Init (void)
{
DMACONbits.DMAEN = 1;//enable dma
DMACONbits.PRSSEL = 1;//channel priority
DMACH0bits.NULLW = 0;//no dummy
DMACH0bits.RELOAD = 0;//don't reload
DMACH0bits.SIZE = 0;//word
DMACH0bits.SAMODE = 1;//SRC address ++
DMACH0bits.DAMODE = 1;//DST address constant
DMACH0bits.TRMODE = 0;//one shot
DMASRC0 = (int) &ArraySRC;
DMADST0 = (int) &ArrayDST;
DMACNT0 = 2;
DMACH0bits.CHEN = 1;//enable channel
}
int main (void)
{
int i;
for(i = 0; i<100; i++)
{
ArraySRC[i] = i+1;
}
DMA_Init ();
//1st trigger
DMACH0bits.CHREQ = 1;//start transaction
while(DMACH0bits.CHREQ);
//2nd trigger
DMACH0bits.CHREQ = 1;
while(DMACH0bits.CHREQ);
while(1);
return 0;
}
Lo que esperaba era que, para cada desencadenante DMACH0bits.CHREQ = 1;
, el DMA actualiza el SRC y la dirección DST, y disminuye el DMA Counter DMACNT0
.
Pero cuando lo depuro (usando simulator ), el depurador alcanza el primer desencadenante, actualiza el SRC y DST (lo puedo ver en la ventana de variables). ), pero cuando alcanza el segundo disparador, el depurador se detiene en while(DMACH0bits.CHREQ);
, y el contador DMA permanece en 1, y no disminuye.
Cualquier ayuda sería apreciada.