STM32F103 FatFS Dosya açma sorunu

Başlatan Mucit23, 18 Ekim 2017, 17:04:04

Mucit23

Selamlar

FatFS kütüphanesini STM32F103C8 ile çalıştırmak için uğraşıyorum iki gündür. Öncelikle Keil ortamında STD library ile derlenebilen bir projem var. Bu kısmı hallettim fakat FatFS kütüphanesini doğru düzgün çalıştıramadım.

1GB SD kart ile deniyorum. Sd kartı varsayılan olarak FAT formatıyla biçimlendirdim

SD kartı init edebiliyorum program SD_Init() fonksiyonunu birkaç denemede geçebiliyor. Birkaç deneme diyorum çünkü tek seferde SD kartı init edemiyorum.

SD kartı init edebilirsem eğer SD kartın kapasitesine SD_GetCapacity() fonksiyonu ile bakabiliyorum. Bu fonksiyonda doğru bir şekilde çalışıyor. Fakat Dosya açma ve kapama işlemleri her ne kadar başarılı bir şekilde sonuçlansada gerçekte windows ortamında dosyayı göremiyorum.

Boş bir txt dosyası açmak için aşağıdaki rutinleri kullanıyorum.

    if (f_mount(&FatFs, "", 1) == FR_OK)
    {
			if (f_open(&fil, "test.txt", FA_OPEN_ALWAYS | FA_READ | FA_WRITE) == FR_OK)
			{
				printf("Dosya Acildi");
				f_close(&fil);
			}
		  f_mount(0, "", 1);
    }
		else
		{
		   printf("SD_Kart Algilanmadi");
		}


Projede MMC_SD diye bir dosya var. SD haberleşme rutinleri genel olarak bu dosyada. Bu kodlar çince yazılmış sanırım. Pek birşey anlamak mümkün değil. Sorun ama bu dosyada

Burada bütünüyle proje dosyalarını yükledim
https://yadi.sk/d/IIa4Xu6V3Ns4Qg
Sorun nerde olabilir?

STM32F1 ile kullandığınız çalışan bir proje paylaşmanız mümkünmü? Örnek uygulama bulmakta sıkıntı yaşıyorum.

Mucit23

http://elm-chan.org/fsw/ff/00index_e.html
Buradan kütüphanenin son versiyonunu indirip herhangi bir mikroişlemciye adım adım nasıl port edileceğini anlatabilecek olan varmı? Rehber niteliğinde bir konu olurdu.

kantirici

Kütüphanenin çok portluk bir durumu yok aslında. Sadece soft spi için 4 tane IO 1/0 yapmak için tanımlama yapmak yeterli. Bunlarda zaten definlanmış sadece oraya yazmak kalıyor. Netteki örneklerde yeterli. Türkçe kaynakta mevcut.

baran123

@Mucit23 hocam aslında normal FatFs yanına sadece SPI/SDIO katmanını kurmak gerekiyor.
Tilen Majerle'nin örneğini incelerseniz kütüphane içerisinde bulunan fatfs_sd.c size bu konuda fikir verecektir.
Bu dosyanın içine kendi donanım katmanınızın ayarlarını yapacağınız fonksiyonları bu dosyaya düzgün şekilde eklerseniz istediğiniz donanımda çalışabilir.

Mucit23

Peki şuan çalışan ve yürütülen projede dosya açılmamasının sebebi ne olabilir? Bir siteden baya örnek buldum. Onlara bakıyorum ama MMC_SD dosyası hemen hemen aynı gibi.

program f_mount, f_open ve f_close rutinlerini çalıştırıyor

baran123

#5
f_mount yada f_open yaptığınızda geri dönen dönüş değeri nedir ?
Kartı FAT16 olarak biçimlendirdiniz mi ?

Mucit23

Evet Kartı Fat16 olarak biçimlendiriyorum.

Test için aşağıdaki kodları çalıştırıyorum.

    

	sd_size=SD_GetCapacity();											
	printf("SD Card Checked OK \r\n");
	printf("SD Card Size:  %d Byte\r\n",sd_size);	
	
if (f_mount(&FatFs, "", 1) == FR_OK)
    {
			printf("f_mount=FR_OK\n");
			if (f_open(&fil, "test.txt", FA_OPEN_ALWAYS | FA_READ | FA_WRITE) == FR_OK)
			{
				printf("Dosya Acildi\n");
				f_close(&fil);
			}
			else
			{
							printf("Dosya Acma Hatasi");
			}
		  f_mount(0, "", 1);
    }
		else
		{
		   printf("SD_Kart Algilanmadi");
		}


