Forum: Mikrocontroller und Digitale Elektronik STM32 und USB-Bulk Transfer


von Mehmet K. (mkmk)


Lesenswert?

Servus allerseits

Ich bin gerade dabei, das USB-Bulk Transfer Beispiel von ST auf meine 
Bedürfnisse anzupassen.
Unter anderem möchte ich auch SDHC Karten benützen können, und auch die 
Transferrate sollte etwas höher sein (z.Zt. ca. 300kB/s).

Das Bespiel von ST lief mehr oder weniger auf Anhieb. Aber es hat 
irgendwo eine Macke. Sobald man 200 Dateien auf einmal kopieren will, 
gibt der Host (WinXP) einen Fehler aus: Cannot write 
E:\Data\Cpu\....\20111104 0066.jpg Please remove write protection!

Die Anzahl der Dateien, die kopiert werden, ist ganz verschieden: 
manchmal kommt es zu dieser Fehlermeldung nach so 15 Dateien, manchmal 
erst nach 60.

Wenn ich den STM32 resette, kann ich mit dem Kopieren weiterfahren, bis 
es nach x Dateien wieder zu der oben erwaehnten Fehlermeldung kommt.
Im Ordner befinden sich ca. 200 Dateien zu je 21kB.
Eine einzige 4MB grosse Datei wird problemos kopiert.
Die SD-Karte ist eine 1GB microSD und funktioniert mit einem 
Kartenlesegeraet ohne Probleme.

Ehrlich gesagt habe ich nicht den leisesten Schimmer, wo ich den 
Breakpoint setzen umd mit dem Kopfekratzen anfangen soll. Hat mir 
jeamand einen Tip?

von Mehmet K. (mkmk)


Lesenswert?

Ja may i wiad no deppert!
Jetzt geht's auf einmal.

von Mehmet K. (mkmk)


Lesenswert?

Irgendwie komme ich nicht mehr weiter.

Der status quo:
Mit einem Testboard und einer alles andere als schönen Verdrahtung hatte 
ich die SDHC-Karte an SPI-2 angeschlossen.
Funktioniert einwandfrei. Bei grossen Dateien erreiche ich 450kB/s und 
bei einigen 100 kleinen Dateien so um die 290kB/s Lesegeschwindigkeit.
Ich kann schreiben, lesen, löschen ... kein einziger Aussetzer.

Ich habe also eine Karte entworfen, die nach ein paar Wochen dann auch 
eingetroffen ist. Der einzige Unterschied: die Karte ist an SPI-1 
angeschlossen.

Seitdem raufe ich mir die Haare.
Lesen geht wie gewohnt. Aber schreiben und löschen kann ich nur 
manchmal: manchmal (sprich: meist) überhaupt nicht, manchmal 1 bis 4 
Dateien. Dabei ist es wurscht, ob ich mit DMA oder mit Polling arbeite.
Auf jeden Fall haengt sich das Geraet dermassen bös' auf, dass selbst 
die Led vom J-Link rot zu flackern beginnt. Selbst wenn der JTAG nicht 
aktif, sondern nur am Geraet angeschlossen ist, beginnt es bei einem 
Haenger rot zu blinken. Keine Ahnung was das besagt. Ist mir aber sonst 
noch nie passiert.

Ich bin mir im klaren, dass SPI1 an den APB2, und der SPI2 an APB1 
angeschlossen ist. Die Taktfrequenz wird also richtig eingestellt 
(18MHz, wobei die SD-Karte 25 MHz vertraegt).
Ein runtersetzen der SPI Clock Frequenz bringt keine Aenderung mit sich.

Wie gesagt, dieselbe Software funktioniert auf SPI2 einwandfrei.

Irgendwelche Ideen? Ich meine, nebst der Idee, die Karte neu zu 
entwickeln und die Karte wieder auf SPI2 zu legen :)

von fränk (Gast)


Lesenswert?

Hatte mal ähnliche Probleme. Grund war dann, dass die SPI Signale zu 
sehr verschliffen waren. Schau die mal mit dem Scope an.

von Roland H. (batchman)


Lesenswert?

Mehmet Kendi schrieb:
> Irgendwelche Ideen? Ich meine, nebst der Idee, die Karte neu zu
> entwickeln und die Karte wieder auf SPI2 zu legen :)

Welcher stm32? Welches (Eval)-Board?

Bilder vom Testaufbau, von der fertigen Platine? Schaubild? Source?

Mehmet Kendi schrieb:
> Auf jeden Fall haengt sich das Geraet dermassen bös' auf, dass selbst
> die Led vom J-Link rot zu flackern beginnt. Selbst wenn der JTAG nicht
> aktif, sondern nur am Geraet angeschlossen ist, beginnt es bei einem
> Haenger rot zu blinken. Keine Ahnung was das besagt. Ist mir aber sonst
> noch nie passiert.

Ich kenne das nur vom AVR MK2 ISP. Der blinkt "orange", wenn er diverse 
größere Probleme melden will. Ich kann nur raten: Versorgungsspannung 
bricht ein? Braucht er mehr Saft beim Schreiben?! Hast Du mal geprüft, 
ob es von den "maximum ratings" Unterschiede zwischen den Pins für SPI1 
und SPI2 gibt?

Wie wird das Board mit Spannung versorg? Extern? Via USB?

Mehmet Kendi schrieb:
> Ehrlich gesagt habe ich nicht den leisesten Schimmer, wo ich den
> Breakpoint setzen umd mit dem Kopfekratzen anfangen soll. Hat mir
> jeamand einen Tip?

Breakpoint in den Fault-Handlern. Dann kannst Du auch die Adresse mit 
der Fehlerstelle zurückrechnen. Auf alle Fälle dort z. B. mittels LEDs 
den Fault anzeigen. Und den Transfer von/zur SD-Karte stoppen.

Mehmet Kendi schrieb:
> Ich habe also eine Karte entworfen, die nach ein paar Wochen dann auch
> eingetroffen ist. Der einzige Unterschied: die Karte ist an SPI-1
> angeschlossen.

Ob das so eine gute Idee war, zwischen Test und Produktion diesen 
Unterschied einzubauen? Selbst wenn beide SPIs am selben APB hängen 
würden, es ist ein Unterschied.

von Eddy C. (chrisi)


Lesenswert?

Ich kenne nicht die Ursache Deines Problems, dennoch:

1) Grundsätzlich gilt: Fertigen Code benutzen bedeutet die Höchststrafe, 
wenn er nicht funktioniert. Soll heissen, oftmals ist man schneller am 
Ziel, wenn man seine Firmware selber entwickelt.

2) Deine Äußerungen klingen leicht konfus. Mir scheint, Du weisst 
momentan nicht, ob der USB-Teil oder SD-Teil versagt. Das herauszufinden 
ist schon einmal die erste Aufgabe. D.h. Du musst die beiden Code-Teile 
getrennt voneinander testen, testen, testen...

3) Da der Fehler selten auftritt, scheint es sich um eine Race-Condition 
(Synchronisationsproblem verschiedener Codeteile in einem Multitasking- 
bzw. Interrruptsystem) zu handeln. Hier würde ich meinen Hauptaugenmerk 
darauf richten.

4) Sicherstellen, dass der Stack nicht überläuft!

5)
>Jetzt geht's auf einmal.
Hast Du jemals herausgefunden, wieso? Nichts ist schlimmer, wie Code, 
von dem man nicht weiss, warum er funktioniert.

von Mehmet K. (mkmk)


Lesenswert?

Danke für all die Tips und Hinterfragungen.

Roland H. schrieb:
> Ich kann nur raten: Versorgungsspannung bricht ein?

Gedacht ist es dafür, dass es mit einer Lithium Batterie laeuft. Z.Zt. 
ist es aber nur - wie das Testboard übrigens auch - an USB 
angeschlossen.

Ich mach' mir jetzt zuerst mal 'nen starken Kaffee. Dann will ich die 
einzellnen Punkte durchgehen.

von Mehmet K. (mkmk)


Lesenswert?

Roland H. schrieb:
> Ich kann nur raten: Versorgungsspannung bricht ein?

Gut geraten!! Sie brach auf stolze 2V ein.
Tut mir echt leid, dass ich Eure Zeit für so was in Anspruch genommen 
habe. Mich hat diese Blindheit so etwa 3 Tage gekostet.

