Forum: Compiler & IDEs Problem mit Interrupts beim Xmeaga128 im Zusammenhang mit DMA


von Christian (Gast)


Lesenswert?

Hallo ihr Lieben.
Mein Problem ist folgendes. Ich nutze den USART vom Xmeaga128A1 als SPI 
Master. Die zu sendenden Daten bekommt USART er direkt vom DMA 
Controller in sein DATA-Register geschriben. Soweit so gut. Ist die DMA 
Transaktion beendet wird der entsprechende Interrupt des DMA Channels 
aufgerufen. Hier muss nun nur noch nebst dem löschen des Interrupt Flags 
geprüft werden, ob schon alle Daten aus dem Shift-Register raus sind, 
und sich nichts mehr im DATA-Register befindet um die Slave-Select 
Leitung wieder auf HIGH ziehen zu können.
Laut Datenblatt reicht für diese Prüfung das Abfragen des TXCIF 
Registers. Der Interrupt des entsprechenden DMA-Channels sieht dann so 
aus:
1
ISR(DMA_CH2_vect){
2
  DMA.CH2.CTRLB |= DMA_CH_TRNIF_bm;
3
  // Warte darauf das SHIFT- und DATA-Register leer sind
4
  while( !(USARTF1.STATUS & USART_TXCIF_bm) );
5
  // (*) Folgender hack hilft: _delay_ms(1);  
6
  // Setze slave select zurück auf high
7
  PORTF.OUTSET = 0x10;
8
}
Allerdings scheint dieser Mechanismus nicht richtig zu funktionieren, 
denn das letzte Byte geht grundsätzlich bei der Übertragung verloren, da 
sich der Slave Select offenbar zu früh ändert. Das ist ziemlich blöd, da 
man so nicht wirklich weiss wann die Übertragung beendet ist und den 
Hack mit der Zwangspause muss.

Meine Frage ist ob jemand von Euch schon ähnliche Phänomene beobachtet 
hat und ggf. Lösungen?

LG, Christian

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.