Forum: Mikrocontroller und Digitale Elektronik TMC222 I2C-Takt


von Walter T. (nicolas)


Lesenswert?

Hallo zusammen,

ich nehme gerade ein altes Projekt wieder auf, in dem ein 
TMC222-Mikroschritt-Schrittmotorcontroller verbaut ist. Als ich mit dem 
Projekt damals angefangen habe, habe ich festgestellt, daß der die 
I2C-Anbindung nur bis zu einem I2C-Takt bis 250kHz korrekt funktioniert. 
Laut Datenblatt (März 2011) schafft der TMC222 allerdings bis zu 350kHz. 
Getestet wurde mit insgesamt drei I2C-Implementierungen auf zwei 
Plattformen. Immer ergab sich die "magische" 250kHz-Grenze.

Ist es für mich wichtig, ob ein Datentelegramm jetzt statt 201µs ganze 
290µs dauert? Ja, ist es! Ein kürzeres Datentelegramm würde mein Projekt 
deutlich vereinfachen.

Bin ich mit der Beobachtung, daß der TMC222 nur 250kHz schafft allein? 
Oder gilt für den Bereich zwischen 250 und 350kHz irgendeine 
Besonderheit zu beachten?

Viele Grüße
W.T.

von chris (Gast)


Lesenswert?

Welche Spannung auf i2c bus?

von Walter T. (nicolas)


Lesenswert?

chris schrieb:
> Welche Spannung auf i2c bus?

5V

von uwe (Gast)


Lesenswert?

Wie groß sind die Pullups? Wo sind die Pullups? Wie lang sind leitungen?
hast du mal nen Oszibild von den Signalen?

von Walter T. (nicolas)


Lesenswert?

uwe schrieb:
> Wie groß sind die Pullups? Wo sind die Pullups? Wie lang sind leitungen?
> hast du mal nen Oszibild von den Signalen?

Pull-Ups sind 2k2, I2C-Länge ist (wenn kein Logger dranhängt) <5cm und 
die Signale sehen auf dem Oszi aus wie gemalt. Zumindest bis zu dem 
Zeitpunkt, wenn der TMC222 den Clock bis in alle Ewigkeit stretcht.

Ich kann aber heute abend nochmal ein Bild machen.

: Bearbeitet durch User
von chris (Gast)


Lesenswert?

Versorgungsspannung >8v und erster Befehl getfullstatus1, auf den der 
chip auch nicht unbedingt antworten braucht wegen Bug.

von Walter T. (nicolas)


Lesenswert?

chris schrieb:
> Versorgungsspannung >8v und erster Befehl getfullstatus1, auf den der
> chip auch nicht unbedingt antworten braucht wegen Bug.

Gibt es zu diesem Bug eine Beschreibung? Tatsächlich mache ich am Anfang 
ein getfullstatus1 (und prüfe auch den Rückgabewert). Es kann 
tatsächlich sein, daß hier schon ein falscher Rückgabewert als Fehler 
aufgefaßt wird. Es kann auch sein, daß mein Todes-clock-stretching schon 
hier auftritt.

Ich weiß nur, daß bei meinen Exemplaren bei <250kHz die Antwort immer 
stimmte.

Hat jemand einen TMC222 mit vollen 350kHz in Betrieb?

: Bearbeitet durch User
von chris (Gast)


Lesenswert?

Gab es, der Link den ich hatte geht auf ein 404 auf der Trinamic Seite. 
Zusammenfassung ist,
Der Reset ist nicht sauber implementiert und der erste getfullstatus1 
liefert falsche Werte und löst gleichzeitig einen internen Reset aus. 
Danach passt es.

von Walter T. (nicolas)


Lesenswert?

OK, es war genau das:

