USB auf STM32F107RCT und Stm32CubeMX

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_FSFunktion 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?

Bei ST-Teilen benötigen Sie normalerweise den Pullup-Widerstand an einer USB-Datenleitung, die die Gerätegeschwindigkeit als extern angibt - die normalerweise nicht im Chip enthalten sind.
@ChrisStratton Andere ST-Teile erfordern dies möglicherweise, jedoch nicht diesen speziellen Mikrocontroller. Ich habe ein Arbeitsprojekt mit diesem IC und keine Daten-Pullups.

Antworten (5)

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.

Bist du dir sicher? Ich habe die 3-Draht-Verbindung am STMF429I Discovery Kit ausprobiert (ich habe den offiziellen microUSB-Anschluss umgangen und das USB-Kabel direkt an die entsprechenden MCU-Pins angeschlossen) und es hat ohne Probleme funktioniert. Ich denke, das Wichtigste ist, dass die D + -Datenleitung auf 3V3 gezogen wird und dies ein Signal für den Computer ist, die USB-Kommunikation zu starten.
@klasyc Ich sehe aus Ihrer Antwort, dass die Vbus-Erkennung im Gerätemodus erforderlich ist, aber im Hostmodus deaktiviert werden kann. Danke, dass Sie zurückgekommen sind und uns Bescheid gegeben haben!

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.

  • Die USB-Verbindung erfordert GND-, D+- und D-Leitungen. VBUS wird nur für die USB-Kabelerkennung verwendet.
  • Die VBUS-Erkennung kann zumindest auf einigen MCUs deaktiviert werden. In diesem Fall ist kein VUSB-Kabel erforderlich.
  • Wenn Sie das USB-OTG-Peripheriegerät in CubeMX aktivieren, leuchtet der VBUS-Pin nicht auf, auch wenn es notwendig ist (es sei denn, Sie aktivieren das Kontrollkästchen VBUS aktivieren ).
  • Ich kann nicht sagen, was die Option VBUS aktivieren im Gerätemodus bewirkt. Ich habe versucht, Quellen sowohl mit als auch ohne diese Option zu generieren, und beide Projekte erforderten eine VBUS-Leitung, damit USB funktioniert.
  • Wenn Sie Code von CubeMX (ich verwende HAL Version 1.31) mit USB CDC im Gerätemodus generieren, funktioniert der generierte Code wirklich sofort auf stm32f1- und stm32f4-Kernen. Auch wenn Sie keine Sende-/Empfangshandler implementieren, wird die MCU dennoch als VCP erkannt.
  • Ich wollte die VBUS-Erkennung auf STM32F107 deaktivieren, indem ich Null in das VBUSBSEN-Bit im GCCFG-Register schrieb, aber es gelang mir nicht, oder der Wert wurde
    von der USB-Bibliothek überschrieben (die Bibliothek ist ziemlich kompliziert, daher weiß ich nicht, wo genau). die Registerzuordnung). Es ist auch interessant, dass im Referenzhandbuch auf Seite 926, Abschnitt 28.17.3 steht, dass im Gerätemodus die VBUS-Erkennung eingeschaltet sein muss.
  • Die STM32F107-MCU benötigt keinen Pull-up-Widerstand, damit der USB funktioniert.

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.

Ich kann immer noch nicht herausfinden, warum STM32F429 ohne VBUS-Kabel funktioniert und STM32F107 nicht. Glaubst du, es ist ein Hardware-Unterschied der beiden MCUs?
Sie haben Ihren USB-Anschlusstyp nicht erwähnt. Wenn Ihr USB-Mikro ist, müssen Sie den ID / OTG-Pin erden. Das STMF4-Board handhabt den ID/OTG-Pin sicher korrekt per Software. In Bezug auf VBUS ist es in STMF4 bereits verbunden, irgendwie „denkt“ es, dass das Gerät verbunden ist, auch wenn Sie andere 3 Pins verwenden. Vielleicht können Sie die VBUS-Erkennung in der Software deaktivieren.
Ich verwende einen USB-A-Anschluss, der an den Computer angeschlossen ist, und auf der anderen Seite verbinde ich das weiße, grüne und schwarze Kabel direkt mit den Pins des Discovery-Kits (die gleiche Schaltung wie für stm32f107). Daher denke ich, dass der VBUS-Pin nicht notwendig ist.
Da Sie keinen VBUS angeschlossen haben, müssen Sie die VBUS-Erkennung deaktivieren: electronic.stackexchange.com/questions/124063/…
Es ist mir nicht gelungen, die VBUS-Erkennung zu deaktivieren, aber das Anschließen des VBUS-Pins hat wirklich geholfen. Da ich zu viele Beobachtungen habe, habe ich sie in einer separaten Antwort geschrieben. Vielen Dank für Ihre Hilfe.

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.