Forum: Mikrocontroller und Digitale Elektronik LPC2478 DMA Linked List


von Mr. Q. (lunza)


Lesenswert?

Hallo Leute,

ich habe folgendes Problem:

Ich möchte den DMA Controller dafür nutzen Daten in der Größenordnung 
von ca. 130kB M2M zu kopieren. Da dies die Blockgröße einer einzelnen 
übertragen überschreitet habe ich mir gedacht nutze ich dafür die eine 
Linked List und erspare mir damit ein Paar Interrupts.
Das Problem ist es findet immer nur eine einzige Übertragung statt, die 
Liked list wird jedesmal übersprungen und ich finden den Fehler einfach 
nicht. Vielleicht hat das schon mal jemand gemacht und kann mir helfen.

Code:
1
/**************************************************************************
2
 * Includes
3
 *************************************************************************/
4
#include "lpc2478.h"                    /* LPC23xx/24xx definitions */  
5
#include "dma.h"
6
#include "irq.h"   
7
8
volatile U32 DMATCCount = 0;
9
volatile U32 DMAErrCount = 0;
10
11
volatile U32 llist[37][4]; 
12
13
14
/**************************************************************************
15
** Function name:    DMAHandler
16
**
17
** Descriptions:    DMA interrupt handler
18
**
19
** parameters:      None
20
** Returned value:    None
21
**************************************************************************/
22
void DMAHandler (void) __irq 
23
{
24
  U32 regVal;
25
26
  regVal = GPDMA_INT_TCSTAT;
27
  if ( regVal )
28
  {
29
  DMATCCount++;
30
  GPDMA_INT_TCCLR |= regVal;
31
  } 
32
33
  regVal = GPDMA_INT_ERR_STAT;
34
  if ( regVal )
35
  {
36
  DMAErrCount++;
37
  GPDMA_INT_ERR_CLR |= regVal;  
38
  }                                
39
40
  VICVectAddr = 0;    /* Acknowledge Interrupt */
41
}
42
43
/**************************************************************************
44
** Function name:    DMA_Init
45
**
46
** Descriptions:    
47
**
48
** parameters:      
49
** Returned value:    
50
**************************************************************************/
51
U8 DMA_Init( U8 DMAMode )
52
{
53
54
  U8 i;
55
  PCONP |= (1 << 29);  /* Enable GPDMA clock */ 
56
57
      /* clear all interrupts on channel 0 */
58
  GPDMA_INT_TCCLR = 0x01;
59
  GPDMA_INT_ERR_CLR = 0x01;
60
61
  if ( DMAMode == M2M )
62
  {
63
  GPDMA_CH0_SRC = DMA_SRC;
64
  GPDMA_CH0_DEST = DMA_DST;
65
66
    for (i = 0; i<=35;i++)
67
        {
68
        llist[i][0]=0xA0000000+(DMA_SIZE/4) + ((DMA_SIZE/4)*i);  // SRC
69
        llist[i][1]=0xA0025800+(DMA_SIZE/4) + ((DMA_SIZE/4)*i);  // DST
70
        llist[i][2]=(U32)llist[i+1];                             // NEXT LL
71
        llist[i][3]=0x0c4a4040;                                  // COMAND 
72
        }
73
74
    llist[36][0] = 0xA0000000+(DMA_SIZE/4) + ((DMA_SIZE/4)*35);
75
    llist[36][1] = 0xA0025800+(DMA_SIZE/4) + ((DMA_SIZE/4)*35);
76
    llist[36][2] = 0;
77
    llist[36][3] = 0x0c4a4040;     
78
79
  /* Terminal Count Int enable */
80
  GPDMA_CH0_CTRL = ((DMA_SIZE/4) & 0x0FFF)  // Transver Size
81
                    | (0x04 << 12)          // Source burst size
82
                    | (0x04 << 15)          // Destination burst Size
83
                    | (0x02 << 18)          // Source width
84
                    | (0x02 << 21)          // destination width
85
                    | (1 << 26)             // Source increment
86
                    | (1 << 27)          // Destination increment
87
                    | 0x80000000;
88
                    
89
      GPDMA_CH0_LLI = (U32)llist[0] & 0xFFFFFFFC; 
90
  }
91
  else
92
  {
93
  return ( FALSE );
94
  }
95
  
96
  GPDMA_CONFIG = 0x01;  /* Enable DMA channels, little endian */
97
  
98
  while ( !(GPDMA_CONFIG & 0x01) );    
99
    
100
  if ( install_irq( GPDMA_INT, (void *)DMAHandler, HIGHEST_PRIORITY ) == FALSE )
101
  {
102
  return ( FALSE );
103
  }    
104
  return (TRUE);
105
}

Der Interrupt ist nur Testweise drin und kann ignoriert werden.

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.