Probleme beim lesen und schreiben auf SD Karte

Gast #484331
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
Angehängte Dateien:
Gast #484385
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
Gast #484388
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;
Gast #484394
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.
Gast #484718
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!
Gast #484913
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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren