DMA de Microchip PIC24 no funciona como se esperaba

2

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.

    
pregunta Forat

1 respuesta

0

Parece que está intentando manejar dos operaciones independientes con el mismo índice. Recomiendo usar i para uno y j para el otro. Además, no veo dónde / cómo está disminuyendo el contador DMA? Recomendaría eliminar el segundo código de activación y utilizar un comando de reducción en su lugar. De esta manera verás si el primer disparador funciona correctamente. Después de que esto funcione correctamente, puede agregar el segundo código de activación.

    
respondido por el Guill

Lea otras preguntas en las etiquetas