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. :)
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
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?
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
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. :)
SuperPCFan schrieb: > Du meinst vermutlich Figure 21-12 TWI master operation im Manual, bei > mir Seite 267. Genau. Gruß JackFrost
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. :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.