Ich hatte (entgegen obiger Angaben als erstes ein "setmotorparam" und 
kein getfullstatus1 - irgendwie muß ich (eine ältere Version des) 
Datenblatt(s) so gelesen haben, daß ein getfullstatus1 nur vor der 
ersten Bewegung erfolgen muß, nicht vor als erstes Telegramm (bzw. wußte 
nicht, daß das erste getfullstatus1 fehlschlagen darf).

Vorher:
1
status = tmc222_setmotorparam(i2c_addr,pParameters); 
2
checkforerror(status);
3
// => I2C-Status OK
4
5
status = tmc222_getfullstatus1(i2c_addr,pTmcStatus1);
6
checkforerror(status);
7
// => Status OK
8
9
status = tmc222_getfullstatus1(i2c_addr,pTmcStatus1);
10
checkforerror(status);
11
// => Status OK
Diese Version funktioniert bis 250 kHz und produziert über 250kHz 
reproduzierbar einen "clock stretch des Todes".

Nachher:
1
status = tmc222_getfullstatus1(i2c_addr,pTmcStatus1);
2
//checkforerror(status);
3
// => Status nicht OK!
4
5
status = tmc222_getfullstatus1(i2c_addr,pTmcStatus1);
6
checkforerror(status);
7
// => Status OK!
8
9
status = tmc222_getfullstatus2(i2c_addr,pTmcStatus1);
10
checkforerror(status);
11
// => Status OK
12
13
status = tmc222_setmotorparam(i2c_addr,pParameters); 
14
checkforerror(status);
15
// => I2C-Status OK

Diese Variante funktioniert auch bis 350kHz. *)

Danke für den hilfreichen Tipp!


P.S.: Allerdings noch nicht zuverlässig. Aber den Grund werde ich auch 
noch finden.

: Bearbeitet durch User
von Walter T. (nicolas)


Angehängte Dateien:

Lesenswert?

Hier wie versprochen das Oszillogramm. Wie man sieht, ist der I2C bei 
350kHz sicher nicht überfordert.

Es tritt leider oberhalb von 250kHz immer wieder das gleiche Phänomen 
auf: Die Motorsteuerung ist sehr unzuverlässig. Er kann viermal hin- und 
herfahren und beim fünften Mal zieht einer der Busteilnehmer SDA 
herunter und gibt ihn erst nach einem Neustart (Versorgung 
Aus-Einschalten) wieder her.

von Walter T. (nicolas)


Lesenswert?

OK, war ich feststelle: Es ist immer ein getfullstatus2, bei dem sich 
der TMC222 aufhängt und SDA dauerhaft auf low zieht.

Freitakten nach AN10216-01 I2C Manual funktioniert auch nicht. Beim 
ersten Takt läßt der TMC222 zwar die Leitung los - beim 9. Takt zieht er 
sie allerdings wieder an.

Ich probiere mal testweise AN-686 zu implementieren. Am Grundproblem, 
daß sich der TMC222 bei "getfullstatus2" bei höheren Taktraten gerne 
verschluckt, ändert das aber leider nichts.

von Walter T. (nicolas)


Lesenswert?

OK, ein freitakten nach der AN-686 bringt den TMC222 wirklich wieder 
dazu, per I2C zu kommunizieren, ohne einen Reset per Versorgungsspannung 
zu benötigen. Aber das ändert erst einmal nichts am grundlegenden 
Problem:

Der TMC222 kann sich bei einem getfullstatus2 aufhängen. Und zwar nur 
dann, wenn der I2C-Takt >250kHz beträgt.

von chris (Gast)


Lesenswert?

Kann es sein das die Spannung unter -.3V geht
Im Vergleich zu gnd des Bausteins. Wenn ja braucht es 100 ohm 
Widerstände wie im Datenblatt beschrieben.

von Walter T. (nicolas)


Angehängte Dateien:

Lesenswert?

chris schrieb:
> Kann es sein das die Spannung unter -.3V geht
> Im Vergleich zu gnd des Bausteins. Wenn ja braucht es 100 ohm
> Widerstände wie im Datenblatt beschrieben.

Danke für den Hinweis! Aber meine minimalen Unterschwinger (Peaks) waren 
jetzt bei 100 Initialisierungsversuchen bei minimal -145mV. Da liegt das 
Problem vermutlich nicht.


