Forum: Mikrocontroller und Digitale Elektronik [STM32] Olimex STM32-P103 + Virtual Com


von Bernhard (Gast)


Lesenswert?

Hallo,

nachdem ich bisher nur Erfahrung mit RS232 habe, möchte ich nun einen 
Schritt weiter gehen und mich an die Kommunikation über USB wagen. Ich 
würde nun also sehr gerne Daten von meinem Olimex STM32-P103 Board 
mittels Virtual Com auf den PC übertragen. Bevor ich anfange, mich in 
irgendwelchen Details zu verlaufen, wollte ich als erstes mal schauen, 
dass ich ein Demoprojekt zum Laufen bekomme.

Ich hab mir daraufhin folgenden Sourcecode [1] heruntergeladen. Wenn ich 
das richtig verstanden habe, dann sollte es ja reichen, wenn ich in der 
Datei hw_config.h folgende Zeilen auf meine Bedürfnisse anpasse (der 
Rest ist ja hardwareunabhängig):
1
  #define USB_CONNECT                      GPIOC  
2
  #define USB_CONNECT_PIN                  GPIO_Pin_14
3
  #define RCC_APB2Periph_GPIO_CONNECT      RCC_APB2Periph_GPIOC

Das Problem ist, wenn ich die Software auf den uC flashe, dann tut sich 
erstmal gar nichts. Eigentlich hätte ich ja erwartet, dass Windows nach 
dem Flashen des Mikrocontrollers ein neues USB-Device findet und mich 
auffordert einen Treiber zu installieren. Doch da tut sich wie gesagt 
überhaupt nichts.

Um den Fehler einzugrenzen, hab ich daraufhin erstmal den Debugger 
angeschmissen. Ich bin ich dann draufgekommen, dass das Programm in 
folgender Zeile (in main-usb.c) festhängt:
1
if ((count_out != 0) && (bDeviceState == CONFIGURED))

Ich hab mich mittlerweile schon stundenlang durch den Sourcecode 
gekämpft und versucht den Fehler weiter einzugrenzen, aber ich komme 
einfach auf keinen grünen Zweig. Wie man [1] entnehmen kann, funtioniert 
das Demoprogramm auf dem STM32 Eval-Board von ST ja. Die Frage, die ich 
mir jetzt stelle, ist: Warum funktioniert das Demoprogramm auf dem 
Eval-Board von ST aber nicht auf dem Board von Olimex? Meine Vermutung 
wäre, dass Olimex den USB Connect/Disconnect irgendwie anders handhabt, 
als das Eval-Board von ST. Ich hab mir daraufhin auch schon mal die 
beiden Schaltpläne ([2] und [3]) angesehen, um zu untersuchen ob die 
sich vielleicht bezüglich der USB Anbindung irgendwie unterscheiden. 
Konnte da aber auch keine großen Unterschiede feststellen.

Langsam gehen mir nun echt die Ideen aus...

Hat von euch vielleicht jemand einen Tipp?

[1] http://www.mikrocontroller.net/articles/STM32_USB-FS-Device_Lib
[2] 
https://www.olimex.com/Products/ARM/ST/STM32-P103/resources/STM32-P103-sch.gif
[3] http://it.mouser.com/pdfdocs/stm3210beval.pdf

von Ersi (cell85)


Lesenswert?

Kann sein das es olimex diese VBUS, disconnect pin erkennung benutzt. In 
diesem  Fall wird geprüft ob VBUS da ist und/oder der connect/dsconnect 
pin low oder high ist... check das mal ab!

von Bernhard S. (menecken)


Lesenswert?

Wäre das dann der
1
#define USB_CONNECT_PIN
?

Bei Olimexino STM32 (STM32F103RB) müsste es demzufolge nach dem 
Schaltplan [1] PC11 sein (geht an USB_P und USB_P geht an VBUS)

Wäre für Hilfe echt dankbar, versuche schon seit einer Woche USB zum 
Laufen zu kriegen!

Besten Dank


[1] 
https://www.olimex.com/Products/Duino/STM32/OLIMEXINO-STM32/resources/OLIMEXINO-STM32.pdf 
Schaltplan S.5

