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


von Florian (Gast)


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.
1
  src_addr  = (unsigned long *)DMA_SRC;   
2
  dest_addr = (unsigned long *)DMA_DST; 
3
4
  // DMA initialisieren Ram 2 Ram
5
  PCONP |= (1 << 29);        // Enable GPDMA clock 
6
     
7
  GPDMA_INT_TCCLR = 0x01;         // clear all interrupts on channel 0
8
  GPDMA_INT_ERR_CLR = 0x01; 
9
10
  // GPDMA initialisiern
11
  GPDMA_CH0_SRC  = DMA_SRC;     // Quelladresse festlegen 0x7FD00000
12
  GPDMA_CH0_DEST = DMA_DST;     // Zieladresse festlegen  0x7FD01000
13
  //GPDMA_CH0_LLI  = 0x00;      // single packet of data
14
  GPDMA_CONFIG   = 0x01;        // Enable DMA channels, little endian 
15
16
  //GPDMA_CH0_CTRL    control  
17
  GPDMA_CH0_CTRL  = ((TSIZE/4) & 0x0FFF);   // Transfersize   TSIZE=1000     
18
  GPDMA_CH0_CTRL |= (0x04 << 12);       // SBSize     4       
19
  GPDMA_CH0_CTRL |= (0x04 << 15);       // DBSize     4      
20
  GPDMA_CH0_CTRL |= (0x02 << 18);       // SWidth     2  
21
  GPDMA_CH0_CTRL |= (0x02 << 21);       // DWidth     2
22
  GPDMA_CH0_CTRL |= (1 << 26);         // SI  Source Inkrement
23
  GPDMA_CH0_CTRL |= (1 << 27);         // DI  Destination Inkrement
24
  //GPDMA_CH0_CTRL |= 0x80000000;        // Terminal count interrupt enable bit
25
26
  // GPDMA_CH0_CFG
27
  GPDMA_CH0_CFG |= 0x00;          // Einstellungen für Memory 2 Memory
28
            
29
  GPDMA_CH0_CFG |= 0x01;          // Enable channel0 
30
31
  if ((GPDMA_CH0_CFG & (0x20000)) == (0x20000))    char2LED(0x55);  // anzeigen ob active erreicht wird! 
32
  
33
    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

von Microman (Gast)


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

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.