LPC2378: memory-to-memory DMA transfers?

Gast #619117
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... :-)
Gast #619145
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren