mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik DMA + UART LPC2xxx


Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Community,

Ich bin auf der Suche nach einer Möglichkeit, vom RAM Daten per DMA ans 
UART zu schicken. Gibt es irgendwo vielleicht schon Beispiele oder ANs 
oder hat das schon mal jemand gemacht? Ich habe leider bisher nichts 
gefunden, und es sind doch einige Einstellungen notwendig (burstsize, 
transferwidth...).

M2M läuft ohne Probleme.

Ich arbeite mit einem LPC2478 DMA und UART sind aber gleich wie z.B. im 
LPC23xx.

liebe Grüße
Jan

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mein Code sieht so aus:

#define DMA_SRC    0x7FD00000 // usb Ram  
#define DMA_DST    0xE000C000 // uart0 
#define DMA_SIZE  0x04     // länge des zu kopierenden Blocks


void init_DMA(void)
{

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

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

  // CH0 verwenden
  GPDMA_CH0_SRC  = DMA_SRC;
  GPDMA_CH0_DEST   = DMA_DST;

  GPDMA_CH0_LLI=0;
     
  // Controll konfigurieren
  GPDMA_CH0_CTRL =   ((DMA_SIZE/4) & 0x0FFF)        // Transfersize    
                | (0x0 << 12)        // SBurstSize     M  1 transfer
                | (0x0 << 15)        // DBurstSize    P  1 transfer
                | (0x0 << 18)        // Source Width    M  1 Byte
                | (0x0 << 21)        // Dest. Width    P  1 Byte
                | (1 << 26)        // SI  Source Inkrement
                &~ (1 << 27)        // DI  kein Destination Inkrement
                | 0x80000000;       // Terminal count interrupt enable bit -> interrupt wenn DMA fertig!          
          
  GPDMA_CH0_CFG   |=(1<<0)  // channel enable
          | (1<<0)  // flow controll M2P   !!! M2P sonst 0 für M2M
          | (1<<14)  // IE   masks out error interrupt
          | (1<<15)  // ITC   masks out terminal count interrupt 
          &~(1<<18)  // HALT  ausschalten
          &~(1<<16);  // Lock  ausschalten
          
    // Enable DMA channels, little endian 
  GPDMA_CONFIG = 0x01;



der UART ist initialisiert und funktioniert auch, wenn ich ohne DMA 
etwas auf die Adresse 0xE000C000 (Transmit Hold Register) schreibe.
Burstsize und Width sind erstmal auf ein Tranfer und ein Byte 
eingestellt.

Ändere ich die Zieladresse auf einen Bereich im USB Ram, funktioniert 
die Übertragung. (Seltsam ist, dass es auch funktioniert wenn ich das 
Flowcontroll auf M2P habe)

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.