FATFS Datenlogging SD Card

OP #5341459
Lesenswert?
• ▲
▼
Guten Abend,

ich brauche mal wieder Eure Hilfe. Ich möchte mit dem XMC4500 von 
Infineon Daten zyklisch auf eine SD Card in einer txt-Datei ablegen.
Das Dattenlogging soll nur aktiv sein, wenn ein Taster betätigt wurde, 
bei erneuter Betätigung soll das Datenlogging beendet werden. Das Ganze 
funktioniert auch schonmal ganz gut. Beende ich das Datenlogging und 
nehme die Karte raus und schiebe sie anschließend wieder in den 
Kartenslot. Starte ich das Datenlogging nun (Betätigung des Tasters) 
wieder gibt er einen Fehler (FR_DISK_ERR) bei dem Befehl f_open aus. 
(Während des gesamten Vorgangs ist der µC aktiv und arbeitet das 
Programm ab). Vielleicht hat jemand aus dem Forum eine Ahnung woran es 
liegt. Für Hilfe wäre ich sehr Dankbar. Der Quellcode:



#include <DAVE.h>
#include <stdio.h>
FATFS fso; /* File system object (volume work area) */
FIL fil; /* File object */
int flag=0;
int var=1;

int main(void)
{
  DAVE_STATUS_t status;
  status = DAVE_Init();
  /* API result code */
  FRESULT res;
  FRESULT resopen;
  FRESULT resclose;
  UINT bw; /* Bytes written */
  char buffer [150];
  float 
werte[10]={1.111,2.222,3.333,4.444,5.555,6.666,7.777,8.888,9.999,10.101} 
;
  uint32_t pin_status;
  TIMER_STATUS_t timer_status;

  while(1U)
  {
    if(var == 0)
      {
        /* Register work area */
        res = f_mount(&fso, "", 0);
        if (res == FR_OK)
        {
            /* Create a file as new */
            resopen = f_open(&fil, "werte.txt", FA_OPEN_ALWAYS | 
FA_WRITE);
            if ((resopen == FR_OK) || (resopen == FR_EXIST))
            {
              /*Starten des Timers*/
              timer_status = TIMER_Start(&TIMER_0);
              while(var==0)
              {
                if(flag==1){
                  sprintf(buffer, "%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;\r\n", 
werte[0],werte[1],werte[2],werte[3],werte[4],werte[5],werte[6],werte[7], 
werte[8],werte[9]);
                  res = f_write(&fil, buffer, strlen(buffer), &bw);
                  //f_sync(&fil);
                  flag=0;
                }
              }
              timer_status = TIMER_Stop(&TIMER_0);
              resclose=f_close(&fil);
              res = f_mount(NULL, "", 0);


            }//if .txt angelegt
        }//
      }//  Ende if var==0
      else
      {
      }

  }//Ende while
}//Ende main



void TimerIRQHandler(void)//Zyklisches Aufruf durch Timer
{
  flag=1;
}

void UserIRQHandler1(void)//Aufruf bei Taster-Betätigung
{
  var ^= 1;//toggeln
  if(var==0){
    DIGITAL_IO_SetOutputHigh(&DIGITAL_IO_1);
  }
  else{
    DIGITAL_IO_SetOutputLow(&DIGITAL_IO_1);
  }
}

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.