I2C (TWI) Protokoll mit dem Rigol 1054 betrachtet

Das Rigol 1054Z bietet in der Firmware verschiedene Decoder an, beispielsweise für I2C (=TWI). Der Decoder ist ziemlich leistungsfähig. Kommunikationsprobleme können damit „spielend“ 🙂 gefunden werden.

Im folgenden einige Bilder von einer Analyse, die ich vorgenommen habe.

Obiges Bild zeigt drei Signale und unten die decodierten TWI Daten an. Wenn der decodierte Text wegen Platzmangel nicht darstellbar ist (Zeitbasis zu grob gewählt) wird „…“ dargestellt. Wird die Zeitbasis verfeinert, sind diese Daten dann im Klartext sichtbar.

Violett ist das SDA-Signal, blau das CLK-Signal. Das gelbe Signal stellt keine I2C Daten dar.

Das rote Fragezeichen nach dem „a“ bedeutet, dass der Empfänger kein ACK gesendet hat.

In obigem Bild wurde auf das erste Kommunikationsbyte gezoomt. Man sieht dass der Master versucht, an das Gerät mit der Adresse 0x2E zu schreiben. Dies wird als „W:2E“ dargestellt.  Man kann erkennen, dass der Slave ein ACK gesendet hat und auch der Rigol 1054 hat dieses ACK erkannt, er zeigt kein Fragezeichen an.

Und hier ist das Byte noch weiter vergrößert. Das ACK ist dadurch erkennbar, dass der Slave während der HI-Phase des 9. Taktes SDA auf LO hält. So ist ACK im Protokoll definiert.

Hier ein Datenbyte. Der Decoder zeigt leider den Datenwert bei dieser Zoomstufe nicht an, evtl. fehlt eine Start-Bedingung o.ä. zur Synchronisation. Wenn man herauszoomt, wird der Wert aber angezeigt.

Hier versucht der Master vom Slave mit der Adresse 0x2E zu lesen. er bekommt ein ACK, der Slave hat das Kommando also verstanden. Dann liest der Master vom Slave das Zeichen „0x0a“ ein.  Der Master gibt dem Slave kein ACK am Ende der Übertragung des  Bytes .

Der 1054Z kann den Datenwert auch anders als Hex darstellen, z.B. ASCII und binär.

In diesem Bild ist der „Event“-view des 1054 eingeblendet. Hier wird die Kommunikation zusammengefasst, alles zwischen einem Start und einem Stop kommt in eine Zeile einer Tabelle. Man sieht, dass der Master den Wert „0x37“ in den Slave mit der Adresse 0x07 schreibt. Dann liest der Master aus dem Slave 9 Bytes ein, das letzte Byte wird ohne ACK gelesen.

Konkret wird hier die Kommunikation zwischen einem Solarlademodul (Master) und einer „intelligenten“ Batterie (Slave) dargestellt. Der Master schickt das Kommando 0x37 (read measurement data) und das Batteriemodul sendet die Werte Batteriespannung, momentaner Ladestrom, Batterietemperatur und ein Statusbyte zurück.

In obigen Bild ist eine fehlerhafte Kommunikation zu sehen. Ein Master versucht vom Slave mit der Adresse  0x07 zu lesen, aber der Slave gibt für das „R:07“ Kommando kein ACK.  Der Master versucht daraufhin, die Kommunikation erneut zu starten, bekommt dann aber schon auf das „W:07“ keine Antwort mehr. Irgendetwas ist mit dem Slave passiert.

Obiges Bild zeigt eine weitere Fehlersituation. Der Slave quittiert das „W:07“ und das gesendete Byte 0x02 beides mit ACK,  produziert aber dann während der Master  die Sequenz „R:07“ – <Kommandobyte> schicken will, beim ersten Takt des Kommandobytes eine STOP-Condition. Dies interpretiert der Master (ein ATmega644 mit Hardware TWI) korrekt als Bus Error und bricht die Kommunikation ab.

Erstes Fazit

