Forum: Mikrocontroller und Digitale Elektronik LogicPort, USB Protokoll


von Benjamin K. (exs)


Lesenswert?

Moin,

hat einer von euch mal probiert mit dem LogicPort das USB-Protokoll zu 
analysieren? Es gibt meines Wissens ja keinen nativen Interpreter dafür.

Vielleicht hat jemand ein Script oder ähnliches um aus gespeicherten 
Daten sinnvolle USB-Frames zu basteln.

Irgendwelche anderen Ideen wie man das mit dem LogicPort angehen könnte?

von Torsten B. (torty)


Lesenswert?

hab zwar nicht wirklich ahnung aber reicht die abtastfrequnz vom logic 
aus um den eigenen bus abzutasten (nyquist)?

von Benjamin K. (exs)


Lesenswert?

Da der LogicPort kann mit bis zu 500MHz Abtasten, momentan taste ich mit 
50MHz ab, was beinahe 4-facher Busfrequenz entspricht (Annahme hier 
12MBit/s grob 12MHz?). Ich sehe die Signale, aber wegen NRZI und 
Bit-Stuffing ist damit erstmal nicht viel anzufangen.

von Benjamin K. (exs)


Lesenswert?

Habe pcinstruments eine Nachricht geschickt und bei denen nachgefragt. 
Laut Harrison Young ist kein Interpreter für USB in Planung.

von Achim M. (minifloat)


Lesenswert?

Benjamin K. schrieb:
> ist kein Interpreter für USB in Planung.

Kannst du aus dem Originalprogramm sowas wie ein .vcf oder .csv in 
maximaler zeitlicher Auflösung, Rohdaten, exportieren?
Dann steht einem in C oder C++ oder VHDL oder verilog geschriebenem 
Encoder nichts entgegen. Notfalls kann man mit nem .csv sogar M$-Excel 
bemühen...
mf

von Benjamin K. (exs)


Angehängte Dateien:

Lesenswert?

Ich habe mal ein Bildschirmfoto eines Samples gemacht. In der 
exportierten Datei stehen die Samplerate und ein Sampleindex. Der Index 
steht jeweils vor den Messkanaldaten.

Hier der Beispielauszug aus einer exportierten Datei (nicht die Daten 
des Screenshots):

"SamplePeriod","TriggerSample","CompressedData"
"0.00000002","24999994","True"
"SampleNumber","D-","D+"
"000000000","0","0"
"025000001","0","0"
"274853690","1","1"
"274853691","0","0"
"278311098","1","0"
"292389181","0","0"
"293231714","1","0"
"293281640","0","1"
"293281644","1","0"
"293281648","0","1"
"293281652","1","0"
"293281657","0","1"

Wenn ich das richtig interpretiere, dann muss ich zum "Triggersample" 
die "Samplenumber" addieren und komme dann auf den Samplindex wie er in 
der Software angezeigt werden kann. Das "CompressedData" konnte ich 
jetzt nicht abschalten, macht aber wahrscheinlich nichts. Soweit ich das 
sehen kann werden jetzt, wie im Handbuch beschrieben, die jeweiligen 
Signalwechsel gespeichert. Werde mal versuchen die Daten in GNUplot 
darzustellen.

Den Screenshot habe ich als Diskussionsgrundlage angehängt. Soweit ich 
das auf die Schnelle mit "USB 2.0" von H.J.Kelm interpretieren konnte 
sieht man bei "-8us" den SOP mit Full-Speed [vergleiche Seite 51]. Bei 
etwa "-5us" sieht man das EOP. Vor und nach dem Paket ist das ganze im 
Idle-Zustand (Full-Speed), da D+ (grünes Kabel) auf HIGH und D- (weißes 
Kabel) auf LOW liegt.

Die Frage die ich jetzt habe ist, was sehe ich den hier genau? Hat 
jemand damit Erfahrung und kann mir das mal Referenz weiter dekodieren? 
Es müsste sich um das erste gesendete Paket des Host an die Function 
nach dem einstecken der Function handeln.

Anregungen willkommen

von Achim M. (minifloat)


Lesenswert?

Schnitz dir doch einen Decoder in VHDL. Das geht wunderbar mit ghdl, 
gtkWave und ein paar Zeilen Code.

von Benjamin K. (exs)


Lesenswert?

da müsste man aber erst einmal VHDL können...

Außerdem müssen die Daten vorher noch aufbereitet werden, weil ja nur 
die Zustandswechsel gespeichert werden. Die differentiellen "0" und "1" 
ohne Zustandswechsel fehlen also.

Mal schauen wie ich das bewerkstellige.

von Benjamin K. (exs)


Lesenswert?

ich bin einen Schritt weiter, hab mir in Java mal eine NRZI-Dekodierung 
gebastelt.

Das Programm liest momentan eine vom LogicPort erzeugte .CSV-Datei ein, 
berechnet die Samplerate und wertet entsprechend die komprimierten Daten 
aus. Sample-Fehler werden erkannt und entsprechend markiert. Als Ausgabe 
werden die binären 1 und 0 zeilenweise ausgegeben. Es wird zudem EOP 
erkannt, so dass man die einzelnen Pakete gut aus einander halten kann. 
Ein erster Test war ganz vielversprechend.

Um dies in GTKWave zu importieren muss ich die Daten der CSV-Datei wohl 
in ein gängiges Format konvertieren.


Samplen sinnvoller Daten stellt sich allerdings momentan als echtes 
Problem dar. Ich habe mein funktionierendes USB-Gerät mal als einziges 
Gerät an mein Notebook gesteckt und den LogicPort an einen PC.

Es hat den Anschein, dass der Host (Notebook) immer nur SETUP-Pakete 
sendet. Es ist mir bisher nicht gelungen mal die Enumeration zu samplen. 
Da muss sich also am Trigger noch was konfigurieren lassen.

von Sepp (Gast)


Lesenswert?

Also vorne auf dem Bild hast Du eine 0x80 - wenn das kein SOP ist, toll!

von Klaus (Gast)


Lesenswert?

Hallo,

>Sample-Fehler werden erkannt und entsprechend markiert.
Klingt echt gut. Eine Frage hätte ich aber: Fehler beim Dekodieren 
werden erkannt und korrigiert oder erkannt aber (noch) nicht korrigiert? 
Was meinst Du damit?

Gruß Klaus

von Benjamin K. (exs)


Lesenswert?

@Klaus:
soweit ich das sagen kann, bestehen diese Fehler dadurch, dass wohl 
genau im Pegelwechsel gesampelt wird. Dadurch ist ein Signal schon auf 
"HIGH" während das andere noch auf "LOW" ist. Im nächsten Sample stimmt 
es dann. Die Differenz zwischen den Samplen ist also immer 1. "Echte" 
Sample sind, je nach Abtastfrequenz, länger. Etwa 4 (50MHz) bis 8 
(100MHz) mal so lang. Die Länge wird natürlich berechnet und ist nicht 
starr vorgegeben.

Wann immer das Programm also auf zwei Sample trifft, deren Sampleindex 
genau 1 auseinander liegt, wird angenommen, dass es sich um einen Fehler 
handelt. Was eigentlich immer der Fall sein dürfte.

@Sepp:
Auch ein ein "SETUP" hat ein SOP ;-) Das Bild stammte noch von einer 
ersten Messung, bei welcher mein Proband mit einem ganzen Haufen anderer 
Geräte am USB der Messstation hingen. Da war ich "besonders" clever ;-) 
Hatte mich schon gewundert, dass mein USB 1.1 Gerät plötzlich 
Synch-Frames senden kann ...

Leider scheint der interne Speicher des LogicPort nicht für längeres 
USB-Sampling auszureichen. Vielleicht ist das auch der Grund warum es, 
noch, keinen Interpreter gibt.

Wenn Interesse besteht, dann kann ich den Quellcode zur Verfügung 
stellen. Wäre schön, wenn man zum Schluss in der Auswertung alle 
Nachrichten einzeln ausgewertet sieht.

Gruß Benny

von Benjamin K. (exs)


Lesenswert?

Moin,

für alle die es interessiert. Ich habe für mein ursprüngliches anliegen 
folgende Lösung gefunden. Es gibt unter Linux (wenigstens) zwei 
Softwarepakete mit denen man grob USB-Kommunikation debuggen kann. Zum 
einen wäre da Wireshark zum anderen vusb-analyzer. Für beide Programme 
MUSS "usbmon" (ein Debuggin-Tool des Kernels) installiert und aktiviert 
sein.

Bei Ubuntu scheint usbmon als Standard aktiviert zu sein.

Gruß
Benny

von Patrick C. (pcrom)


Lesenswert?

Unter Windows kann man SnoopyPro dafuer benutzen

von Klaus (Gast)


Lesenswert?

Der hier kann USB:

http://basic.io/index.php/category-analyzers/alogic-analyzer-detail

Die Software gibts als Download mit Beispielen.

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.