Mein Test besteht aus:
-tmc222_init (die besteht wiederung aus)
   - getfullstatus1 (Ohne Auswertung ob fehlgeschlagen)
   - 1ms warten
   - getfullstatus1
   - setmotorparam
   - 1ms warten
   - getfullstatus1
   - getfullstatus2

-getfullstatus1
-getfullstatus2
-getotpparam
-gotosecureposition
-1000ms warten
-setposition
-evtl. I2C-Reset, wenn oben ein Fehler aufgetreten ist.

Ich habe diesen Test ein paarmal hintereinander gemacht bei 350kHz, ohne 
das Gerät auszuschalten:
46x durchgelaufen ohne Fehler
18x Fehler bei init, erstes getfullstatus beim I2C-Empfang (timeout)
27x Fehler bei init, ab setmotorparam, wieder beim I2C-Empfang (timeout)
13x Fehler bei getfullstatus1, beim I2C-Empfang (timeout)
 6x Fehler bei getotpparam, beim I2C-Empfang (timeout)

Der Timeout liegt bei 800ms. Freitakten nach Analog Devices Application 
nach einem Fehlversuch lief immer.

Bei 250kHz: 0% Fehlerquote.

Der Quelltext ist nicht geheim, aber vermutlich eine Zumutung, deswegen 
die Beschreibung als Text.

: Bearbeitet durch User
von chris (Gast)


Lesenswert?

Man kann nicht verfolgen, wie die Übertragung passiert, ob sie gemäß 
Datenblatt ist oder nicht. Kannst du bitte erörtern, ob du Ack sendest 
oder
nicht, wie im Datenblatt beschrieben ?
Welchen Widerstand hast du am Hw pin, welche Betriebsspannung.

Eventuell schau mal ob deine Revision des Controllers den Befehl 0x9f 
kennt.
SW wird zum analogen Ausgang, da kannst du dann mit dem Scope dran um
die Schaltung zu optimieren/debuggen. Ein HW POR beendet diesen Modus.

von chris (Gast)


Lesenswert?

Achso, wenn Fehler sind, und man getstatus1 auslesen kann, kannst du
das Resultat posten, eventuell passt der Motor nicht zu den 
Standardparametern.

von Walter T. (nicolas)


Lesenswert?

Noch mal zum ursprünglichen Sachverhalt: Ich habe ein Projekt 
wiederaufgenommen, daß seit etwas mehr als einem Jahr brach lag. Es 
existierten drei I2C-Implementierungen (I2C auf STM32, I2C auf AVR, 
Bitbang-I2C auf beiden) auf zwei Plattformen. Alle können ein M24C02 und 
einen LM75 in einem Rutsch fehlerfrei auslesen, die beiden 
Implementierungen auf STM32 bis 400kHz, bei AVR hatte ich nicht mehr als 
250kHz ausprobiert, da die Leitung dort etwas länger ist. Die 
Kommunikation mit einem TMC222 funktionierte immer mit bis zu 250kHz, 
darüber nur sporadisch. Also stellte sich die Frage: Kann der TMC222 
überhaupt mit 350kHz betrieben werden, oder ist das ein Druckfehler im 
Datenblatt? (Es wäre ja nicht der erste gewesen. Im ersten (englischen) 
Datenblatt stimmte ja die Antwort auf getfullstatus1 nicht oder bezog 
sich auf eine andere Hardware-Revision, im deutschen war es korrekt.)

Also lautete meine ursprüngliche Frage: "Betreibt jemand einen TMC222 
erfolgreich bei 350kHz I2C-Takt?". Eine explizite Antwort darauf kam 
nicht, aber implizit lautet die Antwort "Ja."

Gestern abend habe ich ein wenig Zeit mit dem Bus-Logger verbracht, und 
das Bild sieht mittlerweile etwas anders aus:

 - Die AVR-I2C-Implementierung kann nie mit 400kHz getestet worden sein, 
weil das Programm bei 300kHz schon nicht mehr korrekt startet. Da hat 
mich einfach meine Erinnerung getrübt. Die I2C-Implementierung auf dem 
AVR hat also einen Fehler (vermutlich in der Initialisierung).

 - Der STM32F103V8 sendet bei 350kHz beim Empfang unmotivierte NACKs und 
Start-Bedingungen, wo gar keine hingehören. Daß der TMC222 dies mit 
Unwillen quittiert, ist sein gutes Recht. Erstaunlicherweise tritt 
dieses Verhalten mit dem M24C02 an der gleichen Bus-Leitung nicht auf. 
Aber ich gehe davon aus, daß irgendwo in der I2C-Implementierung am 
STM32 auch etwas faul ist. Das werde ich in vermutlich mehreren ruhigen 
Stunden mit einem Logikanalysator klären müssen.

 - Die dritte I2C-Implementierung habe ich gestern abend nicht mehr 
getestet. Es war spät genug.



chris schrieb:
> Eventuell schau mal ob deine Revision des Controllers den Befehl 0x9f
> kennt.
> SW wird zum analogen Ausgang, da kannst du dann mit dem Scope dran um
> die Schaltung zu optimieren/debuggen. Ein HW POR beendet diesen Modus.

Scheinbar hast Du Dich mit dem TMC222 länger herumgeschlagen, oder woher 
hast Du diese Info? Mit "POR" meinst Du einmal wackeln? Jetzt bin ich 
heilfroh, die beiden Widerstände an HW/SW auf dem TOP-Layer zu haben. 
:-)

Längsdämpfungswiderstände lassen sich leider in meinem Testaufbau nicht 
so leicht unterbringen, weil ich momentan keine Zugriff auf 
0402-Widerstände habe. Aber kommt Zeit, kommt Reichelt.

von chris (Gast)


Lesenswert?

Por = power ON reset.
Ich such dir sw i2c code vom pic raus.

von chris (Gast)


Angehängte Dateien:

Lesenswert?

Hier das file, delay sowie ev. init und defines solltest to checken,
timing sollte so gehen.

von Walter T. (nicolas)


Lesenswert?

Danke! Ich werde vor morgen abend nicht dazu kommen, es auszuprobieren, 
aber dann habe ich eine sichere Rückfallebene.

von Walter T. (nicolas)


Lesenswert?

Sehe ich das richtig, daß Du mit Deinen i2c-Routinen ein Kommando wie 
"getfullstatus1" mit einem "i2csendbyte -> I2C_Read" ausführst? 
"I2C_Send" erzeugt ja immer eine Stop-Bedingung am Ende...

von Walter T. (nicolas)


Angehängte Dateien:

Lesenswert?

Mein defekter Bus-Logger (ca. 10% der Pakete werden falsch dekodiert, 
und zwar nur im letzten Bit eines Bytes, wenn eine 1 auf eine 0 folgt) 
hatte mich ein ganzes Stück zurückgeworfen. Viele Vermutungen, was sich 
auf dem Bus abspielte, haben sich schlichtweg als falsch herausgestellt.

Inzwischen sind auch die bestellten SMD-Widerstände eingetroffen und 
wurden als Serienterminatoren am TMC222 verbaut. Das Zeug ist ja so 
klein, daß man beinahe eine Lupe dafür braucht.

Die Hoffnung, daß jetzt plötzlich alles gut würde, und der TMC222 jetzt 
plötzlich mit 350kHz funktionieren würde, hatte ich zwar nicht. Aber 
immerhin: Mit den 47 Ohm Längswiderständen ist zumindest bei 310kHz kein 
einziges Paket mehr verlorengegangen, und der "clockstretch des Todes" 
ist auch kein einziges Mal mehr aufgetreten.

Generell reichen mir die 300kHz. Aber um ein wenig Sicherheitsreserve zu 
haben, werde ich noch ein wenig auf der Bus-Hardware aufräumen.

Danke für die Diskussion!

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.