STM32-USB-Gerät – Anforderung der Gerätebeschreibung fehlgeschlagen

Ich verwende STM32F7-45 auf meinem eigenen Board und versuche, ein USB-Gerät zu programmieren (ich habe virtuelles COM und HID separat ausprobiert).

Aber nach dem Anschließen an den PC wird es (nach einer Weile) mit dem Fehler „ Unbekanntes Gerät (Gerätebeschreibungsanforderung fehlgeschlagen) “ erkannt.

Elektrisch (PCB):
Ich denke, dass PCB hier kein Fehler ist - ich habe nur D + und D- kurze Spuren vom Stecker zum uC und das ist alles.
Ich habe einen Pull-up 1.5k (ich habe es mit und ohne versucht), aber er wird in STM32 nicht einmal benötigt. Ich habe die Verbindung und ein Kabel überprüft und bin mir sicher, dass es eine Verbindung herstellt.

Code:
Ich verwende HAL- und STM32CubeMx-generierten Code, der mit meinem Projekt zusammengeführt wurde. Im Allgemeinen friert Programme ein.

1) Nach dem Ausführen von Zeile (aus dem Bibliothekscode) USBx->GAHBCFG |= USB_OTG_GAHBCFG_GINT;. Ich weiß das, da ich versucht habe, vor und nach dieser Zeile zu drucken, und nur zuerst printf () druckt. Ich verstehe nicht, wie das Programm dort hängen bleiben kann.
Wie auch immer, wenn ich die VBUS-Erkennung deaktiviere, bleibt das Programm dort nicht hängen und das Ganze MX_USB_DEVICE_Initendet.

2) Aber dann führt das Programm einige Zyklen aus (z. B. druckt es "fertig" und leuchtet die LED) und friert danach ein. Vollständig. Diese LED sollte in einer Endlosschleife blinken, tut es aber nicht. Ich habe eine andere LED, die in allen Fehlerbehandlern aktiviert werden muss (wie harte Fehler usw.), und es scheint, dass das Programm nicht dorthin geht (da die LED aus ist), also verstehe ich nicht, wo es hängen bleibt.

  • Nach virtuellem COM habe ich HID ausprobiert, aber ohne Erfolg. Es gibt mir das gleiche Verhalten.
  • Wenn ich das Board über das Ladegerät (nicht den PC) mit Strom versorge, bleibt das Programm nicht hängen.
Hallo MasMas :). Hast du einen Debugger? Was bedeutet es freezes? Was bedeutet es But then, program executes few cycles? Zyklen von was? ' it will print "done" and lit the LED' - über gerade initialisierten USB?. Eigentlich ist Ihre Beschreibung alles andere als technisch oder verständlich.
Es ist vielleicht nicht die beste Beschreibung, da ich mich kurz fassen wollte. Freezes? Nun, ich dachte, es ist eindeutig - es macht keine nächsten Anweisungen im Code, hört einfach auf, sie auszuführen, springt wahrscheinlich in einen Interrupt (oder ich weiß es nicht) oder hat einen anderen Fehler. Ein paar Zyklen von was? Natürlich von CPU = wenige Anweisungen. Auf dem Terminal wird über UART "done" gedruckt. Ich habe ST Link.
I have ST-Link- also überprüfe, wo du landest. Wenn Sie den Debugger und das Schreiben haben, probably jumps somewherezeigt sich, dass Ihr Debugging-Aufwand bei weitem nicht ausreichend war.
Nun, ich habe ST-Link nur nie für etwas anderes als das Programmieren des Flashs verwendet, deshalb ... Normalerweise war ich mit UART zufrieden. Ich verwende Visual Studio und VirtualGDB, aber ich konnte meinen St-Link damit nicht zum Laufen bringen. Ich muss es erst lernen, dann probiere ich es aus und komme wieder hierher.
Sie haben also "Unbekanntes USB-Gerät (Gerätebeschreibungsanforderung fehlgeschlagen)" gesehen, aber die ersten paar Zyklen des Codes haben trotzdem funktioniert?

