Ich habe ein USB-Gerät um einen STM32F105 herum entworfen . Es handelt sich um ein USB 2.0 Full Speed CDC-Gerät, das als virtueller COM-Port unter Verwendung der USB-Bibliothek von ST konfiguriert ist . Es verwendet die eingebaute PHY des STM32 und läuft mit 12 Mbps.
Ich sende Daten in 254-Byte-Paketen. Gelegentlich (durchschnittlich 1 von 17000 Paketen) empfängt der Host-Computer fehlerhafte Daten. Es ist im Allgemeinen auf ein einzelnes Byte im Paket beschränkt.
Also betrachte ich die Signale mit einem Tektronix TDS2025 O-Scope (200 MHz).
Die meisten Übergänge sehen gut aus:
Aber mein Low-Tech-Augendiagramm zeigt etwas Unerwartetes:
Ich habe es geschafft, eine der schlechten Wellenformen einzufangen, die so aussieht:
Was könnte dies verursachen? Ich bin mir nicht sicher, wo ich anfangen soll zu suchen.
Wenn ich das Gerät zum ersten Mal einstecke, findet die Aufzählung erfolgreich statt und das Augendiagramm sieht sauber aus. Aber sobald ich den COM-Port öffne (mit PuTTY, Hercules oder meiner benutzerdefinierten Java-Software), werden die Störungen angezeigt. Ich verwende ein Lenovo Thinkpad mit Windows 7.
Hier ein Bild vom Layout:
Der TVS IC ist ein NXP PRTR5V0U2F und der Ladedetektor ist ein TI BQ24392 .
Die USB-Spuren bewegen sich etwa einen Zoll auf der Rückseite der Platine, dann kommen sie wieder hoch und verbinden sich direkt mit den USB-Pins des Mikrocontrollers. Sie sind impedanzgesteuert und in geeigneter Länge aufeinander abgestimmt.
Ich prüfe von den Lötpads des USB-Anschlusses zum Massepunkt, den ich auf dem Bild beschriftet habe. Die Sonde hatte eine kurze Erdungsfeder, keine lange Krokodilklemme.
Wenn mehr Daten helfen würden, lassen Sie es mich bitte wissen. Außerdem ist dies mein erstes USB-Gerät und mein erster Sehtest. Wenn Sie feststellen, dass etwas mit meinem Setup oder meinen Annahmen nicht stimmt, lassen Sie es mich bitte wissen.
Es sieht nicht so aus, als ob es sich um ein Hardwareproblem handelt. Die gestufte Wellenform sieht entweder so aus, als würde eine Reflexion stattfinden, oder dies geschieht am Übergang, wenn der Host und das Gerät die Sender- und Empfängerrollen wechseln. In jedem Fall sieht das Signal gut genug aus, um richtig dekodiert zu werden.
Es würde helfen, wenn Sie den Auslöser Ihres Zielfernrohrs irgendwo auf dem Bildschirm platzieren. Wenn der Trigger außerhalb des Bildschirms liegt, kann es sein, dass Sie offensichtlicher Jitter bekommen, als es wirklich auf einem Bit ist.
Sie müssen sich Ihre Software genau ansehen. Höchstwahrscheinlich haben Sie irgendwo einen Fehler, der ein Byte beschädigt oder verfehlt oder hinzufügt, wenn ein bestimmter Eckfall auftritt. Dies könnte zum Beispiel während einer Konkurrenz um den FIFO sein, wenn es ein Byte zu wenig voll ist oder so. Wenn auf den FIFO sowohl von Interrupt- als auch Vordergrundcode zugegriffen wird, dann ist dies genau die Art von schwer zu findendem Problem, das Sie erwarten, wenn die Sperrlogik nicht ganz richtig ist.
Buffer[index] = data; index++;
). Als ich meine eigene Funktion gebaut habe, habe ich es so gemacht: Buffer[index++] = data;
Anscheinend würde der USB-Prozess (sehr gelegentlich) stattfinden, nachdem der Index inkrementiert wurde, aber bevor die Daten geschrieben wurden.Das ist ein absolut perfektes FS-Signal. Anscheinend prüft das OP die Signale am Geräteende des Kabels. Die FS-Signale werden per USB-Standard nicht abgeschlossen. Alle eingehenden Signale (hostgesteuert) sind in Ordnung, da sie am Zielpunkt gemessen werden. Wenn das Gerät jedoch gelegentlich ein Handshake-Paket (kurz ACK oder NAK oder anderes) zurücktreibt, trifft der Treiber auf die Übertragungsleitung. Ein Signal mit halber Amplitude (Shouder) wird entwickelt, bis die Reflexion vom Host-Ende zurückkommt. Dies ist ein absolut normales Verhalten von Signalen auf nicht abgeschlossenen Übertragungsleitungen. Wie ich sehe, beträgt die Roundtrip-Verzögerung etwa 20 ns oder 10 ns in eine Richtung. Dies zeigt, dass das verwendete Kabel etwa 2 m lang ist oder ein Standardkabel von 6 Fuß. Wenn das OP den Bus am Host-Ende untersuchen würde, würde er ein entgegengesetztes Bild sehen. Nur meine 2c.
Ich sende Daten in 254-Byte-Paketen. Gelegentlich (durchschnittlich 1 von 17000 Paketen) empfängt der Host-Computer fehlerhafte Daten. Es ist im Allgemeinen auf ein einzelnes Byte im Paket beschränkt.
Verwenden Sie einen FIFO? Wenn ja, überprüfen Sie Ihren Quellcode: Es gibt schlechte FIFO- Beispiele, die tatsächlich das Lesen eines "schlechten" Bytes ermöglichen.
Die „schlechte Wellenform“ liegt noch innerhalb der Spezifikation. Sie sehen wahrscheinlich eine Reflexion, wenn der PC Daten sendet. Dies ist besser, wenn Sie einen Hub oder die rückseitigen Anschlüsse eines Desktop-PCs verwenden, und schlechter bei Anschlüssen an der Vorderseite, die durch längere Kabel innerhalb eines PCs verbunden sind.
Tom L.
Benutzer2943160
Das Photon
Benutzer76844
bitsmack
Peter Schmidt
bitsmack
bitsmack
Tom L.
Andi aka
Transistor
Tom L.
Transistor