von W.S. (Gast)


Lesenswert?

Ben Schlegel schrieb:
> Wäre für Hilfe echt dankbar, versuche schon seit einer Woche USB zum
> Laufen zu kriegen!

Du kaust schon eine ganze Woche auf diesem Problem herum und hast dich 
"mittlerweile schon stundenlang durch den Sourcecode gekämpft und 
versucht den Fehler weiter einzugrenzen" ?

Ja, hast du denn schon einmal die diversen Dokus zum USB gelesen - oder 
bloß drauf gehofft, daß das gefundene Beispiel bei dir problemlos 
funktioniert?

Lies einfach mal hier : 
"Beitrag "STM32F10x USB VCP Einsteiger";
Da hat einer offenbar das gleiche Problem wie du. Ich hab ihm eine 
meiner Quellen geschickt, ist vielleicht für dich auch hilfreich.

Aber verstehen mußt du es selber. Der USB-Core braucht seinen 
richtigen Takt, die verwendeten Pins müssen passend aufgesetzt werden 
und VUSB muß richtig anliegen. VUSB ist quasi das /RESET Signal für den 
USB-Core. Ist das nicht auf High, läuft garnix. Als nächstes muß man D+ 
über 1k5 hochziehen, damit der Host merkt, daß da ein Device ist. Wo und 
mit welchem Pin du diesen Aktivator ansteuerst, ist deine Sache und 
unterscheidet sich vermutlich von allen anderen Boards. Der Rest sollte 
eigentlich interruptgesteuert von selbst laufen.

W.S.

von technikus (Gast)


Lesenswert?

Wie , wo muss denn VUSB am STM32F103 angeschlossen werden und wie muss 
der zugehörige Pin konfiguriert werden?
Das scheint vielen, wie mir, ein Mysterium zu sein...

von W.S. (Gast)


Lesenswert?

ein Mysterium?
Nö, hier gibt es kein Mysterium. Wozu gibt es Manuals zu den STM32Fxxx?

Also, ich hab den STM32F103ZET6 verbaut und dort liegen die Signale wie 
folgt:
VUSB auf Port PG15
D+ auf  Port PA12
D- auf Port PA11
und Port PB2 habe ich für den 1k5 Hochzieher benutzt. PB2 kann ein 
stinknormaler Output sein, aber die anderen mußt du dem USB zuordnen. D+ 
und D- hab ich als 50 MHz Out und Alternativfunktion gesetzt und PG15 
als Input und Conf=8 gesetzt - wegen ggf. Pulldown.

Also schau ins für deinen Chip zuständige RefManual.

W.S.

von technikus (Gast)


Lesenswert?

Den Zusammenhang zum VUSB auf PG15 kann ich im Datenblatt nicht finden
http://www.st.com/web/en/resource/technical/document/datasheet/CD00191185.pdf

Zeig mir doch mal wo?!

Die anderen Zuordnungen sind schon klar...

von W.S. (Gast)


Angehängte Dateien:

Lesenswert?

Es ist verrückt.
Ich hab mir jetzt mal das aktuelle RM008 von 2011 und auch das aktuelle 
DS heruntergeladen und finde VUSB selber nicht mehr. PG15 ist bloß noch 
ein popliger Port und zum Einschalten der SIE braucht man bloß noch 
23.4.2 zu beachten.

Nun gut, ist ja besser als anders herum. Ich hab grad mal geschaut, 
meine Eval- und Bastel-LP hatte ich in 2009 gemacht (damals mit Eagle 
3.5), siehe Anhang. Ich hatte damals die 5V vom USB auf 3.3V 
heruntergeteilt und an PG15 geschaltet, um die SIE aus dem Reset zu 
holen. Scheint nicht mehr nötig zu sein.

Also bleibt nur noch dreierlei: SIE mit richtigem Takt versorgen, SIE 
richtig einschalten (RM Kapitel 23.4.2) und den 1k5 Hochzieher 
hochziehen lassen und dann hinein damit in die USB-Buchse.

W.S.

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
Noch kein Account? Hier anmelden.