XMEGA DMA SPI

OP #2102605
Lesenswert?
• ▲
▼
Hy,
ich versuche DMA mit meinem XMEGA über SPI im Master Mode.
Hierfür muss man den USART benutzen.
Das Funktioniert auch alles soweit.
Ich kann das was auf meinem Bus liegt über ein Oszi bzw. auch über einen 
AARDVARK abhören.

Hierbei stelle ich fest das mein drittes oder viertes Byte nicht 
gesendet werden. Dies kann ich mir nicht erklären, da ich ja gar nicht 
eingreife bzw. eingreifen kann wenn ich per DMA Daten sende.

Was auch komisch ist ich schreibe:
1
blockSize= 6;
2
channel->TRFCNT = blockSize;
und es werden nur 5 Byte gesendet.

Hat jemand hiermit schon erfahrungen gemacht?

Danke für die Hilfe
OP #2103797
Lesenswert?
• ▲
▼
Nein ich initialisiere meine Buffer und ändere danach nichts mehr an 
diesem.
Ich benutze die Treiber von Atmel

Verkürzt mache ich das:
1
static char sendData[NUM_BYTES] ;
2

3
void spi_send_init(DMA_CH_t * ch,USART_SPI_Master_t *usart_spi){
4
  DMA_SetupBlock(ch,
5
    sendData,      
6
    DMA_CH_SRCRELOAD_TRANSACTION_gc,
7
    DMA_CH_SRCDIR_INC_gc,
8
    (void*) &usart_spi->module->DATA,      
9
    DMA_CH_DESTRELOAD_NONE_gc ,
10
    DMA_CH_DESTDIR_FIXED_gc,
11
    NUM_BYTES,
12
    DMA_CH_BURSTLEN_1BYTE_gc,
13
    0,
14
    false);
15
  
16
    DMA_SetTriggerSource(ch,DMA_CH_TRIGSRC_USARTC0_DRE_gc);
17
    DMA_EnableSingleShot(ch);
18
    DMA_SetIntLevel( ch, DMA_CH_TRNINTLVL_LO_gc, DMA_CH_ERRINTLVL_LO_gc );
19

20
}
21

22
main(){
23

24
  for(int i=0;i<NUM_BYTES;i++)
25
    sendData[i]=i;
26
............................
27
  DMA_Enable();
28
  spi_send_init(Channel1,&usart_spiMaster);
29
  DMA_EnableChannel( Channel1 );
30
}
(Firma: TravelRec.) Persönliche Seite #2113278
Lesenswert?
• ▲
▼
Kann das sein, dass die Bitrate von Deinem ControlCenter vielleicht 
etwas zu niedrig ist?!

Hans W. schrieb:
> Hat jemand zufällig auch was mit dem dma usart spi gemacht

Jupp, gerade frisch: Audio-Ein-/Ausgabe über eine über die UART im 
MASTER-SPI-Modus laufende I2S-Emulation. Der XMega macht gut 36Mhz, 
Samplerate des I2S ist 48kHz, 24Bit. Die BitClock liegt bei 3.072Mhz. 1 
Eingabe- und 2 Ausgabestreams laufen zur gleichen Zeit über 3 
DMA-Kanäle. Ich verliere keine Bytes, kann stundenlang Musik über den 
XMEGA hören, ohne dass etwas stottert. Leider verstehe ich nichts von C, 
dafür aber von ASM :-). Ich wollte damit nur sagen, dass die UART im SPI 
hervorragend läuft.
OP #2113911
Lesenswert?
• ▲
▼
Mercy, das ist aber nicht das problem die eingestellte Bitrate ist nur 
zum Senden da wenn das ControlCenter als Master arbeitet.

Ich hab den Fehler gefunden.

Und zwar hab ich ein
1
void USART_DMA_StartTransfer( volatile DMA_CH_t * channel )
2
{
3
  channel->CTRLA |= DMA_CH_TRFREQ_bm;
4
}
5

6
StartTransfer(Channelx);
gemacht was dazu geführt hat das der DMA Controller bereits am Senden 
war und bei einem Byte nochmal den Befehl bekommen hat und somit dieses 
einfach übersprungen hat.

Trozdem Danke für eure Hilfe.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.