Birkaç defa üst üste bu kodu çalıştırıyorum aldığım cevaplar aşağıdaki gibi
SD Card Checked OK 
SD Card Size:  988282880 Byte
f_mount=FR_OK
Dosya Acildi
SD Card Checked OK 
SD Card Size:  988282880 Byte
f_mount=FR_OK
Dosya Acildi


Sonuç olarak Tek seferde dosya oluşmuyor ama birkaç defa üst üste yukarıdaki kodları çalıştırırsam dosya açılıyor.

Dosya içerisine birşeyler yazmam lazım ama f_puts fonksiyonu çalıştıramadım.

Test için dosyayı açtıktan sonra aşağıdaki kodu çalıştırdım,
f_puts("Bu bir test Mesajidir",&fil);
fakat keil derlerken aşağıdaki hatayı veriyor.
Alıntı Yap.\Objects\ARM_Software.axf: Error: L6218E: Undefined symbol f_puts (referred from main.o).
Symbol tanımlaması ff.h içerisinde tanımlı halbuki

Bu f_open,f_close, f_mount ve f_puts gibi fonksiyonların hepsi ff.c içerisinde yer alıyor. Fonksiyon başlıkları ise ff.h içerisinde var. sadece f_puts ve f_putc fonksiyonlarını derleyemiyorum. Sorun ne olabilirki?

kantirici

ffconfig dosyasında kütüphane ile ilgili ayarlar mevcut. Muhtemelen f_write kapatılmıştır. Bundan dolayı yazım yapamıyor sundur.

Mucit23

Alıntı yapılan: kantirici - 19 Ekim 2017, 17:11:05
ffconfig dosyasında kütüphane ile ilgili ayarlar mevcut. Muhtemelen f_write kapatılmıştır. Bundan dolayı yazım yapamıyor sundur.

Evet f_puts fonksiyonunu kullanılmamasının sebebi oymuş. _USE_STRFUNC parametresini 1 yapınca derlenebildi. Fakat hala txt içerisine birşeyler yazamadım.

Test için aşağıdaki rutinleri kullanıyorum.
while(SD_Init()!=0 && retry-->0) 
	{
		printf("SD Card Failed!\r\n");
		delay_ms(500);
		printf("Please Check!	  \r\n");
		delay_ms(500);
	}
	if(retry==255)SD_Error();
	
	sd_size=SD_GetCapacity();											
	printf("SD Card Checked OK \r\n");
	printf("SD Card Size:  %d Byte\r\n",sd_size);	
	
    if (f_mount(&FatFs, "", 1) == FR_OK)
    {
			printf("f_mount=FR_OK\n");
			if (f_open(&fil, "test5.txt", FA_OPEN_ALWAYS | FA_READ | FA_WRITE) == FR_OK)
			{
				printf("Dosya Acildi\n");
				f_puts("Bu bir Test Mesajidir",&fil);
				f_close(&fil);
			}
			else
			{
							printf("Dosya Acma Hatasi");
			}
		  f_mount(0, "", 1);
    }
		else
		{
		   printf("SD_Kart Algilanmadi");
		}


Hepsinden geçiyor. txt dosyası oluşturuluyor ama f_puts ile yazdıklarım txt nin içerisine yazılmıyor. Acaba parametrelerle ilgili bir sorun olabilirmi? Yani hali hazırda kullandığım kütüphane txt dosyası açabiliyorsa bu dosyanın içine birşeylerde yazabilmesi lazım.

baran123

Çok fark yok ama yazma okuma için şöyle yapıyorum.

typedef enum
{
    SD_Status_Error = 0,
    SD_Status_Ok    = 1
}SD_Status_t;

FATFS FatFs;
FIL fil;

SD_Status_t SD_WriteTextFile(uint8_t* txtName, uint8_t* buf)
{
    SD_Status_t SD_Status = SD_Status_Error;

    if (f_mount(&FatFs, "", 1) == FR_OK)
    {
        if (f_open(&fil, txtName, FA_OPEN_ALWAYS | FA_READ | FA_WRITE) == FR_OK)
        {
            if (f_puts(buf, &fil) > 0)
            {
                SD_Status = SD_Status_Ok;
            }
            f_close(&fil);
        }
        f_mount(0, "", 1);
    }

    return SD_Status;
}

