Debugging serieller Busse Schnell und einfach dekodieren

Serielle Busse sparen Pins, Strom und Fläche, erhöhen aber auch die Komplexität. Entwicklungs-Ingenieure müssen Störsignalen nachforschen, Transienten erfassen, die Standardkonformität auf der Bitübertragungsschicht testen und die Stromaufnahme messen. Wie können moderne Oszilloskope dabei helfen?

Bevor Oszilloskope mit integrierten Dekodierfunktionen verfügbar waren, musste man als Ingenieur die seriellen Frames manuell dekodieren. Dafür musste man sich sehr gut in der Spezifikation des betreffenden Busses auskennen und brauchte ein Quäntchen Glück, wenn man einen ganz bestimmten Frame erwischen wollte.

Bild 1 zeigt die Erfassung eines I²C-Frame mit einem Oszilloskop. Kanal 1 zeigt SCL (Serial Clock Line), Kanal 2 zeigt SDA (Serial Data Line). Um diesen Frame von Hand zu dekodieren, geht man folgendermaßen vor:

  • Das Oszilloskop so einstellen, dass es genau einen Frame erfasst.
  • Einen Screenshot anfertigen.
  • Screenshot in ein Bildverarbeitungsprogramm laden und dort eine Linie auf jede ansteigende SCL-Flanke legen.
  • Pegel von SDA an jeder ansteigenden SCL-Flanke ablesen und, je nachdem, 0 oder 1 notieren.
  • Entsprechend der I²C-Spezifikation Bits zählen: Ein I²C-Frame hat einen Startpuls, 7 Adressbits, ein Schreib-/Lesebit, ein Quittungsbit, 8 Datenbits, ein weiteres Quittungsbit und schließlich ein Stoppbit. Demgemäß kann man die Adressbits und die Datenbits herausziehen und in Hexzahlen umwandeln. Im vorliegenden Beispiel handelt es sich um einen Schreib-Frame mit Adresse 0x29 und den Daten 0x04.

Diese Methode funktioniert zwar, aber sie ist enorm zeitaufwändig und es mag sein, dass man damit nicht den eigentlich gewünschten Frame erwischt. Muss man viele Frames dekodieren, kostet das eine Menge Arbeitszeit und somit Geld. Es springt ins Auge, dass es ein enormer Vorteil ist, wenn das Oszilloskop Frames selbst dekodieren und auch darauf triggern kann. In Bild 2 wurde die Dekodierfunktion des Oszilloskops eingeschaltet und zusätzlich ein serieller Trigger verwendet, um genau diesen Frame zu erfassen. Man sieht den Frame in blau unten auf dem Schirm sowie den Triggerpunkt in gelb oben auf dem Schirm. Mit diesen Funktionen kann ein Ingenieur genau die ihn interessierenden Daten auf dem Bus finden und braucht dafür eben keine detaillierten Kenntnisse von dessen Spezifikation.

Segmentierter Speicher zur ­Erfassung sporadischer Ereignisse

Angenommen, ein Design bestehe aus etlichen ICs, die über I²C mit einem Prozessor kommunizieren, und man wolle alle Daten sehen, die an ein bestimmtes IC gesendet werden. Das kann man auf einfache Weise dadurch erreichen, dass man einen Trigger auf die Adresse des IC setzt. Dann triggert das Oszilloskop immer dann, wenn diese Adresse auf dem Bus auftritt und das Schreibbit gesetzt ist. Trotzdem bekommt man so noch keinen Überblick über die an dieses IC gesendeten Daten, denn das Oszilloskop zeigt ja immer nur einen einzelnen Frame an. In dieser Situation erweist sich segmentierter Speicher als nützlich. Mit segmentierter Speicherung wartet das Oszilloskop, bis die Triggerbedingung erfüllt ist, speichert den Daten-Frame zusammen mit einem Zeitstempel, stellt den Trigger wieder scharf und wartet auf den nächsten passenden Frame. In Bild 3 wurde das Oszilloskop so eingestellt, dass es jedesmal dann triggert, wenn ein Schreibbefehl mit der Zieladresse 0x64 auftritt. Es soll dann 1000 solcher Frames erfassen. Mit diesem Werkzeug kann der Ingenieur sehen, welche Daten in das IC mit der Adresse 0x64 geschrieben werden, wie oft solche Schreibbefehle auftreten und wie das physikalische Signal jedes Daten-Frame aussieht. Wenn bei einem oder mehreren Frames unerwartete Daten auftreten, kann der Ingenieur die betreffenden Frames direkt ansteuern und die Integrität des physikalischen Signals prüfen. Vielleicht hat ja eine Transiente oder ein sonstiges Störsignal den Fehler verursacht.