Forum: Mikrocontroller und Digitale Elektronik STM32L4 USB MSC


von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Hallo,
ich bin gerade dabei, ein von ST für den STM32L476 implementiere USB 
Mass Storage Library von einem STM32L476G-EVAL mit SSD auf ein 
STM32L476-Nucleo Board mit internem flash zu tragen.

Compiler ist gcc, das ganze baut auch "schon" und es werden treten auch 
keine asserts oder hard faults mehr auf. Ich habe D+ und D-, Masse und 
5V (USB) einfach an das Nucleo board gelötet. Auf meinem kleinen USB 
Oszilloskop sehe ich auf D+ und D- nur ein Rauschen um die Null-Linie 
herum. Von daher denke ich, dass ich da elektrisch evtl. noch nicht ganz 
da bin, wo ich sein sollte.

Wie müsste der Signalverlauf eigentlich aussehen, wenn ich das 
USB-Device an einen PC stecke? Hat jemand von euch schon mal USB MSC auf 
einem STM32L476 implementiert / sortiert? Habt Ihr noch irgend welche 
Tipps für mich? ;-)

mfg, schönen Dank im Voraus und frohe Ostern,

Torsten

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Beim Debuggen komme ich an eine Stelle, wo das "Soft Disconnect" bit im 
"OTG device control register" zurück gesetzt wird und damit das device 
"eigentlich" conencted sein sollte.

von Jim M. (turboj)


Lesenswert?

Torsten R. schrieb:
> Auf meinem kleinen USB
> Oszilloskop sehe ich auf D+ und D- nur ein Rauschen um die Null-Linie
> herum.

D+ muss (mit 1k5) nach +3V3 gezogen werden. Bei manchen USB-µCs ist 
dieser Widerstand integriert ->Datenblatt. Ohne den Widerstand erkennt 
der PC am USB Port gar nix.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Angehängte Dateien:

Lesenswert?

Hallo Jim,

Jim M. schrieb:

> D+ muss (mit 1k5) nach +3V3 gezogen werden. Bei manchen USB-µCs ist
> dieser Widerstand integriert ->Datenblatt. Ohne den Widerstand erkennt
> der PC am USB Port gar nix.

danke für's Draufgucken. Die Wiederstände sind mit im Controller 
integriert. Da ich sie aber im Oszilloskop nicht sehen kann, läuft 
offensichtlich etwas falsch. Ich werden jetzt mal über alle Register 
hoppeln und gucken, ob ich dabei noch "Inspirationen" bekomme, wo ich 
noch suchen kann.

mfg Torsten

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Ich habe jetzt mal sicher gestellt, dass USB_DevConnect() aufgerufen 
wird (breakpoint), welches zur Aktivierung der Wiederstände führen 
sollte. Das SDIS flag im OTG_DCTL wird gelöscht und ist auch laut 
Debugger gelöst (Inhalt des Registers = 0).

Aber leider sehe ich immer noch keinen Pegel. Wenn ich versuche, mit 
einem 100k Widerstand, D+ auf high zu ziehen, dann gelingt mir das 
allerdings nicht (~0,8V), was dafür sprechen würde, dass ein Pulldown 
Widerstand aktiv ist.

Die ISR zum OTG Peripheral wird leider auch nie aufgerufen. Ich würde 
davon ausgehen, dass dies zumindest, wenn ich die 5V vom USB anschließe 
mal passieren müsste (device detected).

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Wenn ich den BOOT0 pin auf 1 setze, dann ist der interne Bootloader 
aktiv und D+ ist auf high. Die Hardware scheint also ansatzweise in 
Ordnung zu sein.

Edit: und mit einem USB Analyser kann ich sehen, dass zwischen device 
und PC ein Protokoll gesprochen wird, bei dem scheinbar keine Fehler 
auftreten.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Ich bin nach einem Tipp aus dem ST Forum noch mal die Einstellungen der 
Clock durch gegangen und bin darauf gestoßen, dass wenn ich eine externe 
Clock Quelle nutze, da noch ein Flag gesetzt werden muss.

Nun bin ich noch mal alle Clock Register durchgegangen (entschuldigt 
bitte das Englisch):
1
Clock control register:
2
=======================
3
(gdb) x/x 0x40021000
4
0x40021000:  0x03070063
5
6
0x03070063 boils down to:
7
MSION:    1: MSI oscillator ON
8
MSIRDY:   1: MSI oscillator ready
9
MSIPLLEN: 0: MSI PLL OFF
10
HSION:    0: HSI16 oscillator OFF
11
HSEON:    1: HSE oscillator ON
12
HSERDY:   1: HSE oscillator ready
13
HSEBYP:   1: HSE crystal oscillator bypassed with external clock
14
PLLON:    1: PLL ON
15
PLLRDY:   1: PLL locked
16
17
PLL configuration register
18
==========================
19
(gdb) x/x 0x4002100c
20
0x4002100c:  0x03301803
21
22
0x03301803 boils down to:
23
PLLSRC: 11: HSE clock selected as PLL, PLLSAI1 and PLLSAI2 clock entry
24
PLLM:   000: PLLM = 1
25
PLLN:   0011000: PLLN = 24
26
PLLPEN: 0: PLLSAI3CLK output disable
27
PLLP:   0: PLLP = 7
28
PLLQEN: 1: PLL48M1CLK output enable
29
PLLQ:   01: PLLQ = 4
30
PLLREN: 1: PLLCLK output enable
31
PLLR:   01: PLLR = 4
32
33
which leads to:
34
  f(VCO clock) = f(PLL clock input) × (PLLN / PLLM) = 8Mhz x (24 / 1) = 192MHz
35
  f(PLL_Q)     = f(VCO clock) / PLLQ = 192MHz / 4 = 48Mhz
36
37
AHB2 peripheral clock enable register
38
=====================================
39
(gdb) x/x 0x4002104c
40
0x4002104c:  0x00001001
41
42
0x00001001 boils down to:
43
GPIOAEN: 1: IO port A clock enabled
44
OTGFSEN: 1: USB OTG full speed clock enabled
45
46
Peripherals independent clock configuration register
47
====================================================
48
(gdb) x/x 0x40021088
49
0x40021088:  0x08000000
50
51
CLK48SEL: 10: PLL “Q” clock (PLL48M1CLK) selected as 48 MHz clock

Sieht das eurer Meinung nach "vernünftig" aus?

mfg Torsten

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.