Forum: Mikrocontroller und Digitale Elektronik STM32F4 USB CDC


von ESC- (Gast)


Angehängte Dateien:

Lesenswert?

Guten Tag,

derzeit ersetze binich dabei einen LPC1778 durch einen STM32F4 zu 
ersetzen.
Dazu gehören auch alle Softwaretreiber.

Bisher war es so, dass für den LPC1778 der USB CDC Treiber der Keil RL 
verwendet wurde. Das ganze läuft soweit auch einwandfrei.

Da es für den STM32F4 ebenfalls von Keil einen USB CDC Treiber gibt, 
möchte ich diesen gerne verwenden.  usbd_STM32F4xx_FS.c

Ich nutze den USB_FS Modus und nur als CDC Device über einen VCP am PC.

Ich bin nun schon soweit, dass sich meine Applikation korrekt am PC 
anmeldet. Zur Analyse verwende ich USBlyzer. Die ganzen Discriptoren 
stimmen exkat mit der alten Applikation überein.

Bisher dachte ich, dass alles einwandfrei funktioniert aber ein PC 
Programm, welches mit der Applikation kommunizieren soll, kann keine 
Verbindung zur Platine mit dem STM32F4 aufbauen.

Im USBlyzer ist mir aufgefallen, dass sich zwar die beiden Platinen 
identisch mit den Disciptoren anmelden, allerdings sendet die alte 
funktionierende Hardware etwa alle drei Sekunden folgende Daten aus dem 
angehängtem Bild.

Bei meinem STM32F439 ist nach der Anmeldung Schluss. Siehe Bild 2

Habt ihr eine Idee, woran das liegen könnte ? Scheinbar funktioniert die 
Anmeldung und ich konnte auch schon testweise Daten über USB zum STM32F4 
senden.

Vielen Dank.

von ESC- (Gast)


Lesenswert?

Beim LPC Controller wird regelmäßig die Funktion USBD_WriteEP 
aufgerufen. Beim STM32F4 leider nicht. Hat jemand eine Idee, woran das 
liegen könnte ?

von W.S. (Gast)


Lesenswert?

ESC- schrieb:
> Habt ihr eine Idee, woran das liegen könnte ? Scheinbar funktioniert die
> Anmeldung und ich konnte auch schon testweise Daten über USB zum STM32F4
> senden.

Tja, da bleibt dir weiter nix übrig, als dich tatsächlich mit dem 
konkreten Treiber zu befassen, bis du dessen Funktionalität begriffen 
hast.

Die Datenrichtung Host-->Device funktioniert immer, sofern das Device 
sich als empfangsbereit zeigt. Die umgekehrter Datenrichtung 
funktioniert nur dann, wenn das Device sich durch Laden eines 
Sendepuffers und Gültigmachen desselben als sendebereit dem Host zeigt. 
Genau das aber ist die dezente Schwierigkeit bei einem CDC, denn dort 
muß ja der Treiber im µC die Stoßstelle zwischen asynchron und synchron 
beim Datenverkehr bewerkstelligen. Ich mach das bei meinen USB-CDC 
Treibern so, daß der Treiber in beiden Richtungen einen gehörig großen 
Puffer vorhält und ich zum Wieder-Anstoßen des Datentransfes 
Device-->Host den 1 ms Tick benutze.

W.S.

von ESC- (Gast)


Lesenswert?

Nutzt du auch den Keil USB CDC Treiber der RL ?

Ich dachte das Verhalten der beiden Keil Treiber für den LPC und STM 
wären identisch.

von Herbert (Gast)


Lesenswert?

ESC- schrieb:
> Ich dachte das Verhalten der beiden Keil Treiber für den LPC und STM
> wären identisch.

Das wäre wohl eine Frage für den Support.

von W.S. (Gast)


Angehängte Dateien:

Lesenswert?

ESC- schrieb:
> Ich dachte das Verhalten der beiden Keil Treiber für den LPC und STM
> wären identisch.

Die USB-Cores unterscheiden sich erheblich.

Bei den STM's muß man Statusbits per XOR ändern, das ist aus meiner 
Sicht herzlich ungewöhnlich. Die Unterschiede kann man sich mal anhand 
der angefügten Quellen zu Gemüte ziehen.

W.S.

von ESC- (Gast)


Lesenswert?

Die USB Cores unterscheiden sich schon. Nur bin ich davon ausgegangen, 
dass die Entwickler von Keil funktionsgleiche Treiber für USB CDC 
entwickeln.

Beim LPC läuft alles problemlos. Dateien hinzugefügt und arg viel mehr 
war da nicht zu machen. Beim STM32 hängt es leider.

von ESC- (Gast)


Lesenswert?

Kann es auch sein, dass mein .INF File Schuld daran ist, dass die 
Kommunikation nicht richtig funktioniert ?

Ich habe ebenfalls das von Keil verwendet.


1
;------------------------------------------------------------------------------
2
;  Installation
3
;------------------------------------------------------------------------------
4
5
[SourceDisksFiles]
6
7
[SourceDisksNames]
8
9
[DestinationDirs]
10
FakeModemCopyFileSection=12
11
DefaultDestDir=12
12
[FakeModemCopyFileSection]
13
14
[MCBSTM32F400USB]
15
include=mdmcpq.inf
16
CopyFiles=FakeModemCopyFileSection
17
AddReg=MCBSTM32F400USB.AddReg
18
19
[MCBSTM32F400USB.AddReg]
20
HKR,,DevLoader,,*ntkern
21
HKR,,NTMPDriver,,usbser.sys
22
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"
23
24
[MCBSTM32F400USB.Services]
25
AddService=usbser, 0x00000002, DriverService
26
27
[DriverService]
28
DisplayName=%DRIVER.SVC%
29
ServiceType=1
30
StartType=3
31
ErrorControl=1
32
ServiceBinary=%12%\usbser.sys
33
34
;------------------------------------------------------------------------------
35
;  String Definitions
36
;------------------------------------------------------------------------------
37
38
[Strings]
39
Keil       = "Keil - An ARM Company"
40
DRIVER.SVC = "MCBSTM32F400 USB VCOM Driver"
41
DESCRIPTION= "MCBSTM32F400 USB VCOM Port"
42
COMPOSITE0 = "MCBSTM32F400 USB VCOM Port"
43
COMPOSITE2 = "MCBSTM32F400 USB VCOM Port"

von W.S. (Gast)


Lesenswert?

ESC- schrieb:
> Beim LPC läuft alles problemlos. Dateien hinzugefügt und arg viel mehr
> war da nicht zu machen. Beim STM32 hängt es leider.

Tja, wie gesagt, mußt du dich dann eben in die Details hineinknien. Als 
was ist dein STM denn am PC angemeldet?

Ach ja, ich hatte bei allen meinen USB-CDC's die gleichen Deskriptoren 
benutzt (von Nuvoton), was Probleme mit unterschiedlichen .INF erst 
garnicht hat aufkommen lassen.

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.