LPC2478 DMA Linked List

OP #1580085
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.