SD-Karte speichert nach Lust und Laune

Gast #708507
Lesenswert?

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
Gast #708529
Lesenswert?

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.
Gast #708718
Lesenswert?

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.
Gast #709085
Lesenswert?

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?
Gast #709786
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren