Verständnisproblem ATXMega TWI

Gast #4686415
Hallo liebes Forum,

ich versuche gerade auf einem ATXMega128-A4U einen TWI Master in 
Assembler zum Laufen zu bringen.
Ich komme allerdings mit dem "Automatisierungsgrad" nicht zurecht, den 
die TWI Hardware der ATX Serie im Vergleich zur AT Serie inzwischen an 
den Tag legt.

Ich habe mir die ATX AN1308 durchgelesen und natürlich das enthaltene 
Flowchart zur Programmierung genutzt. Aus der AN stammt auch der 
angehängte Screenshot. Mein Problem ist der markierte Zweig.

Was muss ich tun, nachdem ich das Slave-Ack für die Lese-Adresse vom 
Slave bekommen (und geprüft) habe?

Der AN nach muss ich dann garnichts mehr tun und nur auf das eingehende 
Byte warten. Dem ATX Manual nach müsste ich aber zumindest die 
Interruptflags löschen (TWI_STATUS schreiben). Davon steht dann aber 
wieder in der AN nichts.

Muss ich die Interrupt Flags in diesem Fall doch manuell löschen?
Muss ich Nullen aus dem Datenregister takten, damit die Clock 
weiterläuft?
Versucht habe ich beides schon ohne Erfolg. Bevor ich jetzt nach 
Logikfehlern in meinem Code suche, was müsste ich prinzipiell an dieser 
Stelle tun?

Für mein Verständnis des TWI Buses (stammt von der AT Serie) fehlt da 
irgendeine Info....oder ich übersehe etwas. :)
Angehängte Dateien:
#4689679
Hi,

im Datenblatt von Atxmega AU steht das das Flag in im Statusregister 
gelöscht wird wenn :

 - in das ADDR Register geschrieben wird
 - in das DATA Register geschrieben wird
 - vom DATA Register gelesen wird.
 - ins CTRLC Register geschrieben wird.

Brauchst du den Interrupt für das lesen überhaupt ? Wenn nein dann 
kannst du beim lesen CLKHOLD abfragen wenn das true ist ist das Byte da.

Gruß JackFrost
Gast #4690017
Das Interrupt Flag (Write oder Read)ist der Indikator, wann meine 
Software wieder etwas tun muss. Beide Flags rufen denselben Interrupt 
Vektor auf. Ich bin jetzt davon ausgegangen, dass das 
Read-Interrupt-Flag gesetzt wird, sobald ein Byte empfangen wurde. So 
steht es zumindest im Manual.

Zum Löschen beider Interrupt-Flags gibts es die Methoden, die du 
aufgelistet hast. Das hatte ich auch gelesen.

Was mich nur wundert und stört ist, dass beim ATX das Löschen des 
Interrupt immer automatisch passieren soll (bei den unterschiedlichen 
anderen Aktionen). So lese ich zumindest das Manual und die AN. Aber der 
Beschreibung im Manual nach, muss ich nach dem Empfangen des Read-Ack 
nichts von den aufgelisteten "automatischen" Methoden tun. Nach der AN 
soll ich auch gar nichts tun und nur warten. Nur wenn ich nichts tue, 
werden auch die Flags nicht gelöscht. Womit die ISR direkt wieder 
aufgerufen (logisch), obwohl noch kein Byte empfangen wurde (unlogisch).

In der AN steht immer an den entsprechenden Stellen "write x" oder "read 
y". Und dann hätte ich auch erwartet, dass in dem markierten Zweig 
"write twi_status" steht. Denn nur so kann ich an der Stelle das 
Interrupt Flag wieder löschen.

Wozu das CLKHLD gut sein soll, erschließt sich mir nicht ganz.
Das Flag stellt ja nur eine Verorderung der beiden Interrupt Flags dar.
Vielleicht für einen Multimaster Betrieb?
#4690093
Das Bild auf seite 259 dürfte besser zu verstehen sein.

Beim senden wird direkt nach dem ACK von Slave in die ISR gesprungen. 
Beim lesen erst nachdem das Byte empfangen wurde.

Mit CLKHOLD kannst du das auch ohne Interrupt abfragen, durch warten.
RIF wird nur gesetzt wenn alles geklappt hat wenn es aber einen 
Busfehler gab wird RIF nicht gesetzt aber CLKHOLD + das Fehlerbit.

Damit würdest du auch nicht in die ISR kommen. Ok du kannst das CLKHOLD 
Bit in der Main abfragen und dann reagieren
1
while(!(TWIx.Status & TWI_MASTER_CLKHOLD_bm));

Wenn du z.B.ohne die Daten nicht weitermachen kannst, ist es die Frage 
ob es sich lohnt dafür eine ISR zu schreiben die nachdem alle Daten da 
sind das Flag fürs weitermachen setzt oder ob es einfacher ist das mit 
while zu schreiben. Wenn du parallel zum ablauf Daten speichern willst 
ist die ISR sicher besser.

Gruß JackFrost
Gast #4690113
Du meinst vermutlich Figure 21-12 TWI master operation im Manual, bei 
mir Seite 267.

Stimmt, die Grafik macht wesentlich deutlicher, wann ich einen Interrupt 
bekomme.

Und ein anderes Problem, das ich schon im Hinterkopf hatte, wird auch 
noch klarer: Die Hardware verwendet den Status "Owner" so gut wie nie.
Ich hatte mich schon gefragt, was denn Priorität hat. "Owner" oder 
"Busy".
Ich prüfe an der ein oder anderen Stelle im Moment auf den falschen 
Busstatus.

Mal schauen, was ich da machen kann. :)
Gast #4691163
Ich habs jetzt zum Laufen gebracht, aber in Zukunft werde ich TWI 
boykottieren. :P
Die Funktionsweise der Bushardware anhand des Datenblatts zu verstehen, 
war schon beim AT ein Krampf....und beim ATX hamse es wieder 
hinbekommen, wichtige Details zu vergessen.

- Entgegen des Datenblattes bringt eine Stopcondition den Bus nicht von 
"Unknown" zu "Idle". Im Mastermode geht das nur mit dem "Bus-Force" 
Befehl.
- Wenn "Quick Command" eingeschaltet ist, gilt die Grafik 21-12 nicht 
mehr. Dann gibt es immer einen Interrupt nach dem Slave-Ack.
- Um den Bus aus einen "Busy"-Fehler Zustand zu holen, muss zwangsläufig 
eine Stopcondition verwendet werden. Da eine Stopcondition keinen 
Interrupt auslöst, kann der TWI niemals ohne polling betrieben werden.

Alles in allem macht es Atmel beim ATX nur "anders", aber leider nicht 
"besser" als beim AT.

Vielleicht helfen die Erkenntnisse ja mal jemandem, der den TWI von 
Atmel noch nicht verteufelt hat. :)

Antwort schreiben

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