Der Grund, warum das Testboard, auch nur über USB versorgt, funktioniert 
hat: dort war kein MAX1555, sondern die 5V gingen direkt zum 3.3V 
Spannungsregler.
Beim MAX15555 meinte ich, der könne so um die 250mA liefern. Kann er, 
aber nur wenn er über einen DC-Adapter versorgt wird. Wenn die 
Versorgung über USB erfolgt, dann sind es nur 100mA.
Und beim Schreibvorgang zieht die SD-Karte so um die 150mA.

Nochmals: Entschuldigung!

von Eddy C. (chrisi)


Lesenswert?

Respekt an Roland. Hätte ich nicht mit gerechnet.

von Roland H. (batchman)


Lesenswert?

Eddy Current schrieb:
> Respekt an Roland. Hätte ich nicht mit gerechnet.

Danke für die Blumen!

Mehmet Kendi schrieb:
> Der Grund, warum das Testboard, auch nur über USB versorgt, funktioniert
> hat: dort war kein MAX1555, sondern die 5V gingen direkt zum 3.3V
> Spannungsregler.

Noch ein Unterschied zwischen Test und Produktion ?! :-)

Mehmet Kendi schrieb:
> Nochmals: Entschuldigung!

Jaja, nun ist ja gut :-)

Könntest Du evtl. Deinen Source / Schaltbild einstellen?

von Mehmet K. (mkmk)


Angehängte Dateien:

Lesenswert?

Roland H. schrieb:
> Könntest Du evtl. Deinen Source / Schaltbild einstellen?

Nichts Weltbewegendes. Der Source ist z.Zt. ein Mix aus IAR und ST 
Beispielen, die ich zum Teil nach C++ übersetzt habe.
Das einzige, was ich hinzugefügt habe, war das Erkennen einer SDHC 
Karte, die in beiden Faellen nicht funktioniert hat.
Ich werde versuchen den Code soweit aufzuraeumen, dass man in hier 
einstellen kann ohne rot zu werden :)

Auch die Schaltung selbst ist nichts Weltbewegendes. Siehe Beilage.

von Mehmet K. (mkmk)


Angehängte Dateien:

Lesenswert?

Und das Schmuckstück selbst

von tom (Gast)


Lesenswert?

Mehmet Kendi schrieb:
> Siehe Beilage.

Mahlzeit! Du meinst wohl Anhang oder Anlage :-)

von Mehmet K. (mkmk)


Lesenswert?

tom schrieb:
> Mehmet Kendi schrieb:
>> Siehe Beilage.
>
> Mahlzeit! Du meinst wohl Anhang oder Anlage :-)

Immer so peinlich, wenn man als Türkei mit einem Deutschen über die 
richtige Anwendung der deutschen Sprache diskutieren muss. :)

http://www.duden.de/rechtschreibung/Beilage

von Mehmet K. (mkmk)


Angehängte Dateien:

Lesenswert?

Okay, wie versprochen beiliegend der Kod.

Folgendes muss angepasst werden:

global_def.h:  SPI1 oder SPI2
init.cpp:      InitUsbConnect()
usb_hw.c       USB_ConnectRes()

Windows erkennt eine SD Karte sofort.
Eine SDHC Karte wird aber erst nach ca. 8 Sekunden erkannt.

Schreiben (SDHC):
  1 Datei  4MB:     160kB/s
750 Datein je 20kB:  70kB/s

Lesen (SDHC):
  1 Datei  4MB      440kB/s
750 Datein je 20kB: 310kB/s

von Mehmet K. (mkmk)


Angehängte Dateien:

Lesenswert?

Habe das Ganze mal Lint vorgelegt.
Schon interessant, was der so findet.
Falls jemand den Kod ernsthaft benutzten will, dann bitte diese Beilage 
verwenden. Waren 2 sehr unschöne Fehler drin.

Dann habe ich ein paar Sourcen von ST und IAR von Lint analysieren 
lassen. Mag Zufall gewesen sein, aber die Dateien, die ich gewaehlt 
hatte, hatten hunderte von Errors und Warnungen.

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.