mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik GPDMA Mem2Mem mit LPC 23xx / 24xx


Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich arbeite jetzt schon mehrere Tage mit dem MCB2300 von Keil (LPC2387) 
an GPDMA herum. Ich möchte ganz simpel einen Bereich im USB Ram in einen 
anderen Bereich im USB Ram schreiben ohne interrupts (ich weiß das ist 
nicht der Sinn von DMA - nur für den Anfang)
Nach Datenblatt sollte das "active"-Bit im GPDMA_CH0_CFG(bit 17) ja nach 
konfiguration + einschalten mal kurz high sein, das wird es aber leider 
nie.

Hab ich irgendwas vergessen?
Wäre wirklich dankbar wenn mir hier ein Profi kleine Hilfestellung geben 
kann.

  src_addr  = (unsigned long *)DMA_SRC;   
  dest_addr = (unsigned long *)DMA_DST; 

  // DMA initialisieren Ram 2 Ram
  PCONP |= (1 << 29);        // Enable GPDMA clock 
     
  GPDMA_INT_TCCLR = 0x01;         // clear all interrupts on channel 0
  GPDMA_INT_ERR_CLR = 0x01; 

  // GPDMA initialisiern
  GPDMA_CH0_SRC  = DMA_SRC;     // Quelladresse festlegen 0x7FD00000
  GPDMA_CH0_DEST = DMA_DST;     // Zieladresse festlegen  0x7FD01000
  //GPDMA_CH0_LLI  = 0x00;      // single packet of data
  GPDMA_CONFIG   = 0x01;        // Enable DMA channels, little endian 

  //GPDMA_CH0_CTRL    control  
  GPDMA_CH0_CTRL  = ((TSIZE/4) & 0x0FFF);   // Transfersize   TSIZE=1000     
  GPDMA_CH0_CTRL |= (0x04 << 12);       // SBSize     4       
  GPDMA_CH0_CTRL |= (0x04 << 15);       // DBSize     4      
  GPDMA_CH0_CTRL |= (0x02 << 18);       // SWidth     2  
  GPDMA_CH0_CTRL |= (0x02 << 21);       // DWidth     2
  GPDMA_CH0_CTRL |= (1 << 26);         // SI  Source Inkrement
  GPDMA_CH0_CTRL |= (1 << 27);         // DI  Destination Inkrement
  //GPDMA_CH0_CTRL |= 0x80000000;        // Terminal count interrupt enable bit

  // GPDMA_CH0_CFG
  GPDMA_CH0_CFG |= 0x00;          // Einstellungen für Memory 2 Memory
            
  GPDMA_CH0_CFG |= 0x01;          // Enable channel0 

  if ((GPDMA_CH0_CFG & (0x20000)) == (0x20000))    char2LED(0x55);  // anzeigen ob active erreicht wird! 
  
    while (GPDMA_CH0_CFG & (1<<17));     // while active


ich beschreibe davor die Rambereiche mit definierten chars, nach dem DMA 
sind diese aber immer noch unverändert --> es hat kein kopiervorgang 
stattgefunden... :-/

den meisten wird es wahrscheinlich aufgefallen sein, dass es sich hier 
um ein modifiziertes Keil-Beispiel handelt (welches allerdings seinen 
Zweck auch nicht tut)

Danke und liebe Grüße
Flo

Autor: Microman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Flo

probiere doch mal folgendes:

GPDMA_CONFIG   = 0x01;            // Enable DMA channels, little endian
while ( !(GPDMA_CONFIG & 0x01) );

ganz nach oben setzen, gleich nach

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

So ist bei mir gemacht und P2M und M2P funktioniert mit DMA und SSC 
super.
Ist vielleicht auch einen Versuch wert für M2M.

Gruß Microman

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.