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