Forum: Mikrocontroller und Digitale Elektronik LPC2378: memory-to-memory DMA transfers?


von Peter (Gast)


Lesenswert?

hi,
ich wollte mal memory-to-memory DMA ausprobieren:
1
#pragma data_alignment=4
2
static DWORD p[1000]; //*p = (DWORD*)0x7fe00000; //p[1000];
3
#pragma data_alignment=4
4
static DWORD q[1000]; //*q = (DWORD*)0x7fe00000; //q[1000];
5
6
void test_dma (void)
7
{
8
  DWORD s;
9
  
10
  MAMCR = 0;  // muss wohl nicht sein...
11
12
  for (s=0; s<1000; s++)
13
    p[s] = s;
14
  
15
  PCONP |= (1 << 29);  // Enable GPDMA clock 
16
17
  // clear all interrupts 
18
  GPDMA_INT_TCCLR = 0x03;
19
  GPDMA_INT_ERR_CLR = 0x03;
20
  
21
  GPDMA_CH0_SRC = (DWORD)p;   // Src pointer
22
  GPDMA_CH0_DEST = (DWORD)q;  // Dest. pointer
23
24
  GPDMA_CH0_CTRL = ((1000/4) & 0x0FFF) |  // size
25
                    (1 << 12) |           // 4 bytes burst 
26
                    (1 << 15) |           // 4 bytes burst
27
                    (2 << 18) |           // 32 bits
28
                    (2 << 21) |           // 32 bits
29
                    (1 << 26) |           // source ptr increment
30
                    (1 << 27);            // dest. ptr increment
31
32
  GPDMA_CONFIG = 0x01;  // Enable DMA channels, little endian 
33
  //while ( !(GPDMA_CONFIG & 0x01) );    
34
  
35
  GPDMA_CH0_CFG = 1; // Start
36
37
  debug_printf ("%d %d %d\n", p[0], p[1], p[2]);
38
  // Wait...
39
  for (s=0; s<0x800000; s++);
40
  //while (!(GPDMA_CH0_CFG & (1<<17)));
41
  //while (GPDMA_CH0_CFG & (1<<17));
42
  debug_printf ("%d %d %d\n", q[0], q[1], q[2]);
43
}
aber irgendwie tuts das nicht. kann mir jemand sagen, was ich falsch 
mache?
danke... :-)

von Peter (Gast)


Lesenswert?

äääh, sorry, die fehlerbeschreibung: es findet keine übertragung statt, 
das 'destination' array bleibt unverändert.

von Peter (Gast)


Lesenswert?

hallo,
so scheint es zu gehen:
#define TSIZE 1000

#pragma data_alignment=4
static DWORD *p = (DWORD*)0x7FD00000; //p[TSIZE];
#pragma data_alignment=4
static DWORD *q = (DWORD*)0x7FD01000; //q[TSIZE];

void test_dma (void)
{
  DWORD s;

  MAMCR = 0;  // muss wohl nicht sein...

  for (s=0; s<TSIZE; s++)
  {
    p[s] = s;
    q[s] = 0;
  }

  debug_printf ("%d %d %d\n", p[0], p[1], p[2]);

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

  // clear all interrupts
  GPDMA_INT_TCCLR = 0x03;
  GPDMA_INT_ERR_CLR = 0x03;

  GPDMA_CH0_SRC = (DWORD)p;   // Src pointer
  GPDMA_CH0_DEST = (DWORD)q;  // Dest. pointer

  GPDMA_CH0_CTRL = ((TSIZE) & 0x0FFF) |  // size
                    (4 << 12) |           // 32 bytes burst
                    (4 << 15) |           // 32 bytes burst
                    (2 << 18) |           // 32 bits
                    (2 << 21) |           // 32 bits
                    (1 << 26) |           // source ptr increment
                    (1 << 27);            // dest. ptr increment

  GPDMA_CONFIG = 0x01;  // Enable DMA channels, little endian

  GPDMA_CH0_CFG = 1; // Start

  // Wait...
  //for (s=0; s<0x800000; s++);

  //while (!(GPDMA_CH0_CFG & (1<<17)));
  while (GPDMA_CH0_CFG & (1<<17));

  debug_printf ("%d %d %d\n", q[TSIZE-3], q[TSIZE-2], q[TSIZE-1]);
}

...wenn sich ziel und startadresse im USB RAM befinden.
warum nur geht es nicht mit dem 'normalen' RAM?

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.