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
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
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;
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.
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.
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.