STM32F103-USB-CDC von W.S.

Gast #5080000
Lesenswert?

Hallo W.S.

du hattest hier mal USB-CDC Code für einen STM32F103 gepostet. Das habe 
ich mal probiert mit diesm Board:
http://www.ebay.de/itm/STM32-STM32f103C8T6-ST-ARM-32-bit-Cortex-M3-64kB-312-/221961031950?hash=item33ade8910e:g:ugMAAOSwcBhWZA1K
1.5k an D+ mache ich von Hand.

Leider endet das unter Windows in einem unbekannten USB-Gerät (Fehler 
beim festlegen der Adresse).Ich hab mal an in die Funktion OnSetup 
folgenden Debug-Code eingebaut:
1
void OnSetup (word EpCtrlStatus)
2
{ 
3
  ReadControlBlock(&CMD.SetupPacket.bmRequestType, 8);
4
  debug_printf("OnSetup 0x%x 0x%x\n", (int)CMD.SetupPacket.bRequest, (int)CMD.SetupPacket.wValue);
5
  
6
  if (IsStandardRequest())         /* wenn Type = Standard */

als Ausgabe erhalte ich:

OnSetup 0x6 0x100
OnSetup 0x5 0x16
OnSetup 0x6 0x100
OnSetup 0x5 0x17
OnSetup 0x6 0x100
OnSetup 0x5 0x18
OnSetup 0x6 0x100
OnSetup 0x5 0x19

Damit hat er meines Erachtens nach schon den Device Descriptor 
erfolgreich angefordert (0x6 0x100). Danach soll SetAdress (0x5) 
ausgeführt werden, was fehl schlägt. Das ganze wiederholt sich dann 4 
mal. Hast du eine Ahnung wie ich jetzt am besten weiter mache bei der 
Fehlereingrenzung? An der Hardware kanns ja eigentlich nicht mehr 
liegen, sonst würde er ja schon beim Device-Deskriptor meckern.
#5080066
Lesenswert?

Ich persönlich fand die Fehlerausgabe unter Linux via dmesg recht 
hilfreich. Das könnte man z.B. mal schnell vom USB Stick booten.

Vorsicht: Debug Ausgaben im Interrupt können Dir das Timing 
zwerschießen. Müsste bei USB eigentlich unkritisch sein, aber YMMV.
Gast #5080098
Lesenswert?

Ich bin einen Schritt weiter. Zwischen dem Code von W.S. und den 
aktuellen Compilern (verwende Crossworks) liegt schon etwas Zeit. Hier 
hat der aktuellere Compiler das Nop() wohl soweit gekillt oder 
reduziert, dass das der Fehler war. Hab das jetzt mal so geändert:
1
void Nop (dword count)
2
{ 
3
  count<<=2;
4
  // Delay loop for Cortex M3 thumb2
5
  asm volatile 
6
    (
7
    // Load loop count to register
8
    " mov r3, %[loops]\n"
9
    " .balign 8\n"
10
    "loop: subs r3, #1\n"
11
    " bne loop\n\n"
12

13
    : [loops] "r" (count) // Input registers
14
    : "r3" // clobbered registers
15
    );
16

17
  // while (count) --count; 
18
}

Was ich noch vergessen habe: Danke W.S. für den Code, der doch 
wesentlich übersichtlicher ist als das was sonst so fuer den STM32F103 
im Umlauf ist.
Gast #5080119
Lesenswert?

Ich werde trotzdem bei der Assembler Variante bleiben, da mir das 
gefühlt stabiler ist. Nichts ist schlimmer, als wenn etwas nur mit einem 
Compiler geht und mit dem anderen nicht nur weil die Optimierung anders 
gehandhabt wird.
Gast #5080185
Lesenswert?

Felix F. schrieb:
> Von ST selbst gibt es die USB-FS-Device Lib. Ist Compilerunabhängig und
> läuft bei mir bis jetzt auch einwandfrei.

Hab ich auch in mehreren Projekten so gemacht. Allerdings nervt mich 
daran die STM32-Lib die ich sonst zu nichts verwende. Mit dem Code von 
W.S. bin ich diesen Kram auch noch los und alles zusammen steckt in 
einer einzigen Datei.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren