Forum: Mikrocontroller und Digitale Elektronik Verständnisproblem ATXMega TWI


von SuperPCFan (Gast)


Angehängte Dateien:

Lesenswert?

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. :)

von SuperPCFan (Gast)


Lesenswert?

schubs

von Bastian W. (jackfrost)


Lesenswert?

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

von SuperPCFan (Gast)


Lesenswert?

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?

von Bastian W. (jackfrost)


Lesenswert?

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

von SuperPCFan (Gast)


Lesenswert?

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. :)

von Bastian W. (jackfrost)


Lesenswert?

SuperPCFan schrieb:
> Du meinst vermutlich Figure 21-12 TWI master operation im Manual, bei
> mir Seite 267.

Genau.

Gruß JackFrost

von SuperPCFan (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.