Hallo alle zusammen, Ich bin gerade dabei mir ein GPS-Logger zu basteln. Ist eigentlich alles soweit fertig, blos hab ich jetzt ein Problem... Also ich schalt ganz normal ein, Gerät wartet bis ich empfang hab, und schon gehts auch los mit einlesen und speichern. (hab atmega8 mit 16Mhz) Am anfang initialisiere ich die Karte, les 6 Sätze (NMEA) ein und schreib die dann auf die Karte. Wenn ich dann ausschalte oder einfach die Karte ziehe, kann es sein dass ncihts gespeichert wurde. Ab und zu klappts, aber nich so oft... Kann es vielleicht daran liegen, dass ich einfach Saft wegnimm während er speichern will und er dann halt alles auf 00 macht? Wie könnt ich da was dagegen tun? mfg Benny
Wenn ich mich recht entsinne speichert die SD-Karte einen Block von 512 Bytes im internen Puffer und schreibt den erst auf die Karte wenn er voll ist. Wenn du also vorher den Saft wegnimmst, sind die Daten futsch.
Das is klar, aber wenn ich auch schon 15Blöcke geschrieben hab... dann ist nicht nur der aktuelle block futsch, sondern alles andere ist auch weg
Im Umkehrschluss ist also immer alles ok, wenn du ordnungsgemäß das Schreiben beendest ?
Ok das muss ich noch schnell testen. Weil ich seh ja nicht wenn er schreibt, aber ich schick jetzt mal an USART wenn er schreibt und wenn er schreiben beendet hat. wenn er fertig ist zieh ich stecker und gugg was los ist.
So habs getestet. Also es ist egal ob er grad schreibt oder nicht. Kann mir das wirklich nicht erklären.
Das liegt vermutlich daran, dass deine FAT-Implementierung erst den FAT-Eintrag auf die erstellte Datei erstellt, wenn du die Datei schließt. Oder so ähnlich.
Nur benutz ich kein FATsystem^^ Ich schreib einfach direkt ab den ersetn sektor und schaus dann per Hexeditor an
Mal ganz neugierig gefragt: Unter welchen Umständen wird denn überhaupt was auf die Karte geschrieben?
Also ich lass n Satz einlesen und schreib den in data[512]. dann kommt der nächste usw.... bis 6 erreicht sind. (6 weil die Sätze max. 82 zeichen lang sind und bei 512byte 6 am besten is). dann schreibt er data[512] auf die karte und beginnt dann wieder von vorne. Wolltest du das wissen?
Habe eine Idee, weiss nicht, ob es wirklich so ist. (Ich schreibe auch SD-Karte, und bei mir geht es.) Dein Beispiel war: 6-mal 82 byte = 492 byte. Es sind noch überhaupt nicht 512 byte! Also, meine Meinung nach, man muss die Sektoren "komplettieren", ähnlich, wie hier: Beispiel von MrMidi2 (siehe Suchfunktion!); Copyright: (c) Simon Lehmayr und K. John '2B|!2B' Crispin void mmc_complete_write(void) { while (bufpos < 512) { MMC_get_sec_next(); bufpos++; } MMC_get_sec_stop_w(); } wo: // stop write process of a sector static void MMC_get_sec_stop_w(void){ if (mmc_open) { // get the 2 CRC bytes spi_io(0xff); spi_io(0xff); // wait while card is busy while (spi_io(0xff) != 0xff); // give enough time MMC_cleanup(); mmc_open = 0; } }; // stops the MMC transmission and sends the clock cycles needed by the mmc for cleanup static void MMC_cleanup(void){ // deselect the MMC card MMC_CS_deselect(); // pulse the SCK 16 times spi_io(0xff); spi_io(0xff); }; und so weiter, siehe MrMidi2! Bei mir geht es tadellos, wenn ich sogar die Karte beim Schreiben wegziehe, bleibt nur (natürlich) das letzte Block "falsch". Karoly
also ich hab die restlichen bytes mit 00 auffüllen lassen. aber werde dass hier noch teste. Vielen Dank erstmal noch für eure Antworten !!! mfg Benny
Es geht nicht nur zum Auffüllen, sondern (siehe die Funktionen!), den Datentransfer zur SD-Karte "ordentlich" schliessen! Wünsche viel Erfolg damit! Karoly
Ah ok ich hab die 16 clocks am ende nicht. mal guggen obs daran liegt.
Ok Also ich habs jetzt ungefähr 5 mal testen können (doofer empfang mit gps^^) und es hat immer funktioniert. Also ich geh davon aus, dass es das war. Danke für eure Hilfe! Gruß Benny
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.