Die Möglichkeiten des Rigol 1054Z bei der Decodierung serieller Protokolle sind enorm. So wird z.B. auch RS232 und SPI unterstützt. Mit der Möglichkeit des fast beliebigen Hineinzoomens dank des riesigen Akquisitionsspeichers hat man ein mächtiges Hilfsmittel zur Fehlersuche an der Hand.

Durch die vorhandenen 4 Kanäle kann man sich einen dritten Kanal zur Generierung eines Triggers definieren. Auf diese Art kann man sich ganz gezielt auf problematische Situationen fokussieren, indem man z.B. beim Eintreten einer zu untersuchenden Situation einen Trigger erzeugt . Die gesamte „Geschichte“ um die Situation kann dann in Ruhe analysiert werden.

DIY Widerstands Dekade 1 Ohm – 1 Megaohm

Im folgenden ist der Bau einer sechsstelligen Widerstandsdekade beschrieben. Alle benötigten Dateien (Schaltplan, Boarddesign, Skalendesign) sind am Ende des Textes verlinkt.

Designziel

Es können in 1 Ohm Abständen alle Widerstandswerte von 1 Ohm bis 1.000.000 Ohm eingestellt werden. Genauigkeit soll möglichst gut sein, nicht schlechter als 1%.

Umsetzung

Widerstände 0,1% sind noch relativ gut erhältlich. Ich fand bei Reichelt alle Widerstände >=10 Ohm mit 0,1% und nur die Widerstände von 1-9 Ohm mit 1%.

Die Dekade bietet sechs Drehregler um die Werte für Einerstelle, Zehnerstelle etc. bis 100 Kiloohm-Stelle einzustellen. Da die Drehregler 11 Stellungen haben, wurde folgende Stufung gewählt:

0,1,2,3,4,5,6,7,8,9,10

d.h. man kann den nächsthöheren Wert der aktuellen Stelle („10“) noch in derselben Stelle einstellen. Damit ist der Wertebereich sogar größer als im Designziel vorgegeben, man kann Werte bis 1.111.110 Megaohm einstellen.

Platinendesign

Da meine Free-Version von Eagle nur kleinere Platinen designen kann, habe ich die 6 Stellen auf 2×3 Stellen aufgeteilt. Beide Platinen sind identisch und werden direkt nebeneinander montiert.

Die meisten Werte bekommt man als fertigen Einzelwiderstand. Andere Werte wie 60 Ohm oder auch 80 Ohm müssen je nach Werteverfügbarkeit aus 2-4 anderen Widerständen zusammengesetzt werden. Dies ist eine schöne Hausaufgabe für den geneigten Leser 🙂 Ich habe die Platine so entworfen, dass man einen (liegend) oder zwei (stehend) Widerstände einbauen kann. Wenn man zwei Widerstände direkt aneinander lötet, kann man so auch 3 oder 4 Widerstände sauber unterbringen. Dies kann man am vorletzten Bild ganz unten auf der Seite gut sehen.


Platinen teilbestückt

 

 

Gehäuse

Ein fertiges Gehäuse in diesem Format habe ich nicht gefunden. Es muss ziemlich lang sein, braucht aber nur geringe Breite und Tiefe.

Ein Alfer-Aluprofil (ALFER, 65x35mm, 2,5mm Dicke) ist „beliebig“ lang und ziemlich schmal. Platinen wurden so entworfen, dass sie genau in das Profil hinein passen.

Die Rückwand soll später als Kunststoffteil (eigentlich 2 Teile) mit einem 3D-Drucker gedruckt werden.


Erster Test mit Gehäuse

 


Rückseite. Die Rückseite soll mit 3D gedrucktem Kunststoff hergestellt werden.

 

 

 

 


Mit Seitenschneider gekürzte Potiregler. Man kann hier auch sehen, wie bis zu 4 Widerstände verwendet wurden, um einem Wert zu realisieren.

Das Anfertigen der Frontplatte ist kein Problem, für Inkscape gibt es einen Skalengenerator,  mit dem man viele Typen von Skalen anfertigen kann, auch runde.

Passende Skalenknöpfe gibt es z.B. bei Reichelt.


Fertig aufgebaut mit Frontplattenbeschriftung

Dateien

Weiterführende Infos