Forum: Mikrocontroller und Digitale Elektronik MMC Write Sector liefert "illegal command" beim 1. Versuch


von Steff (Gast)


Lesenswert?

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

von Steff (Gast)


Lesenswert?

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

von papa_of_t (Gast)


Lesenswert?

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.. :-)

von Steff (Gast)


Lesenswert?

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...

von papa_of_t (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.