Forum: Mikrocontroller und Digitale Elektronik STM32 USB Device wird nicht immer erkannt


von T. F. (sar)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich habe ein Board (Schaltplan mit relevantem Teil im Anhang) bei dem 
das USB Device (USB CDC) nur richtig erkannt wird (am Windows PC, 
verschiedene probiert) wenn ich das USB Kabel vor der externen 
Stromversorgung anstecke. Dann wird der virtuelle serielle Port richtig 
erkannt.

Lege ich allerdings erst die externe Spannung an und stecke dann das USB 
Kabel ein bekomme ich die Meldung, dass das USB Gerät nicht erkannt wird 
(failed getting device descriptor).

Den Code habe ich mittels CubeMX erzeugt.

Woran kann das liegen?

Danke,
Stefan

von STM32 (Gast)


Lesenswert?

Ist auch richtig so.... Wenn zuerst die Versorgungsspannung da ist, 
läuft der Controller unter Umständen schon durch einen Teil der 
Initalisierung, der aber zu Erkennung notrwendig wäre.

Mein Tipp: Versuche die Verbindung mit dem USB-Kabel zu erkennen (durch 
abfrage der dort vorhandenen Bertiebsspannung), dann ist gewärhleistet, 
daß die Initalisierung erst beginnt, wenn das Kabel sicher steckt.

von T. F. (sar)


Lesenswert?

Gerade gesehen, habe vergessen zu schreiben, dass es sich um einen 
STM32F072 handelt. Der hat keine VBUS Detection und hat den D+ Pullup 
integriert.

Ich habe mir gedacht, dass der USB Controller im STM32 schlau genug 
dafür ist, oder zumindest die HAL Library den USB Controller dann zu 
initialisieren wenn irgendwas auf den USB Datenleitungen erkannt wird.

Gibt es auf Software-Ebene einen workaround?

von Jim M. (turboj)


Lesenswert?

T. F. schrieb:
> Gibt es auf Software-Ebene einen workaround?

Ja, unter Ausnutzung des USB Reset.
Man initialisiert den USB als Reaktion auf eine fallende Flanke auf der 
D+ Leitung.

Falls das mehr als 100ms dauern könnte, legt man in der Zwischenzeit 
dieses Signal auf GND (Pin als GPIO out programmieren).

von T. F. (sar)


Angehängte Dateien:

Lesenswert?

Habe es gerade an einem STM32F072 Discovery mit dem selben Code 
ausprobiert. Da gibt es das Problem nicht und im Schaltplan sehe ich 
keinen Unterschied. Da gibt es auch keine VBUS detection. Das Bild ist 
aus https://www.st.com/resource/en/user_manual/dm00099401.pdf.

: Bearbeitet durch User
von Ruediger A. (Firma: keine) (rac)


Lesenswert?

Du könntest den Datenverkehr auf dem USB port mittels Wireshark und 
usbcap Driver mitschneiden und den fehlerhaften Fall gegen den 
funktionierenden vergleichen.

von Stefan F. (Gast)


Lesenswert?

T. F. schrieb:
> Ich habe mir gedacht, dass der USB Controller im STM32 schlau genug
> dafür ist, oder zumindest die HAL Library den USB Controller dann zu
> initialisieren wenn irgendwas auf den USB Datenleitungen erkannt wird.

Zumindest ist das der Fall beim STM32L073. Da kann ich das Board zuerst 
in betrieb nehmen und das USB Kabel irgendwann später anstecken (auch 
mehrmals).

von W.S. (Gast)


Lesenswert?

STM32 schrieb im Beitrag #5788337:
> Ist auch richtig so.... Wenn zuerst die Versorgungsspannung da ist,
> läuft der Controller unter Umständen schon durch einen Teil der
> Initalisierung, der aber zu Erkennung notrwendig wäre.

Das ist Unsinn - es sei denn, man hat die ganze Firmware eher 
eigenwillig geschrieben.

Also: Die Initialisierung soll die Peripherie anwerfen, was für den 
USB-Core heißt, daß dieser seinen Takt kriegen muß und ggf. 
eingeschaltet werden muß, daß weiters die Pins wenn nötig auf 
USB-Funktion gestellt werden müssen, daß je nach verbautem USB-Core die 
Zeiger auf die Speicherbereiche eingestellt werden müssen und daß das 
Interruptsystem eingeschaltet wird, so daß die SIE den nötigen Handler 
aktivieren kann.

Das war's.

Alles Weitere wird vom Host veranlaßt und geht über den 
Interrupthandler, der auf Geheiß des Hosts dann auch die eigentlichen 
Interface-Funktionen initialisiert. Deshalb kann die 
Lowlevel-Initialisierung schon Ewigkeiten vor dem Anstecken des Kabels 
passiert sein.

Und der Trick, bei eingebautem 1k5 das D+ Bein mit Gewalt erstmal auf 
low zu ziehen, gilt nur, wenn man sich beim Einstecken des Kabels und 
Betrieb des µC aus VBUS nach dem Reset erstmal eine Ewigkeit an 
anderweitigem Krempel aufhält, bevor man den USB anwirft.


W.S.

von Guido Körber (Gast)


Lesenswert?

Die USB-Library von ST ist "komisch"…
Ohne Nacharbeit sollte man die nicht in Produkten einsetzen.

von Stefan F. (Gast)


Lesenswert?

Guido Körber schrieb:
> Die USB-Library von ST ist "komisch"…

Was ist Dir denn daran negativ aufgefallen? Bei meinen kurzen Tests hat 
das CDC Device immer auf Anhieb funktioniert. Ich bin da allerdings noch 
nicht in die Tiefe gegangen.

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.