Hallo, habe ein Problem Daten auf eine SD Karte zu schreiben. Ich verwende einen C167 µC und eine 1GB Sandisk SD-Karte, die über SPI (SSC) angebunden ist. Zur Ansteuerung nehme ich den MMC Code von Ulrich Radig mit angepassten Befehlen für den C167. Initialisierung der Karte sowie CID/CSD Register auslesen funktioniert. Auch kann ich Dateien von der Karte lesen (FAT32). Nur das Schreiben klappt noch nicht so ganz: Ich suche mir einen freien Eintrag in der FAT und belege ihn --> OK ich schreibe den entsprechenden Directoy Eintrag --> 0x04 (illegal command) als Antwort ich schicke den selben Write_Sector Befehl nochmal --> OK usw... Gleiches Szenario wenn ich erst auf die 1. FAT (OK), dann auf die 2. FAT (0x04), und danach den DirEntry schreibe (OK) [der nächste Schreibbefehl liefert wieder 0x04]. 2 Write_Sector Aufrufe hintereinander funktionieren nicht... Ich weiß nur noch nicht so recht wieso. Habe schon Wartezeiten eingefügt falls die Karte noch Busy ist. Oder muss noch ein Status abgerufen/gelöscht werden falls der nächste Sektor geschrieben werden kann? Ich hoffe dass dieses Phänomen nicht controllerbedingt ist und mir jemand weiterhelfen kann. (Hier wurde so etwas ähnlcihes gefragt, allerdings ohne Antwort http://www.mikrocontroller.net/forum/read-1-224104.html) Gruß Steff
Hmmm... habe gerade eine andere SD-Karte getestet. Diese liefert (reproduzierbar) ein ähnliches, aber dennoch leicht anderes Verhalten: Selbe Reihenfolge wie oben: Schreiben auf FAT1 --> OK Schreiben auf FAT2 --> OK Schreiben des DirEntry --> Fehler 0x04 nochmal gleicher Befehl (DirEntry) --> OK und zur "Abwechslung" liefert der darauffolgende Schreibversuch 0x03 (erase reset & idle!?) zurück. Ich hab absolut keine Ahnung wo ich nach dem Fehler suchen soll und bin über jeden Tipp dankbar! Gruß Steff
Hallo Steff, ich hab damals "um Hilfe" gerufen, die Karte in dem Fall ging absolut nicht, ließ sich aber auch nicht mehr mit einem Cardreader (mit dem PC) beschreiben. Wahrscheinlich habe ich irgendwie mal den (Software-) Schreibschutz der Karte aktiviert, lesen ging tadellos, schreiben nicht mehr. Evtl. programmierst Du den Chip während die Karte an den gleichen SPI-Beinen mithört? ich hab die Karte beim Chip programmieren 'rausgenommen. Außerdem habe ich damals meine Verkabelung zur Karte neu gezogen (war ein ziemliches Wirrwar mit der Zeit) - danach war alles ok. Nach Schreiben eines Sektors (single Block write) mußt Du 2x FF als dummy-Prüfsumme schreiben und dann solange Clocks generieren (00 Senden z.B.), bis Du ein FF zurückbekommst. einfach warten reicht evtl. nicht. Wohin Du dabei schreibst vielleicht sogar egal, es kann ja sein, daß Die Karte zwischen den Schreibvorgängen eine clocks mehr braucht..? Probier doch einfach mal 3-4x den gleichen Block zu schreiben. Außerdem: wenn man den Block vorher löscht, kann man wesentlich schneller schreiben. Ich hoffe das waren ein paar nützliche Ideen.. :-)
Am Programmieren kann es nicht liegen, und die Karte funktioniert auch noch einwandfrei. Das mit dem Dummy-CRC und den Clocks ist in der Lib von Ulrich Radig alles schon berücksichtigt (und funktioniert bei vielen anderen ja auch). Das Sektor beschreiben hapert schon am Kommando das ich schicke. Nach dem Senden des Write Commands (z.B. 58 00 1F 50 00 FF) wird solange gepollt bis die Antwort ungleich FF ist. Das sieht bei mir dann so aus: >Read_Byte: FF >Read_Byte: FF >Read_Byte: FF >Read_Byte: 04 Daraufhin sende ich das gleiche Command nochmal (also will den gleichen Sektor nochmal bzw. erstmalig, denn er wurde ja noch nicht beschrieben da abgebrochen wurde, beschreiben); die Antwort hier ist dann: >Read_Byte: FF >Read_Byte: FF >Read_Byte: 00 (danach werden noch ein paar Clocks, Startbyte (FE) und der Datenblock gesendet - die Daten sind dann auch alle richtig auf der Karte) Auffällig ist dass wenn das Kommando akzeptiert wird einmal FF weniger kommt (und das ist bei der gleichen SD-Karte immer so). Achja, was evtl. noch anzumerken ist dass ich mit 400kHz arbeite, ich setze den Takt nach der Initialisierung nicht hoch...
Vielleicht gibt es Parallelen zu diesem Verhalten: http://www.mikrocontroller.net/forum/read-1-294807.html#new Damals funktionierte die Karte nur einige Sekunden ordentlich, danach nicht mehr.. Bau Dir doch eine kleine Testschaltung nur mit Karte und Controller (siehe Foto im Thread), das geht ja schnell... Bei mir hat es geholfen, obwohl ich nicht 'rausgekriegt habe warum.. :-)
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.