Forum: Mikrocontroller und Digitale Elektronik DMA + UART LPC2xxx


von Jan (Gast)


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

von Jan (Gast)


Lesenswert?

mein Code sieht so aus:
1
#define DMA_SRC    0x7FD00000 // usb Ram  
2
#define DMA_DST    0xE000C000 // uart0 
3
#define DMA_SIZE  0x04     // länge des zu kopierenden Blocks
4
5
6
void init_DMA(void)
7
{
8
9
  // Enable GPDMA clock 
10
  PCONP |= (1 << 29);  
11
12
    // clear all interrupts on channel 0 
13
    GPDMA_INT_TCCLR = 0x01;
14
    GPDMA_INT_ERR_CLR = 0x01;
15
16
  // CH0 verwenden
17
  GPDMA_CH0_SRC  = DMA_SRC;
18
  GPDMA_CH0_DEST   = DMA_DST;
19
20
  GPDMA_CH0_LLI=0;
21
     
22
  // Controll konfigurieren
23
  GPDMA_CH0_CTRL =   ((DMA_SIZE/4) & 0x0FFF)        // Transfersize    
24
                | (0x0 << 12)        // SBurstSize     M  1 transfer
25
                | (0x0 << 15)        // DBurstSize    P  1 transfer
26
                | (0x0 << 18)        // Source Width    M  1 Byte
27
                | (0x0 << 21)        // Dest. Width    P  1 Byte
28
                | (1 << 26)        // SI  Source Inkrement
29
                &~ (1 << 27)        // DI  kein Destination Inkrement
30
                | 0x80000000;       // Terminal count interrupt enable bit -> interrupt wenn DMA fertig!          
31
          
32
  GPDMA_CH0_CFG   |=(1<<0)  // channel enable
33
          | (1<<0)  // flow controll M2P   !!! M2P sonst 0 für M2M
34
          | (1<<14)  // IE   masks out error interrupt
35
          | (1<<15)  // ITC   masks out terminal count interrupt 
36
          &~(1<<18)  // HALT  ausschalten
37
          &~(1<<16);  // Lock  ausschalten
38
          
39
    // Enable DMA channels, little endian 
40
  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)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.