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?
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 :)
Hatte mal ähnliche Probleme. Grund war dann, dass die SPI Signale zu sehr verschliffen waren. Schau die mal mit dem Scope an.
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.
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.
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.
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!
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?
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.