mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LPC2478 DMA Linked List


Autor: Mr. Qb (lunza)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich habe folgendes Problem:

Ich möchte den DMA Controller dafür nutzen Daten in der Größenordnung 
von ca. 130kB M2M zu kopieren. Da dies die Blockgröße einer einzelnen 
übertragen überschreitet habe ich mir gedacht nutze ich dafür die eine 
Linked List und erspare mir damit ein Paar Interrupts.
Das Problem ist es findet immer nur eine einzige Übertragung statt, die 
Liked list wird jedesmal übersprungen und ich finden den Fehler einfach 
nicht. Vielleicht hat das schon mal jemand gemacht und kann mir helfen.

Code:
/**************************************************************************
 * Includes
 *************************************************************************/
#include "lpc2478.h"                    /* LPC23xx/24xx definitions */  
#include "dma.h"
#include "irq.h"   

volatile U32 DMATCCount = 0;
volatile U32 DMAErrCount = 0;

volatile U32 llist[37][4]; 


/**************************************************************************
** Function name:    DMAHandler
**
** Descriptions:    DMA interrupt handler
**
** parameters:      None
** Returned value:    None
**************************************************************************/
void DMAHandler (void) __irq 
{
  U32 regVal;

  regVal = GPDMA_INT_TCSTAT;
  if ( regVal )
  {
  DMATCCount++;
  GPDMA_INT_TCCLR |= regVal;
  } 

  regVal = GPDMA_INT_ERR_STAT;
  if ( regVal )
  {
  DMAErrCount++;
  GPDMA_INT_ERR_CLR |= regVal;  
  }                                

  VICVectAddr = 0;    /* Acknowledge Interrupt */
}

/**************************************************************************
** Function name:    DMA_Init
**
** Descriptions:    
**
** parameters:      
** Returned value:    
**************************************************************************/
U8 DMA_Init( U8 DMAMode )
{

  U8 i;
  PCONP |= (1 << 29);  /* Enable GPDMA clock */ 

      /* clear all interrupts on channel 0 */
  GPDMA_INT_TCCLR = 0x01;
  GPDMA_INT_ERR_CLR = 0x01;

  if ( DMAMode == M2M )
  {
  GPDMA_CH0_SRC = DMA_SRC;
  GPDMA_CH0_DEST = DMA_DST;

    for (i = 0; i<=35;i++)
        {
        llist[i][0]=0xA0000000+(DMA_SIZE/4) + ((DMA_SIZE/4)*i);  // SRC
        llist[i][1]=0xA0025800+(DMA_SIZE/4) + ((DMA_SIZE/4)*i);  // DST
        llist[i][2]=(U32)llist[i+1];                             // NEXT LL
        llist[i][3]=0x0c4a4040;                                  // COMAND 
        }

    llist[36][0] = 0xA0000000+(DMA_SIZE/4) + ((DMA_SIZE/4)*35);
    llist[36][1] = 0xA0025800+(DMA_SIZE/4) + ((DMA_SIZE/4)*35);
    llist[36][2] = 0;
    llist[36][3] = 0x0c4a4040;     

  /* Terminal Count Int enable */
  GPDMA_CH0_CTRL = ((DMA_SIZE/4) & 0x0FFF)  // Transver Size
                    | (0x04 << 12)          // Source burst size
                    | (0x04 << 15)          // Destination burst Size
                    | (0x02 << 18)          // Source width
                    | (0x02 << 21)          // destination width
                    | (1 << 26)             // Source increment
                    | (1 << 27)          // Destination increment
                    | 0x80000000;
                    
      GPDMA_CH0_LLI = (U32)llist[0] & 0xFFFFFFFC; 
  }
  else
  {
  return ( FALSE );
  }
  
  GPDMA_CONFIG = 0x01;  /* Enable DMA channels, little endian */
  
  while ( !(GPDMA_CONFIG & 0x01) );    
    
  if ( install_irq( GPDMA_INT, (void *)DMAHandler, HIGHEST_PRIORITY ) == FALSE )
  {
  return ( FALSE );
  }    
  return (TRUE);
}

Der Interrupt ist nur Testweise drin und kann ignoriert werden.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.