ADC-Wert über DMA in SDRAM ablegen

OP #1851976
Lesenswert?

Hallo Leute,

ich versuche schon den ganzen Nachmittag vergebens einen 12 Bit ADC-Wert 
über den DMA-Controller im SDRAM abzulegen. Irgendwie scheint das ganze 
schon zu funktionieren, nur nicht so wie ich es will.

Der DMA legt im SDRAM auch Werte ab, allerdings nur das LOW-Byte der ADC 
Wandlung und dieses gleich doppelt (hintereinander).

Controller ist ein XMEGA128A1. Ich nutze ein XPLAIN-Board.

Burst-len ist auf 2 Bytes eingestellt, dann müsste er doch auch 2 Bytes 
abholen?
1
/ setup ADC for continuous acquisition 12 bits, single ended on 
2
// PORTA:0
3
  ADCA.CH0.CTRL |= 0x81; // configure single ended no gain on CH0
4
  ADCA.REFCTRL = 0x10;   // use internal Vref = VCC-0.6
5
  ADCA.CTRLB = 0x8;      // freerun, 12 bit right justified
6
  ADCA.CTRLA = 1;        // enable ADC
7

8
// configure DMA
9
  DMA.CTRL = 0x80;    // Enable, single buffer, round robin
10
  DMA.CH0.ADDRCTRL = 0xc5;// Reload source addr after each burst, incr des, fix src
11
  DMA.CH0.TRIGSRC= 0x10;  // ADCA CH0 is trigger source
12
  DMA.CH0.TRFCNT = 1;   // Buffer is len bytes
13

14
//des addr
15
  DMA.CH0.DESTADDR0  =0x00;
16
  DMA.CH0.DESTADDR1  =0x40;
17
  DMA.CH0.DESTADDR2  =0x00;
18
  
19
//src addr  
20
  DMA.CH0.SRCADDR0 =0x24;
21
  DMA.CH0.SRCADDR1 =0x02;
22
  DMA.CH0.SRCADDR2 =0x00;
23

24

25
// Enable, repeat, 2 byte, burst 
26
  DMA.CH0.CTRLA = 0x95;

Kann mir jemand von euch einen tipp geben, welches register ich falsch 
gesetzt habe?

Bin für jede Hilfe dankbar!
Persönliche Seite #1852352
Lesenswert?

>DMA.CH0.ADDRCTRL = 0xc5;// Reload source addr after each burst, incr des, fix src

Ohne das Handbuch genau gelesen zu haben, müsste fix source falsch sein. 
Man sollte eigentlich als Reload source das LSB vom ADC angeben und 
increment source einstellen. Dann wird die Quell- und Zieladresse um ein 
Byte hochgestellt, nachdem das erste Byte übertragen ist. So wie es 
jetzt ist, wird die Quelladresse nicht hochgestellt, daher die zwei 
gleichen Werte in den beiden Zielen.

Grüße,

Peter
Gast #1852592
Lesenswert?

Hallo,

Stefan S. schrieb:
> DMA.CH0.ADDRCTRL = 0xc5;// Reload source addr after each burst, incr des, fix 
src

teste doch mal den Code:

// configure DMA
  DMA.CTRL = 0x80;    // Enable, single buffer, round robin
  DMA.CH0.ADDRCTRL = 0x95;// Reload source addr after each burst, incr 
src/des, reload dest end transact
  DMA.CH0.TRIGSRC= 0x10;  // ADCA CH0 is trigger source
  DMA.CH0.CTRLA = 0xA5;   // Enable, repeat, 2 byte, burst


Gruß XMEGA

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