mikrocontroller.net

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


Autor: Matze (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du eingetlich auch eine sdcard.c?

Autor: Matze (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
ja gibt es...

Autor: Snake (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kai (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Matze (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matze (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hab nochmal die c. und die headerdatei geändert.

Autor: Matze (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
c datei

Autor: Martin Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kai (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Matze (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.