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;