STM32 – FATFS İLE SD KART UYGULAMALARI – 2

Bir önceki yayınımda STM32F103 ile SD Kart kullanmak üzere, SM32 CubeIDE platformunda bir projenin oluşturulmasını anlatmıştım. SD kartı okuyup yazan kod ayrıntılarına girmemiştim.

Bu yayında biraz daha program ayrıntılarına girerek, SD kart içeriğinin okunmasını, SD üzerindeki dosya ve klasörlerin TFT ekranda listelenmesini anlatacağım.

Bu çalışmada, önceki yayında nasıl oluşturulduğunu anlattığım projemiz üzerinden devam edeceğiz. O yayına ulaşmak için burayı tıklayınız.

Bu bölümde kullandığımız “f_” ile başlayan f_opendir(..), f_readdir(), f_mount(..) gibi fonksiyonlar ile DIR, FIL, FATFS, FILINFO tanımları FATFS kapsamında gelen ff.c/h dosyalarında yer alıyor.

FATFS f_ … FONKSİYONLARI

FATFS kütüphanesinin bize sunduğu çok fonksiyon var. Depolama aygıtlarını kullanırken bunlara başvuruyoruz. Bu fonksiyonların tam listesi ff.h da verildiği haliyle şöyle:

FATFS kütüphanesinin ff.c fonksiyonları

Görüldüğü gibi bu fonksiyonlar kullanılarak SD üzerinde her türlü işlemi yapmak mümkün.

SD KARTIN SİSTEME BAĞLANARAK AÇILMASI – sdCard_spi_init()

Önce SD Kartın bağlı olduğu SPI portu tanımlayıp, f_mount() ile kartı sisteme bağlayarak işe başlayalım. Bunu SD_Card_2020.c dosyasındaki sdCard_spi_init() fonksiyonu ile yapıyoruz.

SPI arayüzlü TFT kullandığımızda SD kart SPI2 portuna bağlı oluyor. F_mount fonksiyonunu çağırarak SD kartın FATFS parametrelerini “fs” adını verdiğimiz struct’a yüklüyoruz. Bu aşamada bu verileri kullanarak bir şey yapmıyoruz. Sadece işlemin başarılı olup olmadığına “fresult” üzerinden bakıyoruz. Eğer başarılı olduysa SD kartımız sisteme bağlanmış oluyor.

BAZI DEĞİŞKEN TANIMLAMALARI

Buradaki ve yazının devamında vereceğim fonksiyonlarda kullanılan bazı parametreler main.c içinde aşağıdaki gibi tanımlanıyor.

Aşağıdakiler de sdCard_2020.c başında yer alıyor.

Bu tanımlarda yer alan FATFS, FIL, FILINFO, DIR gibi veri yapılarının detaylarını ff.h dosyasında görmek mümkün. Bazılarını göz önünde bulundurmak amacıyla, yazının devamında açıklama notları halinde koydum. Kodlar üzerinde çalışırken bakmak gerektiğinde ff.h da bulunabilirler.

SD KART İÇERİĞİNİ OKUYARAK LİSTELEYEN FONKSİYONLAR

KART KAPASİTESİNİ OKUYARAK GÖRÜNTÜLEMEK – SD_TotalSize()

SD Kart kapasitesi ve boş alanın raporlanması

Burada da FATFS kütüphanesinin ff.c dosyası içidneki f_getfree() fonksiyonunu kullanıyoruz. Yukarıdaki parafgrafta FATFS yapısı olarak tanımlanmış olan “pfs” veri blokuna SD kart bilgilerini okuyoruz. Bu fonksiyon bize ayrıca DWORD olarak tanımlamış olduğumuz fre_clust parametresi ile SD karttaki serbest cluster sayısını da bildiriyor. Cluster sayısını, cluster boyutunu veren pfs->size ile çarparak SD karttaki boş alanı buluyoruz.

“pfs->fatent” parametresi SD karttaki cluster sayısını veriyor. Bunu cluster boyutu ile çarparak SD kart kapasitesini bulabiliyoruz.

FATFS VERİ YAPISI

SD kart’ı sisteme bağlayarak açtığımızda depolama alanı hakkındaki tüm bilgiler FATFS struct olarak ff.h başlığında tanımlanmış bir şekilde okunur. Aslında çok fazla bilgi okunup depolanıyor, bu uygulamamızda bunların çoğuna bakmıyoruz. FATFS tanımı şöyle:

FATFS veri yapısı

KART İÇERİĞİNİN OKUNMASI – scan_files()

Sıra geldi SD karttaki klasör ve dosyaların okunmasına. Sadece root directory deki klasör ve dosyaların adlarını okuyacağız. Klasörlerin açılarak alt klasör ve dosyaların okunması bir başka yayın konusu olabilir, şimdilik buna ihtiyacım yok.

