FatFS f_mount Kart takılımı değil mi sorgulama?

Başlatan Mucit23, 11 Nisan 2023, 14:30:26

Mucit23

Selamlar

FatFS'de SD kart takılı mı değil mi sorgulamak istiyorum. Bunu bir task içerisinde 100ms aralıklarla yapmam lazım.

Normalde sorgulamak için aşağıdaki kodu kullanıyorum

Result=f_mount(&FatFs,"",1);

Eğer MCU init rutininden sonra sorgulama gerçekleştirdiğimde Eğer kart takılı değil ise FR_NOT_READY çıktısını alıyorum.
Kart Takılı ise FR_OK cevabı geliyor.

Daha sonra main rutini içerisinde 100ms aralıklarla sorgulama yaptığımda herhangi bir anda kartı çıkardığımda Bu sefer FR_DISK_ERR çıktısını alıyorum. Aynı şekilde Kartı tekrar taktığımda bu sefer FR_NO_FILESYSTEM hatasını alıyorum.  Daha kartı çıkarıp takmam birşey değiştirmiyor. sürekli FR_NO_FILESYSTEM hatasını alıyorum.

Kartın bağlı olup olmadığını sürekli kontrol ederken bu yapı düzgün çalışmıyor. Bunun doğrusu nasıl olmalı?


kimlenbu

Card detect pinini kullanırsan kafan rahat eder, en temizi bu. Ayrıca kart çıkarıldıysa hangi arayüzle kullanıyorsan (sdmmc, sdio, spi) onu da de-init/init etmen gerekiyor.

Mucit23

Hocam kart detect kullansam bile çözüm nasıl olacak anlamadım. Herhangi bir anda kart çıkarılabilir. Kart çıkarıldığı zaman fiziksel olarak cart detect ile bunu algılayıp SD kart ile ilgili işlem yapmasını engelleyebilirim gerçi ama istediğim çözüm değil. Şuan bunu yapmam zor.

Alıntı yapılan: kimlenbu - 11 Nisan 2023, 15:32:55Ayrıca kart çıkarıldıysa hangi arayüzle kullanıyorsan (sdmmc, sdio, spi) onu da de-init/init etmen gerekiyor.

SPI kullanıyorum ama SPI neden deinit edilmesi gerektiğini anlayamadım. Zaten Fat işlemleri yapılmıyorken SPI ile ilgili bir işlemde yapılmıyor. Yani Fat rutini çalışmıyorsa SPI haberleşmesi zaten yok. Kulandığım kütüphanede SPI init edildikten sonra doğrudan f_mount vs gibi komutlarla SD kart haberleşmesi yapılıyor. Arka planda SD init rutini muhtemelen tek seferlik çalışıyor. SD kart takıldığında Bunu tekrar yapmam lazım sanırım.

argelojik

Hocam merhaba. Ben bir çok sorundan dolayı SD karttan vazgeçip USB belleğe veri yazmaya başladım. USB ile hiç sorun olmuyor. Tavsiye ederim. Kullandığım kütüphane ve kodları aşağıda yazıyorum. Belki işinize yarar. Ben bu şekilde sorun yaşamadım. Usb bellek kontrolünü main-while içinde sürekli kontrol ediyor. USB çıkarılınca ekrana uyarı veriyor. Takılınca yine uyarıyor. Böyle sorun olmadı. Kolay gelsin.
#include "main.h"
#include "fatfs.h"
#include "usb_host.h"
//
//

while (1)
  {    
    MX_USB_HOST_Process();

    switch(Appli_state)
        {
        case APPLICATION_IDLE:
         	break;
        case APPLICATION_START:
        	if((f_mount(&USBHFatFS,(const TCHAR*)USBHPath,0)) == FR_OK)
        	{
                 // Ekrana USB BELLEK takıldı bilgisi gönder
        	}
        	break;
        case APPLICATION_READY:
          	if(!USB_Durum)
            {
                HAL_Delay(300);
                // Ekrana USB BELLEK hazır bilgisi gönder
                USB_Durum=TRUE;
            }
        	break;
        case APPLICATION_DISCONNECT:
             // Ekrana USB BELLEK çıkarıldı bilgisi gönder
    		Dosya_Var=FALSE;
        	USB_Durum=FALSE;
        	break;
        }
  }
//
//
// USB BELLEK içine veri yazdığım alan

if(f_open(&USBHFile,(const TCHAR*)TempDosyaisim, FA_WRITE | FA_OPEN_APPEND) != FR_OK)
					USB_Durum=FALSE;
				if(USB_Durum)
				{
					f_lseek(&USBHFile, f_size(&USBHFile));
					f_write(&USBHFile,"\r\n", 2,&Bw);
					f_write(&USBHFile,Olcumfile.Tarih,sizeof Olcumfile.Tarih,&Bw); f_write(&USBHFile,"\t", 1, &Bw);
					f_write(&USBHFile,Olcumfile.Saat, sizeof Olcumfile.Saat,&Bw);  f_write(&USBHFile,"\t", 1, &Bw);
					f_write(&USBHFile,BackStr,4,&Bw); f_write(&USBHFile,"\t", 1, &Bw);
					f_write(&USBHFile,Led1Str,4,&Bw); f_write(&USBHFile,"\t", 1, &Bw);
					f_write(&USBHFile,Led2Str,4,&Bw); f_write(&USBHFile,"\t", 1, &Bw);
					f_write(&USBHFile,Led3Str,6,&Bw);f_write(&USBHFile,"\t", 1, &Bw);
					f_write(&USBHFile,Led4Str,6,&Bw); f_write(&USBHFile,"\t", 1, &Bw);
                                  }else
                                  {

                                  }