Forum: Mikrocontroller und Digitale Elektronik Probleme beim lesen und schreiben auf SD Karte


von Matze (Gast)


Angehängte Dateien:

Lesenswert?

Hallo.

Ich hab mich mal an einer SD KArte versucht. Iitialisierung 
funktioniert.
Und lesen und schreiben auch, wenn ich nach meinen zurückgegebenen 
werten gehe. aber wenn ich den gelesenen block anzeigen lasse bekomme 
ich nur müll....

kann mir nicht erklären wieso. könnte da mal bitte einer drüber gucken 
ob ich bestimmte timings nicht einhalte oder andere fehler mache???

benutzte einen mega128,
MISO,MOSSI,SCk an PORTB
CS an PORT PORTG

von Ulrich (Gast)


Lesenswert?

Hast du eingetlich auch eine sdcard.c?

von Matze (Gast)


Angehängte Dateien:

Lesenswert?

ja gibt es...

von Snake (Gast)


Lesenswert?

hast du nicht im card_init eine (mögliche) endlosschleife?
oder zumindest irgend etwas falsch.
du hast:
for(in=0;i<255 && respons!=SD_OK;i++)
du iniziierst also 'in', prüft dann aber 'i' und incrementierst auch 
'i'.
doch in diesem for überschreibst du 'i' dauernd:
for(i=0;i<sizeof(cmd);i++)
also wenn nie ein SD_OK kommt, bleibt dein chip da hängen.

löst vermutlich nicht das eigendliche problem, ist mir nur aufgefallen

von Kai (Gast)


Lesenswert?

Eine Sache ist mir bisher aufgefallen.
Wenn du auf eine Antwort der Karte wartest, dann nutzt du die globale 
Variable "respons". Bevor du in eine Schleife gehst, für die respons ein 
Abbruchkriterium darstellt, solltest du die Variable auf einen Wert 
setzen, mit dem du trotzdem in die Schleife gehen kannst.

Beispiel:
Du durchläufst die Schleife in card_init solange wie respons!=SD_OK ist.
Wenig später gehst du in die Funktion card_write_block, wo du wieder 
eine Schleife hast, die du solange durchläufst wie respons!=SD_OK ist.
Da response aber von card_init noch SD_OK ist, wir die Schleife nie 
ausgeführt, sondern komplett übersprungen. Obwohl die Karte aber noch 
garnicht fertig ist schickst du ihr dann gleich die Daten. Somit muß da 
etwas schief gehen.

Lösung:
Vor jede Schleife, die so lange läuft wie respons!=SD_OK, solltest du 
respons=0xFF; (oder ein andere Werte != SD_OK) setzen. Damit wird 
sichergeselt, dass die Schleife mindestens einmal durchlaufen wird!
Alternativ kannst du auch den Teil response!=SD_OK auf dem Schleifenkopf 
heraus nehmen und dafür nach
respons=SPDR;
folgendes einsetzen:
if (respons==SD_OK) break;

von Matze (Gast)


Lesenswert?

hab das mal eingefügt und bekomme jetzt bei der read_block() funktion 
ein cmd_error.
also muss der fehler im lesebefehl stecken....
aber wo???

nur als anmerkung für die c datei...

die funktionen dezi2ascii_byte, befehl_senden() und zeichen_senden() 
sind nur für die displayanzeige.

von Matze (Gast)


Angehängte Dateien:

Lesenswert?

hab nochmal die c. und die headerdatei geändert.

von Matze (Gast)


Angehängte Dateien:

Lesenswert?

c datei

von Martin Thomas (Gast)


Lesenswert?

Hilft nicht beim konkreten Problem: Chan's FAT-Library und die 
dazugehörigen Beispiele enthalten sehr brauchbare und kompakte 
MMC/SD-Karten-Routinen für AVR: 
http://elm-chan.org/fsw/ff/00index_e.html selbst wann man seinen Code 
nicht nutzen will, kann man viel daraus lernen.

von Kai (Gast)


Lesenswert?

Ich habe noch einen Fehler gefunden. Da du aber geschrieben hast, dass 
du einen cmd_error bekommst, dann hängt es wohl nicht daran:

In card_read_block steht folgende Zeile:

while((SPDR!=START_TOKEN)&&(i_16<<50000));

Diese müsste aber wie folgt lauten:

while((SPDR!=START_TOKEN)&&(i_16<50000));

Die zwei '<' ergeben einen Left-Shift und keinen Vergleich.

Ich schaue mal noch weiter!

von Matze (Gast)


Angehängte Dateien:

Lesenswert?

die datei funktioniert jetzt.....

hab die arrayübergabe durch pointerübergabe ersetzt und das lesen und 
schreiben einfach langsamer laufen lassen. und jetzt funktioniert es....

vielen dank an alle die sich die mühe gemacht haben mal über den code zu 
gucken..

mfg
matze

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.