Bu işi SD_card_2020.c dosyası içindeki scan_files() adlı fonksiyon ile yapıyoruz. Bu fonksiyon karttaki klasörlerin isimlerini “dirList[]”, dosyaların isimlerini de “list[]” dizilerine kaydediyor. Dosyaların belirli uzantılara sahip olanlarını seçmek üzere de “filter” adlı bir parametre verebiliyoruz. Bu parametre 3 harf, ya da sadece hepsi anlamına gelmek üzere “*” olabiliyor.

Path parametresini SD kart logical drive numarası, “0:” olarak veriyoruz.

scan_files() çağrılmadan önce SD_Card_init() ile “mount” işleminin yapılmış olması gerektiğini hatırlatayım.

scan_fies() fonksiyonu başlangıç bölümü, f_opendir ile SD kartı açıyoruz.

Bu fonksiyon ilk olarak “path” parametresi ile bildirdiğimiz klasörü açarak, bilgilerini “dir” veri bloku içine okur. Bu veri bloku ff.h içinde “DIR” yapısı ile tanımlanmıştır. İçeriği aşağıdaki gibi:

FATFS – DIR veri bloku

Burada kartta bulunan klasör ve dosya bilgilerini kaydedeceğimiz bir “fileData” veri bloku var. Bu veri yapısı ff.h içinde FILINFO olarak tanımlanan şekilde. FileData, klasör ya da dosya hakkındaki bilgileri içeriyor:

FILINFO veri bloku

SD kartı açtığımıza göre şimdi içeriğinin okunmasına geçebiliriz.

Kart açıldıktan sonra, 331. satırda f_readdir() fonksiyonunu tekrar tekrar çağırıyoruz. Her seferinde bulunan klasör ve dosya nesnelerinin bilgilerini fileData veri bloku içine okutuyoruz.

f_readdir() in ilk parametresi olan “dir” blokunu bir önceki adımda, 325. satırda f_opendir() ile doldurmuştuk.

Her seferinde bulunan nesnenin bir klasör mü yoksa dosya mı olduğuna 338. satırda “fileData.fattrib” verisine bakarak karar veriyoruz.

Eğer bu bir klasör ise bunun adını yani “fileData.name” i 340. satırda dirList[] içine koyuyoruz. Yok eğer klasör değilse dosyadır, o zaman da 360. satırda fileLlist[] içine yerleştiriyoruz. Dosyaları önce uzantılarını “filter” parametresi ile karşılaştırarak uyuyorsa listeye katıyoruz. Filtre “*” olarak verilmiş ise tüm dosyalar listeye giriyor.

Bu SD tarama çevrimi 332. satırdaki kontrol ile okunacak başka bir nesne kalmadığında sona erdiriliyor.

filinfo (fileData) VERİ BLOKU

DIRECTORY VE DOSYA LİSTELERİNİN TFT UZERINDE GORUNTULENMESİ

İsimleri fileList[] ve directoryList[] dizilerine yüklenmiş olan dosyaların ekranda listelenmesi basit bir işlem, ayrıca bir açıklamaya gerek yok sanırım. Bu işi listFiles() fonksiyonu ile yapıyoruz.

ANA PROGRAM -MAIN.C

Ana programda USER CODE 2 bölümüne aşağıdaki test satırlarını koyarak listFiles() fonksiyonunu çağırıyoruz.

ListFiles() fonksiyonunu “BMP” uzantısı için filtre parametresi vererek çağırdım. Çünkü SD üzerinde çok daha fazla dosya var, isim dizlerinin kapasitesinin aşılması riski var.

Burada kapalı durumda olan başka fonksiyonlar da görülüyor. Bunlardan SD_Card_Func() bundan önceki bölümde kullandığım controllersTech.com blog sitesinden aldığım fonksiyonlar ile çalışıyor. Bu sefer 2017 de kendi yazmış olduğum kodları birkaç revizyon ile güncelleyerek (SD_Card_2020.c dosyası içinde) kullanıyorum.

readBmpFile() ve slideShow ise, SD karttaki .bmp formatındaki resim dosyalarını TFT üzerinde görüntülüyor. Onları başka bir yayında anlatacağım.

SONUÇ : TFT EKRAN GÖRÜNTÜSÜ

SD Kart üzdeindeki BMP dosyalarının listelenmesi. Sol tarafta SD üzerindeki iki adet klasör görünüyor.

Bu yayının sonu – Selçuk Özbayraktar Temmuz 2020

Leave a Reply

Your email address will not be published. Required fields are marked *