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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.