Hallo zusammen,
ich versuche vergeblich, eine USB Verbindung mit meinem stm32f205
aufzubauen. Was mache ich falsch?
Mein Schaltplan (eigenes Board): siehe Anhang "HW_USB.png".
Meine Konfiguration in CubeMX: siehe Anhang "CubeMX_USB.png"
In dem von CubeMX erzeugten Projekt (ich benutze Keil) habe ich sonst
nichts verändert. Ich habe einfach nur auf "Rebuild" geklickt (lief ohne
Fehlermeldungen durch) und das Projekt anschließend geflasht (ebenfalls
fehlerfrei). Natürlich macht das Projekt nichts (kein Inhalt), aber ich
hatte erwartet, dass wenigstens eine Verbindung zum Host erfolgreich
aufgebaut wird.
Stattdessen meldet der Host (Win 7, Treiber
[STM32_USB-Host-Device-Lib_V2.2.0] von STM sind installiert):
"USB Gerät wurde nicht erkannt"
(VID und PID werden zu "0000" angegeben)
Warum funktioniert das nicht? Ich habe CubeMX so verstanden, dass es für
"Doofe" ist. Also habe ich das Tool ganz "doof" bedient - aber nichts
funktioniert. Jetzt bin ich seit mehreren Stunden auf Fehlersuche und
grabe mich in die Details ein... wenn ich das machen muss, brauche ich
dann aber irgendwann kein CubeMX mehr.
Oder liegt mein Fehler in der Hardware? Habt ihr eine Idee?
MeinerEiner schrieb:> Stattdessen meldet der Host (Win 7, Treiber> [STM32_USB-Host-Device-Lib_V2.2.0] von STM sind installiert):> "USB Gerät wurde nicht erkannt"
Welcher Fehlercode kommt?
MeinerEiner schrieb:> (VID und PID werden zu "0000" angegeben)
Was steht im Device Deskriptor drin? VID und PID muss man normalwerweise
für eigene Projekte anpassen.
Übrigens sieht Dein USB Anschluss verdächtig aus, als ob VBUS und GND
vertauscht sind. Mess da mal nach.
Jim M. schrieb:> Was steht im Device Deskriptor drin? VID und PID muss man normalwerweise> für eigene Projekte anpassen.
Kommt drauf an welche Klasse in CubeMX ausgewählt wurde. Bei den
Standardklassen (CDC, HID, DFU, etc) gibt CubeMX STs VID und
entsprechende PIDs vor.
@TO:
Was ist in CubeMX unter Pinout ausgewählt und was unter Configuration
(unter Middlewares, USB)? In der Default-Einstellung ist die USB-Klasse
ausgeschaltet...
Was ist in Pinout, Peripherals, USB_OTG_FS für ein Modus ausgewählt?
Device only, Host, OTG?
Jim M. schrieb:> Welcher Fehlercode kommt?
Wie finde ich den heraus? Es kommt halt die oben beschriebene
Fehlermeldung und mein STM32 Board wird unter den angeschlossenen
Geräten als "unknown device" gelistet.
Jim M. schrieb:> Was steht im Device Deskriptor drin?
Ich habe die Vorgabe von STM drin gelassen: VID = 1155 und PID = 22336.
Jim M. schrieb:> Übrigens sieht Dein USB Anschluss verdächtig aus, als ob VBUS und GND> vertauscht sind.
Laut Datenblatt des USBLC6-2 ist Pin 2 = GND und Pin 5 = VBus. So habe
ich es auch beschaltet und es sollte daher passen. Oder wie meinst Du
Deinen Hinweis?
Arc N. schrieb:> Was ist in CubeMX unter Pinout ausgewählt und was unter Configuration> (unter Middlewares, USB)?
Die Einstellungen unter Pinout habe ich angehängt. Unter
Middlewares->USB finde ich kein Pinning, aber falls Du das unter
Connectivity->USB_FS meinst: das passt zu dem unter Pinout (siehe
Eröffnungspost).
Arc N. schrieb:> Was ist in Pinout, Peripherals, USB_OTG_FS für ein Modus ausgewählt?> Device only, Host, OTG?
Device_only.
Sollte alles passen, oder? Hmm... Das Board selbst läuft übrigens
natürlich auch ("Hello World" funktioniert).
Ein Schuss ins Blaue aber was hast du als Stack und Heapsize im Projekt?
Die alte USB-Lib der Standard Peripheral Library benötigte mindestends
0x2000 Stack und 0x4000 Heap, wird bei CubeMX das selbe sein.
MeinerEiner schrieb:> Sollte alles passen, oder? Hmm... Das Board selbst läuft übrigens> natürlich auch ("Hello World" funktioniert).
Sieht passend aus
Jim M. schrieb:
> Übrigens sieht Dein USB Anschluss verdächtig aus, als ob VBUS und GND> vertauscht sind.
Könnte der Fehler sein...
PA12 = D+
PA11 = D-
Usb:
1 = VBUS, 2 = D-, 3 = D+, 4 = ID, 5 = GND
bzw.
1 = VBUS, 2 = D-, 3 = D+, 4 = GND
Andere Fehlerquelle: Passt der externe Takt bzw. falls Quarz, schwingt
der an
Christoph S. schrieb:> Die alte USB-Lib der Standard Peripheral Library benötigte mindestends> 0x2000 Stack und 0x4000 Heap, wird bei CubeMX das selbe sein.
Ah ja, guter Hinweis, danke! Ich hab beides auf 0x4000 erhöht. Leider
funktioniert es aber immer noch nicht.
Arc N. schrieb:> 1 = VBUS, 2 = D-, 3 = D+, 4 = GND
Ach so. Das ist einfach eine Jumperleiste, an der ich mein USB-Kabel
angelötet habe. Am USB-Steckverbinder, der in den Host gesteckt wird,
stimmt die Verkabelung. Dennoch danke für den Hinweis.
Arc N. schrieb:> Andere Fehlerquelle: Passt der externe Takt bzw. falls Quarz, schwingt> der an
Ich habe über den System Timer eine LED blinken lassen -> die Frequenz
passt.
MeinerEiner schrieb:> Device_only.
Mit dem USBLC6-2 hatte ich auch mal so meine Probleme.
Ich fand dann im Netz diese für mich nachvollziehbare Erklaerung:
USBLC6-4 and USBLC6-2 are wrong options for USB Device protection.
These parts are good for Host downstream port protection, but never use
them for Device upstream port protection.
TVS diodes array which has "high-side" diodes, like PRTR5V0U2X, USBLC6-4
and USBLC6-2 are good for USB host port.
But this array causes trouble described by the OP on USB device and OTG
ports.
Edit: Soweit ich mich erinnere (liegt schon ein paar Jahre zurück), war
mein Problem aber nicht die USB-Anbindung an sich, sondern ich konnte
wegen des USBLC6-2 das Aus- und wieder Einstecken nicht erkennen und
musste in Software pollen.
Okay, nach einer langen Odyssee hat sich herausgestellt, dass Cube den
Takt falsch eingestellt hat.
Eigentlich war er gar nicht falsch, denn die 48 MHz Domain für USB wurde
schon mit der richtigen Frequenz getaktet. Aber scheinbar mochte der
Controller die PLL Kombination nicht. Möglicherweise steht das sogar
irgendwo in den Tiefen des Datenblatts, nur habe ich das natürlich nicht
gelesen, da Cube ja alles automatisch einstellt. Oder auch nicht.
Jedenfalls frage ich mich, was Cube mir bringt, wenn ich am Ende ein
Vielfaches ins Debugging investiere, als was ich fürs selbst
programmieren gebraucht hätte.
So wie im Anhang gezeigt funktioniert es übrigens.