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
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.
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.
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
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).
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.