Ich habe STM32f107 MCU auf Custom Board gelötet. Ich möchte USB-Peripheriegeräte im CDC-Modus verwenden. Ich habe die Pins PA11 (D-), PA12 (D+) und GND direkt mit einem USB-CDC- Kabel verbunden, das zum Computer führt. Das Gerät ist selbstversorgt, daher verwende ich keinen VDD-Pin.
In STM32Cube habe ich ein neues Projekt erstellt und nur das USB_OTG_FS-Gerät und USB_DEVICE im Middleware-Bereich konfiguriert. Außerdem habe ich den Hochgeschwindigkeitstakt im RCC-Bereich so konfiguriert, dass das USB-Peripheriegerät einen Takt von 48 MHz hat.
Dann habe ich das Programmskelett generiert und auf die MCU hochgeladen. Geht leider nicht. Ich denke, das Hauptproblem ist, dass am D + -Pin keine Spannung anliegt, sodass der Computer ein neues Gerät nicht erkennen kann. Wenn ich die CDC_Transmit_FS
Funktion ausführe, fällt der Prozessor in den Hard-Fault.
Das Seltsamste ist, dass, wenn ich die STM32F429-MCU auf dem Discovery-Kit auf ähnliche Weise konfiguriere, der USB sofort funktioniert. Ich habe versucht, den Quellcode zu unterscheiden, aber ich habe keinen entscheidenden Unterschied gefunden (außer dass die STMF4-MCU USB-Hochgeschwindigkeits-OTG im Vollgeschwindigkeitsmodus verwendet).
Hat bitte jemand Erfahrung mit der Verwendung von USB mit dem Programmskelett STM32F107 und STM32CubeMX?
BEARBEITEN: Wenn ich die MCU im Bootloader-Modus betreibe, wird die D + -Leitung auf 3V3 gezogen - daher denke ich, dass die MCU wirklich keinen externen Pull-up benötigt (auch das Datenblatt sagt dies).
EDIT2: Weiß jemand, was die VBUS- Aktivierungsoption in CubeMX genau macht? Ich kann es im Host-Modus verstehen, aber was macht es im Device-Only-Modus?
Obwohl das Gerät selbstversorgt ist, müssen Sie dennoch den Vbus des USB (Pin 1) mit dem OTG_FS_VBUS des Mikrocontrollers (Pin PA9) verbinden.
Dies dient nicht der Stromversorgung, sondern damit der Mikrocontroller weiß, wann er das USB-Subsystem starten soll.
Danke für beide Antworten, du hast recht. Um es zusammenzufassen, werde ich eine andere Antwort geben. Ich hoffe, jemand wird dies nützlich finden.
Sollte ich etwas Falsches angegeben haben, korrigiert mich bitte in den Kommentaren.
Klasyc
Dieses Pull-up-R auf D+ (oder D-) wird verwendet, um die USB-Geschwindigkeit des Geräts anzuzeigen. Während der Host das angeschlossene Gerät durch dieses Pullup erkennen kann, haben Sie in Ihrem Fall ein USB-Gerät (Slave). Und da es selbstversorgt ist, soll es, wie @bitsmack antwortete, die Verbindung erkennen, indem es den VBUS überwacht und den USB-Betrieb startet.
Wenn Sie das USB-Peripheriegerät als Dual Role/OTG konfiguriert haben, müssen Sie auch den USB_OTG_xx_ID-Pin mit dem ID/OTG-Pin in Ihrem Micro-USB-Anschluss verbinden.
Für CDC können Sie in CubeMX Ihr Gerät als Device_Only konfigurieren, VBUS verbinden (Anschluss <-> MCU). Wenn Sie einen Micro-USB-Anschluss verwenden, verdrahten Sie auch die Anschlüsse ID/OTG <-> GND.
Eine Möglichkeit, einen hohen Pegel am VBUS-Pin (PA9) in der Software (oder ohne physische Verbindung) zu registrieren, besteht darin, das Kontrollkästchen „Activate_VBUS“ in CubeMx zu deaktivieren und PA9 zu einem GPIO-Ausgang zu machen, wobei der Standardpegel hoch ist. Dies funktionierte bei mir mit einem STM32F105, der denselben USB_OTG_FS-Stack wie der F107 hat. CubeMx hebt eine Warnung hervor, die jedoch ignoriert werden kann. Das Gerät zählt wie es soll.
Die VBUS-Erkennung ist für Geräte mit eigener Stromversorgung (Slaves) obligatorisch. Die USB-Spezifikation verlangt, dass ein Gerät ohne VBUS keinen Strom an D-Leitungen liefern kann. Ein Gerät mit eigener Stromversorgung muss den Pull-up-Widerstand trennen, sobald VBUS verschwindet.
Beispielsweise kann ein Gerät mit eigener Stromversorgung physisch mit einem ausgeschalteten PC verbunden sein. Da das Gerät noch Strom hat, bezieht es Strom an die D-Leitung, es sei denn, es kann das Fehlen von VBUS erkennen.
Ich bin mir nicht sicher, was passiert, wenn Sie diese Anforderung nicht erfüllen. Ich denke, Ihr Gerät funktioniert mit einigen Hosts gut, mit anderen jedoch nicht. Oder es funktioniert die meiste Zeit, kann aber manchmal ein seltsames Host-Verhalten verursachen. Halten Sie sich am besten an die USB-Spezifikation und gehen Sie kein Risiko ein.
Die VBUS-Erkennung ist für busgespeiste Geräte nicht erforderlich, da kein Risiko besteht, D-Leitungen zu treiben, wenn der VBUS weg ist. Wenn VBUS weg ist, wird das Gerät natürlich auch nicht mit Strom versorgt.
Die OTG_FS-Hardware des STM32 verwaltet ihren internen Pull-up-Widerstand automatisch, wenn die VBUS-Erkennung aktiviert ist. Die andere USB_Device-Hardware, die in einigen anderen STM32-Mikrocontrollern vorhanden ist, verfügt nicht über diese Funktion und benötigt zusätzliche Software und externes Pull-up.
Chris Stratton
bitsmack