xmega USART SPI Daten von ADC speichern mit DMA

OP #2841514
Lesenswert?
• ▲
▼
Hallo

Ich müsste Daten die von einem ADC über den SPI Bus gesendet werden im 
RAM vom µC zwischen speichern und diese dann anschließend an einen PC 
schicken.

Es funktioniert soweit alles. Ich kann die Daten(2 byte) vom ADC 
einlesen und diese dann anschließend weiter schicken.
Jetzt würde ich jedoch die DMA des xmegas für das Zwischenspeichern
verwenden. Auch das geht größtenteils.
Ab und zu stimmt der Wert nicht der gespeichert wird. Verwende ich die 
DMA nicht tritt dieses Problem nicht auf.

Ich verwende zwei DMA Kanäle einen um den SCK Takt zu erzeugen und den 
zweiten um die Daten vom USART.DATA auf den RAM zu schieben.

Dummy - Transmit DMA Channel
1
  DMA.CH1.ADDRCTRL  = DMA_CH_SRCRELOAD_NONE_gc | DMA_CH_SRCDIR_FIXED_gc | DMA_CH_DESTRELOAD_NONE_gc | DMA_CH_DESTDIR_FIXED_gc;
2
  DMA.CH1.TRIGSRC   = 0x4C;           // ADC SPI DRE
3
  DMA.CH1.TRFCNT    = 2;            // buffer size
4
  DMA.CH1.SRCADDR0 = (((uint32_t) (dummy_spi_buffer))>>0*8) & 0xFF;
5
  DMA.CH1.SRCADDR1 = (((uint32_t) (dummy_spi_buffer))>>1*8) & 0xFF;
6
  DMA.CH1.SRCADDR2 = (((uint32_t) (dummy_spi_buffer))>>2*8) & 0xFF;
7
  DMA.CH1.DESTADDR0  = (((uint32_t)(&USARTC0.DATA))>>0*8) & 0xFF;
8
  DMA.CH1.DESTADDR1  = (((uint32_t)(&USARTC0.DATA))>>1*8) & 0xFF;
9
  DMA.CH1.DESTADDR2  = (((uint32_t)(&USARTC0.DATA))>>2*8) & 0xFF;

Receive DMA Channel
1
  DMA.CH2.ADDRCTRL  = 0b11000101;     // fixed source addr , incr des, reload dest end block
2
  DMA.CH2.TRIGSRC   = 0x4C;           // ADC SPI DRE
3
  DMA.CH2.TRFCNT    = 2;            // buffer size
4
  
5
  DMA.CH2.DESTADDR0 = (((uint32_t) (usb_tx_buffer_fill))>>0*8) & 0xFF;
6
  DMA.CH2.DESTADDR1 = (((uint32_t) (usb_tx_buffer_fill))>>1*8) & 0xFF;
7
  DMA.CH2.DESTADDR2 = (((uint32_t) (usb_tx_buffer_fill))>>2*8) & 0xFF;
8
  DMA.CH2.SRCADDR0  = (((uint32_t)(&USARTC0.DATA))>>0*8) & 0xFF;
9
  DMA.CH2.SRCADDR1  = (((uint32_t)(&USARTC0.DATA))>>1*8) & 0xFF;
10
  DMA.CH2.SRCADDR2  = (((uint32_t)(&USARTC0.DATA))>>2*8) & 0xFF;
11
DMA.CH2.CTRLA     = 0xA5;


Ich starte den DMA - Transfer mit
1
 DMA.CH1.CTRLA     = 0x86;


Kann mir hier vielleicht wer helfen?

LG chgamauf

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 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.