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
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.
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?
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).
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
Du könntest den Datenverkehr auf dem USB port mittels Wireshark und usbcap Driver mitschneiden und den fehlerhaften Fall gegen den funktionierenden vergleichen.
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).
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.
Die USB-Library von ST ist "komisch"… Ohne Nacharbeit sollte man die nicht in Produkten einsetzen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.