SD_Status_t SD_ReadTextFile(uint8_t* txtName, uint8_t* buf, uint8_t len)
{
    SD_Status_t SD_Status = SD_Status_Error;

    if (f_mount(&FatFs, "", 1) == FR_OK)
    {
        if (f_open(&fil, txtName, FA_OPEN_ALWAYS | FA_READ | FA_WRITE) == FR_OK)
        {
            if (f_gets(buf, len, &fil))
            {
                SD_Status = SD_Status_Ok;
            }
            f_close(&fil);
        }
        f_mount(0, "", 1);
    }

    return SD_Status;
}


Belki ffconf da falan farklılık olabilir benim F4 için kullandığım kütüphane linkte. Karşılaştırma yapabilirsiniz.
http://s6.dosya.tc/server11/q7aazy/FatFs.rar.html

Mucit23

Aynı konfigürasyonları denedim birebir olarak. Ama sonuç değişmedi. Sorunu tekrar etmek gerekirse. Dosya açmada sorun yok sadece txt dosyasına yazamıyorum.

Farklı kütüphane bir kütüphaneye ihtiyacım var.

STM32F103 ve SPI kullanarak haberleşen bir SD kart örneği verebilecek olan var mı?  Bu işi bu sefer çözeceğim. Bazı deney kartları ile örnek uygulamalar gelebiliyor. Elinizde öyle örnek uygulamalar var ise paylaşabilirmisiniz?

volkanunal

Alıntı yapılan: Mucit23 - 20 Ekim 2017, 13:11:12
Aynı konfigürasyonları denedim birebir olarak. Ama sonuç değişmedi. Sorunu tekrar etmek gerekirse. Dosya açmada sorun yok sadece txt dosyasına yazamıyorum.

Farklı kütüphane bir kütüphaneye ihtiyacım var.

STM32F103 ve SPI kullanarak haberleşen bir SD kart örneği verebilecek olan var mı?  Bu işi bu sefer çözeceğim. Bazı deney kartları ile örnek uygulamalar gelebiliyor. Elinizde öyle örnek uygulamalar var ise paylaşabilirmisiniz?

burası yardımcı olabilir belki
https://ralimtek.com/Stm32_SPI_SD/

Mucit23

Hal library ile iş daha berbat bir hal aldı açıkçası.

CubeMX ile FATFS projeye ekleyerek sıfırdan bir proje oluşturdum. Normalde CubeMX FatFS kütüphanelerini projeye otomatik ekliyor. Ayrıca user_diskio diye bir dosya oluşturuyor. Kullanıcı bu dosya içerisine gerekli fonksiyonları yazması gerekiyor. Ben sağolsun @baran123 sayesinde bir örnek projeden user_diskio dosyasını ve diğer dosyaları alıp kendi projeme ekledim. Projeyi derleyebildim fakat init aşamasında    disk_initialize(SDFatFs.drv); kodunu çalıştırdığımda işlemci Hard_Fault'a düşüyor. Sebebini anlayamadım. İşin içindende çıkamayında ve HAL ile ilgili örnek bulamayınca tekrar STD library ile uğraşmaya başladım.

Asıl sorun hakkında önerilere ihtiyacım var. FatFS kütüphanesi SD kart içerisine dosya açıyor fakat f_write, f_puts gibi fonkaiyonlarla açtığım dosya içerisine yazma yapamıyorum. Bu sorun neden kaynaklanır?


baran123

Hocam heap alani kucuk oldunda sd fatfs duzgun calismiyordu. Ozellikle resim dosyasi acarken.
Belki bu problem olabilir.  Startup dosyasindan heap alanini buyutmeyi deneyebilirsniz

Mucit23

Heap degerini 0x400 yaptım değişen yok malesef.


Donanımda birde şöyle bir sıkıntı var. Elimde sd kart yuvası doğrudan yoktu. Arduinonun sd modülü var onu kullanıyorum. Uzerinde level shifter vs var. Acaba bundan kaynaklı bir sorun olabilirmi? Doğrudan mikro sd adaptörüne pin lehimleyip kullanmayı deneyeceğim. Çünkü sd init cok geç olumlu cevap veriyor. Birkac defa sd init işlemini tekrarlamam gerekiyor. Eğer hepsinden olumlu cevap gelirse dosya açılıyor. Fakat dosya içine birşey yazamıyorum.


Birde şunu sorayım. 


Hal kütüphanesi kullanılarak yapılan sd uygulamasında  sd kartı init etmek için disk.initialize fonksiyonunu çağırmak yetiyormu? user_diskio icerisindede benzer bir init fonksiyonu var. Disk.initializeyi çağırınca hard fault oluşuyor. Bilgisi olan varmı bu konuda?