Antworten (2)

Ich habe das Problem gelöst. Ich weiß nicht, was das Problem war, aber ich habe ein anderes Projekt durchgeführt und jetzt funktioniert alles perfekt.

Um diesen Beitrag für andere, die ihn vielleicht finden, etwas wertvoller zu machen: Ich habe am Anfang ein Programm verwendet, das über STM32CubeMx generiert wurde - und es hat die hier beschriebenen Probleme. Mir wurde vorgeschlagen, STM32F7Cube (Cube nicht CubeMX) herunterzuladen und die Beispiele von dort zu verwenden. Das habe ich gemacht und alles funktioniert.

Im Grunde bedeutet dies, dass Sie ein totes USB-Gerät haben. Ihr STM32-Gerät verfügt über einen D+-Pullup, sodass ein PC die Verbindung erkennt. Wenn der Host jedoch versucht, den Gerätedeskriptor abzurufen, antwortet Ihr Gerät wahrscheinlich überhaupt nicht , da Sie keinen korrekt ausgeführten Code in Ihrem STM32 haben. Generell sollte das Programm laufen und nicht einfrieren. Wenn Sie die VBUS-Erkennung deaktivieren (was das Hauptsignal für STM ist, dass ein USB-Host angeschlossen ist), tut Ihr Programm wahrscheinlich nichts, deshalb beendet es zumindest die Initialisierung. Sie müssen also Ihren STM-Code debuggen und verstehen, warum er einfriert.

Es ist auch möglich, dass Ihr Hardwareanschluss falsch ist. Es wird dringend empfohlen, ein STM-Referenzdesign zu erhalten und Ihre Hardware genau wie auf der Referenzplatine zu verdrahten.

Danke, ich weiß die Antwort zu schätzen, aber ehrlich gesagt ist sie nicht sehr hilfreich :) Ich meine, Sie haben mir geschrieben, dass mein Programm nicht funktioniert und ich es debuggen sollte - das weiß ich, ich habe gefragt, was schief gehen könnte - weil ich es bin Mir gingen die Ideen aus, ich habe den ganzen Sonntag debuggt ... Ich habe Hardware wie im STM Discovery Board, daneben nur zwei Leitungen, die den Stecker und den uC verbinden - es ist schwer, dort den Fehler zu machen. Und ich habe die physikalischen Verbindungen überprüft.
@zupazt3, ich verstehe. Aber zwei Drähte zwischen USB-Anschluss und IC reichen nicht aus. Sie müssen die VBUS-Verbindung mit der richtigen Pegelübersetzung als Eingang bereitstellen (nicht erforderlich als Strom), um Ihren Code auszuführen. Oder deaktivieren Sie diese Erkennungsfunktion ordnungsgemäß im Falle eines über den Bus mit Strom versorgten Geräts. Ein Link zu Ihren Discovery Board-Schaltplänen wäre hilfreich, um Ihre Situation zu verstehen.
Ja, ich habe Vcc von USB auf die VBUS-Leitung in STM32 geleitet. Ich glaube nicht, dass Sie eine Niveauübersetzung benötigen. Die VBUS-Leitung ist 5-V-tolerant und ST verwendet auch keine Übersetzung auf ihren Discovery-Boards. Außerdem habe ich Code mit aktivierter und deaktivierter VBUS-Erkennung ausprobiert (wie im ersten Beitrag beschrieben). Link zum Discovery Board st.com/content/ccc/resource/technical/document/user_manual/f0/…
@zupazt3, könntest du etwas genauer werden? Welche Schnittstelle verwendest du? ULPI PHY oder OTG FS-Port? Was macht man mit ID-PIN? Wenn Sie Ihr Design aus dem Referenzkit ableiten, sollte das mitgelieferte Codebeispiel funktionieren. Beginnen Sie mit dem Code für das Referenzkit und passen Sie ihn dann nach und nach an Ihre Bedürfnisse an.