fat32-sd-kart-kapak

SD Kart ( SD Mode) ve Fat32 – MikroC Kütüphanesi

This post is also available in: English (İngilizce)


 


Bu derste SD kartlar(SD Mode) ve FAT32 için yazdığım mikroC kütüphanesinin kullanımı göreceğiz. Ancak ilk olarak SD kart ile başlayacağım. SD kart ve FAT32 aynı kütüphane için entegre şekilde yazıldı, bu sebeple öncelikle SD kart devresinin kurulumu ve kullanımını öğrendikten sonra FAT32 ile dosya işlemlerine geçeceğiz.

Bu derste okuyacaklarınız 22 aylık bir çalışma sonucunda ortaya çıkan kütüphanenin yalnızca kullanım kısmıdır.

SD Kart(SD Mode)

  • SD kartlar günümüzde oldukça yaygınlaşmış bir veri depolama aracıdır.Bir çok türü vardır mikroSD, miniSD vb. tipleri mevcuttur.
  • Küçük oluşları az enerji harcayarak çok hızlı işlem yapmaları SD kartları oldukça avantajlı hale getirmektedir.
  • SD kartlar farklı özelliklerde farklı kapasitelerde ve farklı markalarda bulunabilir ancak marka farklı olsa da sistem daima aynıdır.
  • SD kartlar 2 tip mod ile çalıştırılabilirler.
    1. SPI Mod : Seri mod
    2. SD Mod : Paralel mod
  • Aşağıdaki tabloda SPI mod ve SD mod u karşılaştıralım

SD Mod

SPI Mod

Bağlantı için tüm pinler kullanılır-(isternirse sadece Data0 kullanılarakta sürülebilir) Bağlantı için sadece 3 pin kullanılır
Veri aktarım hızı en az 50 Mhz dir Veri aktarım hızı ? mhz dir
Veri aktarmak için tüm data portları    (Data0,Data1,Data2,Data3) kullanılır. Veri ve komutlar aynı tek pinden aktarılır.
Komutlar ve diğer tüm işlemler ayrı pinlerden yapıldığından çok hızlıdır. Veri, komut ve cevaplar aynı pin üzerinden yapıldığından oldukça yavaştır.
UHS gibi çok yüksek hız modlarını destekler UHS gibi modları kesinlikle desteklemez
CRC kontrolü sağlar, böylece verilerin sağlamlığı garanti altına alınır. CRC kontrolü bulunmaz, veriler bozulmuş olarak kayıt edilebilir.
SD mod sürücü kodları yüksek fiyatlar ile satılır.(benim yazdığım ücretsiz!) SPI mod sürücü kodları ücretsiz bulunabilir.
  • Yukarıdaki tablodan anlaşılacağı üzere SPI mod yavaş ve pek iş görmez bir moddur, zaten bu yüzden bu mod’u kullanabilecek kütüphaneler ücretsiz olarak verilirler.
  • Ben ise burada sizlere SPI modu değil SD modu anlatacağım. Artık devrelerinizde çok hızlı bir şekilde SD kart kullanabileceksiniz !

SD Kart Pinleri ve İşlevleri

sd-kart-pinler
SD kartın pinleri görülmekte.
  • Yukarıdaki resimde SD kartın pinleri görülmektedir. Biz SD yazan kısma bakacağız çünkü kartımızı SD Mod da kullanacağız.
  • Resimdeki bir MicroSD karttır. Normal SD kartlar ile sadece pinlerin yerleri farklıdır. Ben devremde ufak olması sebebi ile MikroSD kart kullandım.
  • Pinler
    1. DAT2 (data2) : Data2 pinidir veri alışverişi yapılasını sağlar
    2. CD/DAT3 (card detect/data3) : Çitf işlevli pindir. Card Detectc ile kartın olup olmadığı denetlenir , Data3 veri alışverişi yapılmasını sağlar
    3. CMD(command) : Komut pinidir, SD karta tüm komutlar bu pin üzerinden iletilir
    4. VDD  : +3,3v besleme ucudur.
    5. CLK(clock) : SD kartın kalp atışı diyebiliriz. Her işlem bu clock adımları ile yapılır.
    6. VSS : GND bağlatı ucudur.
    7. DAT0(data0) : Data0 pinidir , veri alışverisi yapılır. SD mod içerisinde bir seçenek ile istenirse diğer 3 data portu iptal edilip tek porttan da veri alışverişi yapılabilir.
    8. DAT1(data1) : Data1 pinidir, veri alışverişi yapılır.

SD Kart Sürücü Devresi

  • SD kartı kullanmak için bir devreye ihtiyacımız bulunmaktadır. Devre detayları ve yazılan notlara uymanız devrenizin doğru çalışmasını sağlayacaktır.
  • SD kartlar mutlaka +3,3volt ile beslenmelidir aksi halde bozulurlar. “3,3v Regülatör Devresi”
  • Devremiz PIC ile çalışacaktır. Buradaki sürücü devresi PIC e bağlanmalıdır. Ben PIC olarak PIC18f4620 kullanmaktayım.

Devre Şeması

sd-kart-sd-mod-devre-semasi
SD kart – SD mod için gerekli Devre Şeması
  • Devre Şemasında yukarı doğru giden yazılı uçların tamamı PIC e gitmektedir.
  • CLK – clock ucu dışında tüm uçlar “pull-up” yapılmıştır.
  • Dikkat edilirse “pull-up” lar filtreden sonra yapılmıştır.

Gerekli Malzemeler

  1. 4 Adet 47K direnç
  2. 1 Adet IP4252CZ8 Pasif Filtre
  3. 1 Adet SD Kart Soketi
  4. Delikli Pertinaks
IP4252CZ8
IP4252CZ8
sd-kart-soket
MikroSD Kart Soketi

 

 

 

 

 

 

 

Devrenin Yapımı

  • NOT: Devrede mutlaka SD kart için soket kullanın , tercihen yaylı soketlerden kullanırsanız daha iyi olur.
  • NOT2-ÖNEMLİ!-: Devrede kullanılan IP4252CZ8 Pasif filtre hayati öneme sahip bir parçadır. SD kart yüksek hızlarda çalıştığından dolayı aşırı bir parazitlenme yaratmaktadır. Bu sebeple bu veri okumada sorunlar oluşturmaktadır. Bu mikro parça tüm sorunu çözmektedir. Ancak bu parça çok ufak olduğundan en ince uçlu havya ve ince bakır teller yardımı ile lehim yapıp sonrasında yapıştırmanız da fayda var.
sd-kart-IP4252CZ8-pasif-filtre
SD Kart  IP4252CZ8 pasif filtre
  • Yukarıda pasif filtre parçası görülmektedir. Önce ince bakır teller bağlandı ardından yapıştırıldı. İnce tellerde devreye aktarılabilmesi için pinlere bağlandı böylece tel kopma gibi sorunlar ortadan kalktı.
  • Bu devre tasarım aşamasında olduğundan bu şekilde yapıldı . Devre kesin halini alınca profesyonel olarak lehim yapılacaktır.
  • IP4252CZ8 pasif filtreyi AliExpress ten alabilirsiniz.
sd-kart-sd-mod-devre
SD Kart SD Mod Sürücü Devresi
  • Devre genel hali ile görülmektedir. Dişi yuvalar yukarıdaki pasif filtrenin takılacağı yerlerdir. Bu şekilde daha kullanılışlı bir hal alacaktır.
  • Pull-up dirençleri görülmektedir.
  • MikroSD kart yuvasından yine ince bakır teller yardımı ile bağlantı kuruldu, ardından çok az yapıştırıcı ile teller yapıştırıldı.
  • Sizde benim gibi kağıt şablon kullanırsanız devre kurulumunda pinleri karıştırmadan devreyi kurabilirsiniz.
  • Sağdaki jumper teller ise direk PIC e gitmektedir.
  • Sürücü devremiz hazır olduğuna göre yazılıma geçebiliriz.

SD Kart SD Mod Yazılımı

  • SD kartların içerisinde gerçekten muazzam bir sistem kurulmuş çalışmalarım sırasında bunu fark ettim. Bir sistem ancak bu kadar iyi olabilir demekten başka bir seçenek kalmıyor. Çok geniş sistem içerisinde bizim işimize yarayacak olanları aldım. Şu anlık yazılım UHS modlarını desteklemiyor çünkü UHS I modu bile 100mhz üzerine çıkıyor şu an o hızda çalışan PIC bulmak biraz zor . Yazılım standart 50mhz de çalışmakta bu bile PIC için yüksek bir hız.
  • Temelde fonksiyonları ikiye ayırıyorum “İşlevsel Fonksiyonlar” ve ” Komut Fonksiyonları” olarak . İşlevsel fonksiyonlarda içerisinde bir çok parçaya ayrılmaktadır. Burada her fonksiyonu tek tek anlatacağım ancak bazı fonksiyonlar sadece bilgi amaçlı verilecektir asıl kullanım yeri sistem içerisi olduğundan dışarıdan çağrılması işleyişi bozabilir ancak yinede bilgi olması açısından faydası olacaktır.
  • SD kart kütüphanesi içerisinde CRC kütüphaneside gömülü bulunduğundan projeniz için ayrıca CRC kütüphanesini eklemenize gerek yoktur.
  • Yazılım içerisinde bazı sabitler bulunmaktadır. Aynı isme sahip değişken tanımlayamayacağınız için bu sabitleri inceleyelim
    • unsigned long SD_DATA_TAMPONU[128] : Tüm veri işlemleri bu tampon üzerinden yapılır. Yazılım üzerinde başka bir işlem içinde kullanılabilir.
    • unsigned long YAZILAN_BLOK_SAYISI=0 : Yazılan blok sayısını saklar sistem içerisinde kullanılır
    • unsigned long KART_DURUM=0 : SD Kart Statü durumlarını saklar sistem içerisinde kullanılır
    • unsigned int CID[8] : Kartın CID bilgilerini saklar – kullanıcı tarafından okunabilir nasıl okunduğu detaylı anlatılacak
    • unsigned int CSD[8] : Kartın CSD biglierini saklar – kullanıcı tarafından okunabilir nasıl okunduğu detaylı anlatılacak
    • unsigned int RCA_ADRESI=0 : Kartın tanımlayıcı adresini tutar
    • unsigned char KART_TIPI=0 : Kart tipinin ne olduğu hakkındaki bilgiyi tutar
    • unsigned char VERI_YOLU_GENISLIGI : Seçilen veri yolu genişliğini saklar
sd-kart-kutuphanesinin-test-edildigi-kartlar
SD kart kütüphanesinin test edildiği SD kartların bir kısmı görülmektedir.

Fonksiyonlar

  • Tüm fonksiyonların açıklamalarını ve kullanım şeklini burada göreceğiz.
  • Sistem fonksiyonları kırmızı ile kullanıcı fonksiyonları ise yeşil ile belirtilmiş ve içeriğine yazılmıştır.

1-Genel Maksatlı Ana Fonksiyonlar

 

– SD_CLOCK Fonksiyonu

Fonksiyon : void SD_CLOCK(unsigned char dongu_sayisi)

Amacı : SD kartın kalp atışlarını oluşturur. SD kartta her komut her işem her bit bir clock darbesi ile işlem görür.

Parametreler:

  • dongu_sayisi : clock sinyalinin kaç kez oluşturulacağını belirler.

Kullanım Şekli : 

SD_CLOCK(80);//80 adet clock sinyali gönderilir.

Geri Bildirim: Void tipinde olduğundan geriye herhangi bir değer döndürmez.

  • Sistem fonksiyonudur. Kullanıcı tarafından kullanılamaz.

 

SD_SDMOD_ANALIZ Fonksiyonu

Fonksiyon : unsigned char SD_SDMOD_ANALIZ(unsigned char SD_VERI_YOLU_GENISLIGI)

Amacı : SD kartı tanımlamak için en başta kullanılır. Öncelikle sd kartı uyandırıp ona birtakım komutlar göndererek onun hakkındaki bilgiyi toplar. Sahip olduğu parametre de iki seçenek vardır

Parametreler:

  • SD_VERI_YOLU_GENISLIGI : SD kartın 4 bit mod mu yoksa 1 bit mod  ile çalışacağını belirler.
    • 4 bit mod : 4 adet data portunuda kullanmayı aktif eder.
    • 1 bit mod : 1 adet data portunu ( data0) aktif ederek kullanır.
  • Hangi mod kullanılacağı en başta belirlenir ve çalışma süresince değiştirilemez.

Kullanım Şekli:

SD_SDMOD_ANALIZ(4); // 4 bit mod aktif edildi

Geri Bildirim:

  • Geriye 1 değeri döndürürse işlem başarılı demektir.
  • Geriye 0 değeri döndürürse kart bulunmuyor demektir.
  • Kullanıcı fonksiyonudur. En başta bu komut kullanılmalıdır.

 

SD_MOD_VERI_YAZMA_RUTINI_4BIT Fonksiyonu

Fonksiyon : unsigned char SD_MOD_VERI_YAZMA_RUTINI_4BIT()

Amacı : SD kart için 4 bit mod seçildiğinde yazılım tüm yazma işlemleri için bu fonksiyonu çağırır.

Parametre : Bulunmuyor.

Kullanım Şekli:

SD_MOD_VERI_YAZMA_RUTINI_4BIT(); // 4 bit mod aktif edildiğine göre kullanılacak veri yazma rutini

Geri Bildirim:

  • Geriye 1 değeri döndürürse işlem başarılı demektir.
  • Geriye 0 değeri döndürürse işlem başarısız demektir.
  • Sistem fonksiyonudur. Kullanıcı tarafından kullanılamaz.

 

SD_MOD_VERI_YAZMA_RUTINI_1BIT Fonksiyonu

Fonksiyon : unsigned char SD_MOD_VERI_YAZMA_RUTINI_1BIT()

Amacı : SD kart için 1 bit mod seçildiğinde yazılım tüm yazma işlemleri için bu fonksiyonu çağırır.

Parametre : Bulunmuyor.

Kullanım Şekli:

SD_MOD_VERI_YAZMA_RUTINI_1BIT(); // 1 bit mod aktif edildiğine göre kullanılacak veri yazma rutini sadece data0 kullanılır

Geri Bildirim:

  • Geriye 1 değeri döndürürse işlem başarılı demektir.
  • Geriye 0 değeri döndürürse işlem başarısız demektir.
  • Sistem fonksiyonudur. Kullanıcı tarafından kullanılamaz.

 

SD_MOD_VERI_OKUMA_RUTINI_4BIT  Fonksiyonu

Fonksiyon : unsigned char SD_MOD_VERI_OKUMA_RUTINI_4BIT()

Amacı : SD kart için 4 bit mod seçildiğinde yazılım tüm okuma işlemleri için bu fonksiyonu çağırır.

Parametre : Bulunmuyor.

Kullanım Şekli:

SD_MOD_VERI_OKUMA_RUTINI_4BIT();//4 bit mod aktif edildiğine göre kullanılacak veri okuma rutini

Geri Bildirim:

  • Geriye 1 değeri döndürürse işlem başarılı demektir.
  • Geriye 255 değeri döndürürse veri aktarımında hata olmuş demektir.Veriler bozulmaya uğramıştır.
  • Sistem fonksiyonudur. Kullanıcı tarafından kullanılamaz.

 

SD_MOD_VERI_OKUMA_RUTINI_1BIT  Fonksiyonu

Fonksiyon : unsigned char SD_MOD_VERI_OKUMA_RUTINI_1BIT()

Amacı : SD kart için 1 bit mod seçildiğinde yazılım tüm okuma işlemleri için bu fonksiyonu çağırır.

Parametre : Bulunmuyor.

Kullanım Şekli:

SD_MOD_VERI_OKUMA_RUTINI_1BIT();//1 bit mod aktif edildiğine göre kullanılacak veri okuma rutini

Geri Bildirim:

  • Geriye 1 değeri döndürürse işlem başarılı demektir.
  • Geriye 255 değeri döndürürse veri aktarımında hata olmuş demektir.Veriler bozulmaya uğramıştır.
  • Sistem fonksiyonudur. Kullanıcı tarafından kullanılamaz.

 

2- Sektör Yazma Fonksiyonları

 

SD_MOD_TEK_BLOK_YAZ Fonksiyonu

Fonksiyon : unsigned char SD_MOD_TEK_BLOK_YAZ(unsigned long BLOK_ADRESI)

Amacı : Data tamponuna yüklenmiş olan veriyi adresi verilen blok’a yazar. Tek blok yazar.

  • Not: Data tamponu “ SD_DATA_TAMPONU[128]long tipinde bir dizidir. Toplamı 512 bytettır çünkü SD karta en az 512byte veri yazılabilir(1 blok). Bu sebeple yazılacak veri öncelikle bu diziye yüklenmeli ardından yazma komutu verilmelidir.

Parametre:

  • BLOK_ADRESI : Yazılacak blok’un adresi verilir. Tamponda bulunan 512byte veri bu blok’a aktarılır.

Kullanım Şekli:

//tampona veri aktarılması
//boş olan dizilerde eğer rastgele değerler duruyorsa onlarda olduğu gibi aktarılır
SD_DATA_TAMPONU[0]=121545;
SD_DATA_TAMPONU[1]=415464;
SD_DATA_TAMPONU[2]=2342342;
SD_DATA_TAMPONU[3]=23432432;
//tampona veri yüklendikten sonra yazma komutu verilir
SD_MOD_TEK_BLOK_YAZ(3);//3. blok'a veriyi yaz

Geri Bildirim:

  • Geriye 1 değeri döndürürse işlem başarılı demektir.
  • Geriye 0 değeri döndürürse işlem başarısız demektir.
  • Kullanıcı fonksiyonudur.

 

2A – Çoklu Yazma Fonksiyonları

  • Çoklu yazma fonksiyonları çok büyük verilerde blokları arka arkaya ara vermeden göndermeye yarar ancak PIC ın boyutu ve işlem hacmi sebebi ile pek kullanılmaz.
  • Çoklu yazma fonksiyonu 3 bölümden oluşur
    1. SD_COKLU_BLOK_YAZ_BASLAT : Yazmanın başlayacağı adres ve yazılacak blok sayısı verilir böylece SD kart buraları önceden silerek zaman kazanır.
    2. SD_COKLU_BLOK_YAZ_VERIGONDER : Tampona eklenmiş veriler gönderilir. Burada tampon 512 byte boyutundadır ancak bu fonkisyon “for” döngüsüne alınarak tampona yeni veriler yüklenip arka arkaya durmadan gönderilebilir.
    3. SD_COKLU_BLOK_YAZ_BITIS: SD karta toplu yazım işleminin sona erdiğini belirtir.
  • Üç fonksiyon açıklandıktan sonra en sonda kullanım şekli gösterilecektir

 

SD_COKLU_BLOK_YAZ_BASLAT Fonksiyonu

Fonksiyon  : unsigned char SD_COKLU_BLOK_YAZ_BASLAT(unsigned long BLOK_ADRESI,unsigned long YAZILACAK_BLOK_SAYISI)

Amacı : Çoklu yazma işlemini başlatır. Yazmanın başlayacağı adresi ve kaç adet blok yazacağını belirterek SD kartın o bölgeleri önceden silip vakit kazanılmasını sağlar.

Parametre:

  • BLOK_ADRESI: Yazma işleminin başlayacağı blok’un adresi yazılır.
  • YAZILACAK_BLOK_SAYISI: Kaç adet blok yazılacağı bildirilir.

Geri Bildirim:

  • Geriye 0 değeri döndürürse kart yok demektir.
  • Kullanıcı fonksiyonudur. 

 

SD_COKLU_BLOK_YAZ_VERIGONDER Fonksiyonu

Fonksiyon : unsigned char SD_COKLU_BLOK_YAZ_VERIGONDER()

Amacı : Tampona yüklenmiş olan veriyi gönderir.

Parametre : Bulunmuyor.

Geri Bildirim :

  • Geriye 0 değeri döndürürse kart yok demektir.
  • Kullanıcı fonksiyonudur.

 

SD_COKLU_BLOK_YAZ_BITIS Fonksiyonu

Fonksiyon : unsigned char SD_COKLU_BLOK_YAZ_BITIS()

Amacı : Çoklu yazma işlemini sonlandırır.

Parametre : Bulunmuyor.

Geri Bildirim :

  • Geriye 0 değeri döndürürse kart yok demektir.
  • Geriye 1 değeri döndürürse işlem başarılı olmuştur.
  • Kullanıcı fonksiyonudur. 

Çoklu Yazma Fonksiyonları Kullanım Şekli:

SD_COKLU_BLOK_YAZ_BASLAT(10,5);//çoklu yazıma hazırlık yapılıyor
//5 adet blok yazılacağı için i değeri 5 e ayarlandı.
for(İ=0;i<5;i++)
  {
     veri güncelleme işlemi//(Tampondaki veriyi güncelleyen herhangi bir fonksiyon)
     SD_COKLU_BLOK_YAZ_VERIGONDER();
  }
SD_COKLU_BLOK_YAZ_BITIS();//yazım sonlandırıldı
  • Not: Veri güncelleme işlemi data tamponunu değiştiren herhangi bir fonksiyon olabilir. Her seferinde 1 blok veri yazılacak for döngüsü bitince de işlem sonlandırılacak. Çoklu yazma işlemleri bu şablona göre yapılmalıdır.

 

3-Sektör Okuma Fonksiyonları

 

SD_MOD_TEK_BLOK_OKUMA Fonksiyonu

Fonksiyon : unsigned char SD_MOD_TEK_BLOK_OKUMA(unsigned long BLOK_ADRESI)

Amacı : SD karttan tek bir blok okur ve veriyi tampona yükler.

Parametre : 

  • BLOK_ADRESI: Okunacak blok’un adresi yazılır.

Kullanım Şekli:

SD_MOD_TEK_BLOK_OKUMA(0);// ilk blok okunur

Geri Bildirim:

  • Geriye 0 değeri döndürürse okuma başarısız olmuştur.
  • Geriye 1 değeri döndürürse işlem başarılı olmuştur.
  • Geriye 255 değeri döndürürse okurken verilerde bozulma olmuştur. CRC hatası
  • Kullanıcı fonksiyonudur. 

3A-Çoklu Okuma Fonksiyonları

  • Çoklu okuma fonksiyonları SD karttan durmadan arka arkaya blok blok veri okumaya yarar.Her okuma işleminde onunan 1 blok yani 512 byte veri data tamponuna yazılır, kullanıcı okunan veriyi burada bulacaktır. Bu veriler değerlendirildikten sonra yeni okuma işlemi yapılmalıdır aksi halde yeni okunan veri diğerlerinin üzerine yazılacaktır.
  • Çoklu okuma fonksiyonu 3 bölümden oluşur
    1. SD_COKLU_BLOK_OKUMA_BASLAT : Okumanın başlanacağı adres yazılır.
    2. SD_COKLU_BLOK_OKUMA_VERIOKU : Arka arkaya blokları okur ve okunan değerleri data tamponuna yazar.
    3. SD_COKLU_BLOK_OKUMA_BITIS: SD karta toplu okuma işleminin bittiğini bildirir.
  • Üç fonksiyon açıklandıktan sonra en sonda kullanım şekli gösterilecektir.

 

SD_COKLU_BLOK_OKUMA_BASLAT Fonksiyonu

Fonksiyon : unsigned char SD_COKLU_BLOK_OKUMA_BASLAT(unsigned long BLOK_ADRESI)

Amacı : SD karta okuma yapılacak blok adresi vererek kartı okumaya hazırlar.

Parametre :

  • BLOK_ADRESI: Okumaya başlanılacak blok’un adresi.

Geri Bildirim:

  • Geriye 0 değeri döndürürse kart yok demektir.
  • Kullanıcı fonksiyonudur.

 

SD_COKLU_BLOK_OKUMA_VERIOKU  Fonksiyonu

Fonksiyon : unsigned char SD_COKLU_BLOK_OKUMA_VERIOKU()

Amacı : Belirtilen adresten itibaren SD karttan blok blok veri okuyarak data tamponuna yazar.

Parametre : Bulunmuyor.

Geri Bildirim :

  • Geriye 0 değeri döndürürse okuma başarısız olmuştur.
  • Geriye 1 değeri döndürürse işlem başarılı olmuştur.
  • Geriye 255 değeri döndürürse okurken verilerde bozulma olmuştur. CRC hatası
  • Kullanıcı fonksiyonudur.

 

SD_COKLU_BLOK_OKUMA_BITIS Fonksiyonu

Fonksiyon : unsigned char SD_COKLU_BLOK_OKUMA_BITIS()

Amacı : SD karta okuma işleminin sona erdiğini bildirir.

Parametre : Bulunmuyor.

Geri Bildirim :

  • Geriye 0 değeri döndürürse kart yok demektir.
  • Kullanıcı fonksiyonudur.

Çoklu Okuma Fonksiyonları Kullanım Şekli:

SD_COKLU_BLOK_OKUMA_BASLAT(100);//çoklu okuma başlangıç adresi bildirildi
//30 adet blok okunacağı için bu değer verildi
for(İ=0;i<30;i++)
  {
     SD_COKLU_BLOK_OKUMA_VERIOKU();
     veri kullanım işlemi ;// Her okumada veri kullanılmalıdır. Aksi halde yeni okunan veri eskilerin üzerine yazılacaktır.  
  }
SD_COKLU_BLOK_OKUMA_BITIS();//okuma sonlandırıldı
  • Not: Her okuma işleminden sonra tampondaki veriler ya aktarılmalı yada gerekli yerlerde kullanılmalıdır. Çünkü yeni okuma ile eski verilerin üzerine yeni okunan veriler yazılacaktır.

 

4- Sektör Silme Fonksiyonları

 

SD_MOD_SEKTOR_SIL Fonksiyonu

Fonksiyon : unsigned char SD_MOD_SEKTOR_SIL(unsigned long BASLANGIC_ADRESI,unsigned long BITIS_ADRESI)

Amacı : Belirtilen başlangıç ve bitiş sektörleri de dahil olarak aradaki tüm sektörleri siler

Parametre:

  • BASLANGIC_ADRESI : Silmeye başlanacak sektörün numarasıdır. Bu sektörü de siler.
  • BITIS_ADRESI : Silinmenin bitirileceği sektör numarasıdır. Bu sektörü de siler.

Kullanım Şekli:

SD_MOD_SEKTOR_SIL(12224,12224);//12224. sektörü siler
SD_MOD_SEKTOR_SIL(100,1000);//100. sektörden 1000. sektöre kadar tüm sektörleri siler

Geri Bildirim :

  • Geriye 1 değeri dönüyorsa işlem başarılı olmuş demektir
  • Geriye 0 değer dönüyorsa sektör silme hatası vermiştir. ( bazı sektörler korumalı olabilir bunlar silinemez o sektörlerde bu hatayı verebilir.)
  • Geriye 255 değeri dönüyorsa kart yok demektir.
  • Kullanıcı fonksiyonudur. 

 

5-Komut Fonksiyonları

  • Bu başlık altında kütüphanemde bulunan tüm komutların açıklamaları yer alacak. Ancak bu komutlar kullanıcı tarafından çağrılıp kullanılamazlar çünkü SD kartın sistem örgüsü oldukça karışık olduğundan her komuttan sonra bir cevap sonrasında mutlaka gitmesi gereken komut veri vb. işlem gelmektedir. Yineden bu konuda bilgi sahibi olmak isteyenler için bunları da açıklıyorum.Açıklamalar daha yüzeysel yapılacaktır.
  • SD kart data sheet lerine bakıldığında daha bir çok komut olduğu görülecektir ancak sadece genel kullanım üzerine olan komutları ekledim fakat ileride kütüphaneyi genişletmeyi düşünüyorum.
sd-kart-osiloskop-incelemesi
SD karta gönderilen komutların ve gelen cevabın osiloskop üzerinde incelenmesi.

CMD0 Komutu

Fonksiyon : void CMD0()
Amacı : SD kartı resetleyerek başlangıç konumuna getirir.

 

CMD8 Komutu

Fonksiyon : unsigned char CMD8()
Amacı : SD kartı tanımlayarak hangi voltaj aralığında çalışacağını belirler

 

CMD55 Komutu

Fonksiyon  : unsigned char CMD55(unsigned int RCA_ADRESI)
Amacı : SD kart sisteminde ACMD komutlarından önce gönderilir.

 

ACMD41 Komutu

Fonksiyon : unsigned char ACMD41()
Amacı : SD kartın voltaj aralığı kart tipi gibi bilgileri belirler

 

CMD2 Komutu

Fonksiyon : unsigned char CMD2()
Amacı : SD kartın CID parametrelerini okur.

 

CMD3 Komutu

Fonksiyon : unsigned char CMD3()

Amacı : SD kart için kimlik üretir. RCA kodu.

 

CMD9 Komutu

Fonksiyon : unsigned char CMD9(unsigned int RCA_ADRESI)

Amacı : SD kartın CSD bilgilerini alır.

 

CMD7 Komutu

Fonksiyon : unsigned char CMD7(unsigned int RCA_ADRESI)

Amacı : RCA adresi yazılan kartı seçer, diğerleri boşta durumuna geçerler

 

ACMD6 Komutu

Fonksiyon : unsigned char ACMD6()

Amacı : Veriyolu genişliğini 4 bit yapar.

 

CMD17 Komutu

Fonksiyon  : unsigned char CMD17(unsigned long ADRES)

Amacı : Tek blok okuması yapar

 

CMD18 Komutu

Fonksiyon : unsigned char CMD18(unsigned long ADRES)

Amacı : Çoklu okuma yapar

 

ACMD23 Komutu

Fonksiyon : unsigned char ACMD23(unsigned long BLOK_SAYISI)

Amacı : Çoklu yazma işleminden önce ön silme yapar.

 

CMD24 Komutu

Fonksiyon : unsigned char CMD24(unsigned long ADRES)

Amacı : Tek blok yazar

 

CMD25 Komutu

Fonksiyon : unsigned char CMD25(unsigned long ADRES)

Amacı : Çoklu blok yazar

 

ACMD22 Komutu

Fonksiyon : unsigned char ACMD22()

Amacı : Doğru yazılan blok sayısını verir

 

CMD32 Komutu

Fonksiyon : unsigned char CMD32( unsigned long ADRES)

Amacı : Silme işleminin başlangıç adresini bildirir

 

CMD33 Komutu

Fonksiyon : unsigned char CMD33(unsigned long ADRES)

Amacı : Silme işleminin bitiş adresini bildirir.

 

CMD38 Komutu

Fonksiyon : unsigned char CMD38()

Amacı : Silme işlemini gerçekleştirir.

 

CMD12 Komutu

Fonksiyon : unsigned char CMD12()

Amacı : Veri yazma ya da okumayı her koşulda durdurur.

 

CMD13 Komutu

Fonksiyon : unsigned char CMD13(unsigned int RCA_ADRESI)

Amacı : Kartın durumunu bildirir

 

CMD16 Komutu

Fonksiyon : unsigned char CMD16()

Amacı : Blok uzunluğunu 512 byte olarak kurar.

 

CMD56 Komutu

Fonksiyon : unsigned char CMD56(unsigned char ISLEV)

Amacı : İşlev 1 ise okuma yapar işlev 0 ise yazma yapar


SD Kart Hakkındaki Bilgi Tabloları

  • SD kart içerisinde kendi hakkında bilgilerini tuttuğu bölümler mevcuttur. SD kart yazılımı aktif edildiğinde otomatik olarak bu bilgileri okur ve gerekli olanları kullanır ancak tüm bilgiler kendilerine ayrılmış olan sabitlerde kalmaya devam eder. Kullanıcı isterse bu bilgileri okuyarak projeleri için faydalanabilir.
  • SD kart içerisinde 2 adet bilgi tablosu vardır
    1. CID : Kart kimlik bilgisi anlamına gelir. Kart hakkında üreticisi, seri numarası , üretim tarihi gibi bilgiler yer alır. Kütüphanemde  “unsigned int CID[8]” sabitin de kayıtlıdır. 128 bittir.
    2. CSD : Kart spesifik data anlamına gelir. Kartın yazma hızı,desteklediği voltajlar gibi bilgileri içerir. Kütüphanemde “unsigned int CSD[8] ” sabitin de kayıtlıdır. 128 bittir.
    3. Bu bilgi tablolarını anlayabilmek için aşağıdaki şablonları kullanarak gelen veriyi parçalayıp analiz etmeniz gerekmektedir.

1-CID Tablosu ( Card IDentification )

Adı Genişlik Bölge
Üretici Kimliği 8 bit [127:120]
OEM/Uygulama Kimliği 16 bit [119:104]
Ürün Adı 40 bit [103:64]
Ürün Revizyonu 8 bit [63:56]
Ürün Seri No 32 bit [55:24]
Rezerve Alan 4 bit [23:20]
Üretim Tarihi 12 bit [19:8]
CRC7 Kodu 7 bit [7:1]
Kullanım dışı daima 1 dir 1 bit [0:0]
  • Tablodaki verileri nasıl ele almamız gerektiğini basitçe inceleyelim
  • Üretici Kimliği : Kart üreticisini tanımlayan numaradır. Binary kodlarının decimal karşılığı olarak okunmalıdır. SD kart grubu her üreticiye bir sayı belirlemiştir bu sayı onun karşılığıdır.
  • OEM/Uygulama Kimliği : Sistemin Flash yada Rom kökenli olup olmadığını belirtir.2 adet ASCII karakteri(yani yazı karakteri her yazı karakteri bellekte 8 bit yer kaplar) gibi okunmalıdır.
  • Ürün Adı : Ürünün adını verir.  5 adet ASCII karakteri gibi okunmalıdır.
  • Ürün Revizyonu : Ürün üretiminden sonra yapılan revizyonu burada belirtir. Binary kodlarını 4 bit olarak ayırmak gerekir.    Örn: 0110 0010 binary kodu bir araya yazıldığında 98 e eşittir ama bu yanlıştır doğrusu 2 ye ayırmaktır. Yani 0110 = 6 , 0010 =2  o halde kartın verisyonu 6.2 dir.
  • Ürün Seri Numarası : Ürünün seri numarasını verir.
  • Rezerve Alan : SD kart grubunun ileride yapılacak genişleme ve değiştirmeler için ayırdığı alandır. Bu alanda okunan bilgilerin değeri ve anlamı yoktur.
  • Üretim Tarihi :  Kartın üretildiği tarihi verir.
    • Okunan veriyi 000000010100 binary olarak kabul edelim
    • [11:8] arası bize ay ‘ı verir. Yani buradaki desimal değer ayın numarasıdır.          Örn : 000000010100 = 4 yani Nisan ayı demektir.
    • [19:12] arası bize yıl ‘ ı verir. Yani buradaki desimal değer yılın numarasıdır.           Örn : 000000010100 = 1 yani 2001 yılı demektir. SD kartlar en erken 2000 yılında üretildiklerinden tarih geçmiş olarak en fazla 2000 olarak okunabilir öyle olsaydı veri şu şekilde olacaktı “000000000100“.
  • CRC7 Kodu : Komut gönderildiğinde SD kartın cevap ile beraber kontrol amaçlı gönderdiği crc kodudur. Kullanıcı için bir önemi ve değeri yoktur.
  • Kullanım Dışı : Daima 1 dir herhangi bir önemi yoktur.

 

2-CSD Tablosu ( Card-Specific Data )

Adı Orjinal Bölge İsimleri Genişlik Bölge
CSD Yapısı CSD_STRUCTURE 2 bit  [127:126]
Rezerve Alan 6 bit [125:120]
Veri Okuma Hızı -1 TAAC 8 bit  [119:112]
Veri Okuma Hızı – 2 CLK döngüleri NSAC 8 bit  [111:104]
Max. Data Transfer Oranı TRAN_SPEED 8 bit [103:96]
Kart Komut Sınıfı CCC 12 bit [95:84]
Max. Data Okuma Blok Genişliği READ_BL_LEN 4 bit [83:80]
Parça Blok Okuma Aktif READ_BL_PARTIAL 1 bit [79:79]
Hizasız Blok Yazma WRITE_BLK_MISIALIGN 1 bit [78:78]
Hizasız Blok Okuma READ_BLK_MISIALIGN 1 bit [77:77]
DSR Gömülü DSR_IMP 1 bit [76:76]
Rezerve Alan 2 bit [75:74]
Cihaz Boyutu C_SIZE 12 bit [73:62]
Max. Okuma Akımı @VDD min VDD_R_CURR_MIN 3 bit [61:59]
Max. Okuma Akımı @VDD max VDD_R_CURR_MAX 3 bit [58:56]
Max. Yazma Akımı @VDD min VDD_W_CURR_MIN 3 bit [55:53]
Max. Yazma Akımı @VDD max VDD_W_CURR_MAX 3 bit [52:50]
Cihaz Boyutu Çarpanı C_SIZE_MULT 3 bit [49:47]
Tek Blok Silme Etkin ERASE_BLK_EN 1 bit [46:46]
Silinebilir Sektör Boyutu SECTOR_SIZE 7 bit [45:39]
Yazma Korumalı Grup Boyutu WP_GRP_SIZE 7 bit [38:32]
 Yazma Korumalı Grup Etkin WP_GRP_ENABLE 1 bit [31:31]
Rezerve Alan 2 bit [30:29]
Yazma Hızı Faktörü R2W_FACTOR 3 bit [28:26]
Max. Yazılabilir Veri Blok Uzunluğu WRITE_BL_LEN 4 bit [25:22]
Parça Blok Yazma Aktif WRITE_BL_PARTIAL 1 bit [21:21]
Rezerve Alan 5 bit [20:16]
Dosya Format Grubu FILE_FORMAT_GRP 1 bit [15:15]
Kopya Bayrağı COPY 1 bit [14:14]
Kalıcı Yazma Koruması PERM_WRITE_PROTECT 1 bit [13:13]
Geçici Yazma Koruması TMP_WRITER_PROTECT 1 bit [12:12]
Dosya Formatı FILE_FORMAT 2 bit [11:10]
 Rezerve Alan 2 bit [9:8]
 CRC CRC 7 bit [7:1]
Kullanılmaz- Daima 1 1 bit [0:0]
  • CSD tablosu görüldüğü gibi oldukça uzun bir tablo. Kullanmadığım yada genelde hiç kullanılmayan çok parametre bulunmakta. Çünkü sistem içerisinde burada bulunan bilgileri başka yerden daha hızlı alma imkanı bulunmakta ama yine de kart hakkında detaylı bilgi için kullanmaktayız. Ben bildiklerimi ve çözmüş olduklarımı anlatırken , kullanmadığım ve bilmediklerimi datasheet inden anlamaya çalışarak yazacağım.
  • Bu tabloda özellikle FAT32 için hayati önem taşıyan kısımlar SD kartın boyutu ile ilgili kısımdı tabi ki siz farklı projelerde daha farklı verilerden faydalanabilirsiniz.
  • Tabloyu kısaca açıklamaya başlayalım.
  • CSD Yapısı (CSD_STRUCTURE): CSD nin hangi versiyona ait olduğunu belirtir.
  • Veri Okuma Hızı -1 (TAAC) : Kartın okuma hızını gösterir. Aşağıdaki tablodan bu bölge için ayrılan bit lerin nasıl okunması gerektiği ve ne anlama geldiği gösterilmiştir.
    Pozisyon Kod
    [2:0] Zaman Birimi
    0=1ns, 1=10ns, 2=100ns, 3=1µs, 4=10µs, 5=100µs, 6=1ms, 7=10ms
    [6:3] Zaman Değeri
    0=reserved, 1=1.0, 2=1.2, 3=1.3, 4=1.5, 5=2.0, 6=2.5, 7=3.0, 8=3.5, 9=4.0, A=4.5, B=5.0, C=5.5, D=6.0, E=7.0, F=8.0
    7 Rezerve Alan
  • Veri Okuma Hızı – 2 CLK döngüleri (NSAC): Veri erişimi için düşülebilecek en düşük hızı belirtir.( 100 döngü başına )
  • Max. Data Transfer Oranı (TRAN_SPEED): Aşağıdaki tabloda bir veri hattı başına ( yani tek data portu) düşen max. veri transfer hızını göstermektedir.
    Pozisyon Kod
    [2:0] Aktarım Hız Birimi
    0=100kbit/s, 1=1Mbit/s, 2=10Mbit/s, 3=100Mbit/s, 4… 7=reserved
    [6:3] Zaman Değeri
    0=reserved, 1=1.0, 2=1.2, 3=1.3, 4=1.5, 5=2.0, 6=2.5, 7=3.0, 8=3.5, 9=4.0, A=4.5, B=5.0, C=5.5, D=6.0, E=7.0, F=8.0
    7 Rezerve Alan
  • Kart Komut Sınıfı (CCC) : Kartın sahip olduğu komut sınıfını belirler. Aşağıdaki tabloda okunan verinin nasıl değerlendirileceği anlatılmıştır.
    CCC Biti Komut Sınıfı
    0 class 0
    1 class 1
    …..
    11 class 11
  • Max. Data Okuma Blok Genişliği (READ_BL_LEN): SD kartın tek seferde ne kadar büyüklükte bir blok okumaya izin verdiği bilgisini alır. SD kartlarda standart olarak daima 512 byte blok okuma ve yazmaya izin verir. Aşağıdaki tabloda farklı sonuçlar için okunabilecek değerler yazmaktadır.( Bu parametre tablodan göreceğiniz gibi 4 bittir. Değer olarak tabloda verilen bu 4 bit binary kodunun desimal karşılıklarıdır. Aldığınız veriyi bu şekilde değerlendirmelisiniz.)
    Değer Blok Genişliği
    0-8 Rezerve Alan
    9 29= 512 byte
     10  210=1024 byte
    11  211=2048 byte
    12-15  Rezerve Alan
  • Parça Blok Okuma Aktif (READ_BL_PARTIAL): Bloktan ufak parçaların okunması daima aktif olduğundan 1 olarak okunacaktır.
  • Hizasız Blok Yazma (WRITE_BLK_MISIALIGN): Eğer bu bölge;
    • 1 okunursa hizasız yazmaya izin vermektedir
    • 0 okunursa hizasız yazmaya izin vermemektedir.
    • Hizalı yazmayı da kısaca anlatacak olursa yukarıda blok boyutundan bahsetmiştik 512 byte olarak eğer bu blok baştan hizalı yazılmaz ise sonunda taşma olur ve bir kısmı diğer blok ‘ a taşar bazı SD kartlar buna izin vermez ve bunu gördüğünde hata verip yazmayı iptal eder. Bunun izin verilip verilmediği buradan anlaşılır.
  • Hizasız Blok Okuma (READ_BLK_MISIALIGN) : Eğer bu bölge;
    • 1 okunursa hizasız okumaya izin vermektedir
    • 0 okunursa hizasız okumaya izin vermemektedir.
  • DSR Gömülü (DSR_IMP) : SD kartın tablolarından biride DSR tablosudur. Güvenlikle ilgili bilgileri barındırır ancak bu tablo her SD kartta olmayabilir. Burada bu tablonun bulunup bulunmadığı denetlenir.
    DSR Bölgesi DSR Durumu
    0 DSR Tablosu Yoktur
    1 DSR Tablosu Vardır
  • Cihaz Boyutu (C_SIZE): Kart kapasitesi hesaplanması için kullanılır. Toplam kapasite hesabı aşağıdaki gibidir.
    • Hafıza Kapasitesi = BLOCKNR*BLOCK_LEN
    • BLOCKNR = (C_SIZE+1)*MULT
    • MULT = 2C_SIZE_MULT+2
    • BLOCK_LEN = 2READ_BL_EN
  • Okuma Akımı @VDD min / Yazma Akımı @VDD min (VDD_R_CURR_MIN, VDD_W_CURR_MIN) : En düşük voltajda yazma ve okuma yaparken çekeceği akım değerini verir.
    Okuma Akımı @VDD min
    Yazma Akımı @VDD min
    Kod
    [2:0] 0=0.5mA; 1=1mA; 2=5mA; 3=10mA; 4=25mA; 5=35mA; 6=60mA; 7=100mA
  • Okuma Akımı @VDD max / Yazma Akımı @VDD max  (VDD_R_CURR_MAX, VDD_W_CURR_MAX): En yüksek voltajda yazma ve okuma yaparken çekeceği akım değerini verir.
    Okuma Akımı @VDD max
    Yazma Akımı @VDD max
    Kod
    [2:0] 0=1mA; 1=5mA; 2=10mA; 3=25mA; 4=35mA; 5=45mA; 6=80mA; 7=200mA
  • Cihaz Boyutu Çarpanı (C_SIZE_MULT): SD kartın toplam hafızasını hesaplama işleminde kullanılan değeri verir.
    C_SIZE_MULT MULT
    0 22=4
    1 23=8
    2 24=16
    3 25=32
    4 26=64
    5 27=128
    6 28=256
    7 29=512
  • Tek Blok Silme Etkin (ERASE_BLK_EN) : 512 byte olarak veya daha ufak parçalar halinde silme işlemi yapılıp yapılamadığını denetler.
    • 1 ise parçalı silme yapar
    • 0 ise bütün silme yapar
  • Silinebilir Sektör Boyutu (SECTOR_SIZE) : Silinebilir sektör boyutunu verir.
    • 0 ise 1 blok silebilir
    • 127 ise 128 blok silebilir anlamındadır
  • Yazma Korumalı Grup Boyutu (WP_GRP_SIZE) : Korumalı sektör boyutunu verir. Yukarıdaki gibi gerçek boyut okunan değerin bir fazlasıdır.
  • Yazma Korumalı Grup Etkin (WP_GRP_ENABLE) : 0 değeri grup korumasının mümkün olmadığı anlamına gelir
  • Yazma Hızı Faktörü (R2W_FACTOR) :  Çoklu blok okuma hızının tespiti sağlar , yani daha önceki bölgelerde verilen değerler tablodaki değere bölünerek çoklu okuma hızı bulunur.
    R2W_FACTOR ÇOKLU OKUMA ERİŞİM SÜRESİ
    0 1
    1 2 ( okuduğunun yarısı hızda)
    2 4
    3 8
    4 16
    5 32
    6,7 Rezerve Alan
  • Max. Yazılabilir Veri Blok Uzunluğu (WRITE_BL_LEN) : SD kartın yazabileceği max. blok büyüklüğünü verir. SD kartlarda daima Yazılabilir Blok büyüklüğü ile Okunabilir blok büyüklüğü birbirine eşittir.
    WRITE_BL_LEN BLOK BÜYÜKLÜĞÜ
    [0:8] Rezerve Alan
    [9] 29=512 byte
    [10] 210=1024 byte
    [11] 211=2048 byte
    [12:15] Rezerve Alan
  • Parça Blok Yazma Aktif (WRITE_BL_PARTIAL) :Parçalı yada bütün 512 byte yazılıp yazılmayacağını denetler
    • 0 ise 512 byte blok halinde yazma yapılabilir
    • 1 ise 512 byte tan daha küçük parçalar halinde de yazılabilir
  • Dosya Format Grubu (FILE_FORMAT_GRP) : Seçilen dosya biçimlerini belirler.Dosya Formatı (FILE_FORMAT) ile beraber kullanılır.
  • Kopya Bayrağı (COPY) :Kart içeriğinin kopya olup olmadığını bildirir.
    • 0 ise orjinaldir
    • 1 ise kopyadır
  • Kalıcı Yazma Koruması (PERM_WRITE_PROTECT) : Kartın yazma koruması olup olmadığını denetler
    • 0 varsayılan değerdir yani koruma yoktur
    • 1 Tüm yazma silme işlemleri kalıcı olarak devre dışıdır.
  • Geçici Yazma Koruması (TMP_WRITER_PROTECT) : Kartın yazma koruması olup olmadığını denetler
    • 0 varsayılan değerdir yani koruma yoktur
    • 1 Tüm yazma silme işlemleri geçici olarak devre dışıdır.
  • Dosya Formatı (FILE_FORMAT) : Karttaki dosya biçimini belirler.
    FILE_FORMAT_GRP FILE_FORMAT  DOSYA TİPİ
    0 0 Bölüm Tablosu ile HDD Benzeri
    0 1 DOS FAT
    0 2 Evrensel Dosya Biçimi
    0 3 Diğer/Bilinmeyen
    1 0,1,2,3 Rezerve Alan
  • CSD tablosunun da sonuna geldik. Başta çok fazla karışık gelebilir ancak zamanla kullandıkça anlayacaksınız. Zaten bu tablolar bilgi amaçlıdır mutlaka kullanılması gerekmemektedir. Sadece kullanıcı farklı projeler yapacağı zaman bu bilgilere ihtiyaç duyabilir.

Fonksiyonların Uygulaması

  • Kullanıcı fonksiyonlarının nasıl kullanıldıklarını daha detaylı uygulayarak test edelim.
  • Yaptığımız işlemler sektörler seviyesinde olduğundan SD kartın sektörlerini görebilmemiz gerekir. Ben bunun için ücretsiz olan “WinHex” programını kullanıyorum.

 

1-Pin Tanımlamasının Yapılması

  • SD kart sürücü devremizi PIC in hangi portlarına bağladıysak bu bağlantıya uygun olarak tanımlamasını yapıyoruz. Böylece yazılım ve donanım uyumu sağlanmış oluyor. Örnek tanımlama aşağıdaki gibidir.
//sd kart
sbit SD_DATA0 at RB0_bit;
sbit SD_DATA1 at RB1_bit;
sbit SD_DATA2 at RB2_bit;
sbit SD_DATA3 at RB3_bit;
sbit SD_CLK at RB5_bit;
sbit SD_CMD at RB4_bit;


sbit SD_DATA0_Direction at TRISB0_bit;
sbit SD_DATA1_Direction at TRISB1_bit;
sbit SD_DATA2_Direction at TRISB2_bit;
sbit SD_DATA3_Direction at TRISB3_bit;
sbit SD_CLK_Direction at TRISB5_bit;
sbit SD_CMD_Direction at TRISB4_bit;

 

2- SD Kart Tanımlanması ve Kullanılmaya Hazır Hale Getirilmesi

  • Herzaman ilk olarak “SD_SDMOD_ANALIZ “fonksiyonu çağırılmalıdır. Bu fonksiyon temel ana fonksiyondur , SD kartın tüm içeriğini saptar düzenler ve SD kartı kullanıma hazır hale getirir.
void  main()
{
    ADCON1=7;//PIC ile ilgili port ayarıdır SD kart ile ilgisi yoktur
    CMCON=7;// PIC ile ilgili comparatorlerin kapatılmasını sağlar

    SAP1024_INIT(240,128,6);//projede kullanılacak GLCD kütüphanesi çağırma kodudur

    SD_SDMOD_ANALIZ(4);// SD kartı analiz eder ve kullanıma hazırlar. Burada 4 yazılarak 4 data portu kullanılacağı bildirilmiştir.

}

 

3- SD Kartın Sektörlerine Veri Yazılması

sd-kart-sektor-hakkinda-bilgi
SD kartın sektörleri hakkında bilgilendirme resmi
  • İlk olarak sektör yazma işlemine geçmeden önce sektör nedir nasıl okunmalıdır kısaca yukarıdaki resimden faydalanarak bakalım
  • Yukarıdaki resimde açık siyah olan böyle 1 sektör dür. Boyutu 512 bytettır. ( SD kartlarda daima 1 sektör 512 byte olur)
  • Altta hangi sektörde olduğumuz ve yanında toplam kaç adet sektör bulunduğu yazar zaten toplam sektör ile 512 byte i çarparsak SD kartın toplam kapasitesini bulmuş oluruz
  • Daha önceden anlatıldığı gibi veriler öncelikle SD_DATA_TAMPONU dizisine yüklenir. Bu dizi SD karta yazıldığında dizinin her elemanı yukarıdaki resimde gösterildiği gibi sırasıyla yazılır ve okunur. Verileri diziye yüklerken veya SD kart sektöründen veri okurken bunu göz önüne almalıyız.
  • Her dizi elemanı için 4 adet veri gözü seçilmesinin sebebi SD_DATA_TAMPONU dizisi Long tipindedir yani 32 bittir. Her veri gözü “00” 8 bit olduğundan bir dizi elemanı 4 adet veri gözü doldurur. “00 00 00 00” şeklinde.
  • Sektörler gösterilirken daima heksadesimal olarak gösterilir bu sebeple gördüğümüz her veriyi heksadesimal olarak değerlendirmeliyiz.
  • Sağda görülen boş beyaz alan ise sektördeki verilerin string karşılıklarıdır. Örneğin 1. satırın sonunda heksadesimal 41 ( 0x41) görülmektedir. Bunun string karşılığı ise” A “harfine denk gelir. (Eğer bu bölgeyi okumak isteseydik SD_DATA_TAMPONU[3] dizi elemanını okuyacaktık ve GLCD de 0x41 in desimal karşılığı olan 65 değeri okunacaktı)
  • Sektörler hakkında kısaca bilgi sahibi olduktan sonra sektör yazma komutu ile yine 4. sektöre “www.ercankoclar.com” yazdırmaya çalışacağım.
void  main()
{
   unsigned char denetim=120;

   ADCON1=7;
   CMCON=7;

   SAP1024_INIT(240,128,6);//glcd ekran tanımlama kodu 

   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0); // sd kart analizi 
   
   //data tamponuna veriler yükleniyor
   SD_DATA_TAMPONU[0]=0x7777772E;//www.
   SD_DATA_TAMPONU[1]=0x65726361;//erca
   SD_DATA_TAMPONU[2]=0x6E6B6F63;//nkoc
   SD_DATA_TAMPONU[3]=0x6C61722E;//lar.
   SD_DATA_TAMPONU[4]=0x636F6D20;//com 
   
   do{denetim=SD_MOD_TEK_BLOK_YAZ(4);}while(denetim==0); // 4. sektöre veri yazılır

   SAP1024_YAZI_YAZMA(1,1,"bitti");//GLCD ekranda bitti yazdırılır

}
  • Sonuca geçemeden önce yukarıdaki yazılımı inceleyelim
  • Denetim adında değişken tanımlandı ve rastgele bir değer verildi. Bu değişkenin amacı aşağıda göreceğiniz şekilde “SD_SDMOD_ANALIZ(4)” fonksiyonu için bir kontrol mekanizması oluşturuldu buna göre bu fonksiyon başarılı sonuç vermediği müddetçe tekrarlanacak aynı şekilde “SD_MOD_TEK_BLOK_YAZ(4)” fonksiyonuda kontrol mekanizmasına dahil edildi. SD kart fonksiyonlarını mutlaka  bir kontrol mekanizması içine koyarak çalıştırın çünkü SD kartlarında kendi içerisinde bir sistemi olduğundan her zaman ilk seferde doğru cevap vermiyor yada senkronizasyon sağlanamıyor bu sebeple fonksiyonları birden çok kez  çalıştırmak gerekebilir. Denetim değişkeni bu fonksiyonların doğru sonuçlanıp sonuçlanmadıklarını anlamak için kullanıldı.
  • SD_DATA_TAMPONU dizisinede yazdırmak istediğim karakterlerin heksadesimal ( desimal yada binary de yazabilirsiniz) karşılıklarını yazdım. Her satıra 4 karakter gelecek şekilde yazmamın sebebi ise dizi long tipinde yani 32 bittir, her karakter 8 bit olduğundan 1 dizi en fazla 4 karakter taşıyabilir. Bu sebeple her satırda 4 karakter vardır.( boşluk ta bir karakterdir ve heksadesimal karşılıgı 0x20 dir)
  • SAP1024_YAZI_YAZMA(1,1,”bitti”) bu fonksiyon benin “ GLCD Kütüphanemin” bir fonksiyonu yani GLCD kontrol etmemize yarıyor. Bunu buraya ekleyerek işlemin sona erdiğini anlayabiliyorum. Bunun yerine bir led koyarak işlem bittiğinde led in yanmasını da sağlayabilirsiniz.
sd-kart-sektor-veri-yazma-atık-veriler
SD kart sektöründeki atık veriler
  • Yukarıdaki resimde görüldüğü gibi verilerimiz düzgün şekilde yazılmışlar. Resimden de kontrol ederek SD_DATA_TAMPONU dizisi ile sektörde nerelere hangi sıra ile yazıldığını görebilirsiniz.
  • Sizin de dikkatinizi çekmiştir www.ercankoclar.com dan sonra anlaşılmaz halde bir çok veri yer almıştır halbuki biz böyle bir tanımlama yapmadık . Bunun sebebi şudur, PIC açıldığında ( bu tüm sistemler için aynıdır PC vs.) tüm ram gözlerine rastgele bir değer verir , eğer siz dizinin kalan elemanlarını sıfıra eşitlemezseniz o diziler ilk başta kendilerine rastgele verilen değerler ile çalışırlar.
  • O halde kodumuza ekleme yaparak temiz bir görüntü elde edelim.
void  main()
{
   unsigned char denetim=120,i;

   ADCON1=7;
   CMCON=7;

   SAP1024_INIT(240,128,6);//glcd ekran tanımlama kodu 

   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0); // sd kart analizi 
   
   //data tamponuna veriler yükleniyor
   SD_DATA_TAMPONU[0]=0x7777772E;//www.
   SD_DATA_TAMPONU[1]=0x65726361;//erca
   SD_DATA_TAMPONU[2]=0x6E6B6F63;//nkoc
   SD_DATA_TAMPONU[3]=0x6C61722E;//lar.
   SD_DATA_TAMPONU[4]=0x636F6D20;//com 

   //kullanılmayan tamponlar sıfıra eşitleniyor
   for(i=5;i<128;i++)
     {
       SD_DATA_TAMPONU[i]=0;
     }
   
   do{denetim=SD_MOD_TEK_BLOK_YAZ(4);}while(denetim==0); // 4. sektöre veri yazılır

   SAP1024_YAZI_YAZMA(1,1,"bitti");//GLCD ekranda bitti yazdırılır

}
  • Yazılıma bir for döngüsü ekledik. Dikkat ederseniz i=5 yaptım. Çünkü 0-4 arası diziler benim verilerimi taşıyor geri kalan ise temizlenmelidir. Toplamda 128 dizi olduğu için 128 e kadar (5-127) temizlendi.
  • Belki şunu düşünebilirsiniz neden en başta tüm diziyi temizlemedim , çünkü kullanılacak alanları temizlemek bizi fazladan zaman kaybına uğratacaktı. Bende kullanım dışında kalan artık bölgeleri temizleyerek zamandan kazanmış oldum.
  • Sonuç aşağıda görülebilir.
sd-kart-sektor-veri-yazma-temizlendi
Sektörün geri kalan kısmı artık verilerden temizlendi

4- SD Kartın Sektörlerinden Veri Okunması

  • SD kartta 4. sektörde yazdığımız veriyi SD_MOD_TEK_BLOK_OKUMA fonksiyonu ile okuyup sonucu GLCD de göreceğiz.
  • Ben GLCD olarak SAP1024B kullanıyorum ve bu ekranı da kendi kütüphanem ile kontrol ediyorum. İsterseniz sizde bunu yapabilir yada farklı ekranlar ile okunan veriyi görebilirsiniz.
  • Okuma işlemi yapılacaksa mutlaka devreniz de daha önce belirtilen IP4252CZ8 Pasif Filtre bulunmalıdır. Aksi halde okunan veri hatalı olacaktır. Ancak yaptığım denemelerde eğer başlangıçta 4 bit yerine 1 bit mod u seçerseniz okumanın pasif filtre olmadan da yüksek oranda başarılı olduğunu gördüm fakat bunun bir garantisi yoktur.
  • Şimdi SD kartımızın 4. sektöründe var olan veriyi okuyalım.
void  main()
{
  unsigned char denetim=120,i=0;
  unsigned char donusum[9];//mikroC nin standart dönüşüm kütüphanesi için oluşturuldu
    ADCON1=7;
    CMCON=7;

   SAP1024_INIT(240,128,6);

   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0);//SD kart analizi ve kurulumu yapıldı
   do{denetim=SD_MOD_TEK_BLOK_OKUMA(4);}while(denetim==0);// 4. sektör okundu ve data tamponuna yazıldı

   for(i=0;i<5;i++)// diziler sırası ile satır satır GLCD de yazdırılacak
     {
       LongWordToHex(SD_DATA_TAMPONU[i],donusum); //data tamponundaki veri heksadesimale çevrildi    
       SAP1024_YAZI_YAZMA(1,(i+1),donusum);// çevrilen veri GLCD de yazıldı
     }
}
  • Öncelikle GLCD lerde yada genel anlamda ekranlarda gercek sayısal değerler gözükmez. Bu sebeple bu değerleri string tipine çevirmemiz gerekir. Ben çevrim için mikroC nin standart çevrim kütüphanesini kullanarak okunan verileri heksadesimal olarak gözükecek şekilde çevirimini LongWordToHex fonksiyonu ile yaptım. Bu fonksiyonu kullanabilmek için 9 elemanlı bir char dizisi tanımlamamız gerekiyor.
  • SD kart analizinden sonra 4. sektörü okuttum ve buradaki veri SD_DATA_TAMPONU‘na yazılmış oldu.
  • for döngüsü ile 5 adet SD_DATA_TAMPONU dizisini (0-4) okutarak satır satır GLCD de yazdırdım.
  • Sonucu aşağıdaki fotoğraftan görelim.
sd-kart-sektor-okuma
SD kartın 4. sektöründen okunan veriler
  • Yukarıdaki fotoğrafta SD kartın 4. sektöründen okunan veri ve daha önceki bölümde yazılan veri görülmektedir.
  • Karşılaştırma yapıldığının ikisinin de aynı olduğu yani okumanın doğru yapıldığı görülmektedir.
  • SD kartın sektörüne yazdığımız “www.ercankoclar.com” verisini direkt yazı olarak nasıl göstereceğimizi örnekle açıklayalım.
void  main()
{
    unsigned char denetim=120,i=0,j=0,k=1;
    unsigned char txt[2];// okunan veriyi karakter olarak göstermek için oluşturuldu
    ADCON1=7;
    CMCON=7;

   SAP1024_INIT(240,128,6);

   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0);//SD kart analizi ve kurulumu yapıldı
   do{denetim=SD_MOD_TEK_BLOK_OKUMA(4);}while(denetim==0);// 4. sektör okundu ve data tamponuna yazıldı

   txt[1]=0;//karakter dizilerinde mutlaka son eleman 0 olmalıdır. Aksi halde hata verir 
            //çünkü string dizilerini sistem okurken sıfırı görene kadar okumaya devam eder

   //elimizde bulunan 32 bit veri 4 parçaya ayrılacak her parça tek tek GLCD de yazdırılacak 
   // yazıların üst üste gelmesini engellemek için her seferinde bir sütun kaydırılacak
   for(j=0;j<5;j++)
     {
       for(i=0;i<4;i++)
         {
           txt[0]=SD_DATA_TAMPONU[j]>>(24-(i*8));// data tamponu 32 bit olduğundan veriyi kaydırarak aktardım. 
           SAP1024_YAZI_YAZMA(k,1,txt);//karakterlerin üst üste gelmemesi için her seferinde bir sütun kaydırıldı
           k++;//sütun kaydırma değişkeni
         }
     }
}
  • Programın mantığı yukarıda anlatıldığı gibi 32 bit veriyi 4 parçaya ayırıp 8 bit olarak vermek .Ancak neden 32 bitten kaydırarak direk yazdıramıyoruz. Bunun sebebi veri tipinde saklı. SD_DATA_TAMPONU long tipindedir ancak yukarıda yaptığımız işlemi yapabilmek için veri tipinin char ( charcter) tipinde olması gerekiyor. Char tipide 8 bit olduğundan dolayı öncelikle veri 8 bitlik parçalara bölünür char tipindeki değişkene atanır.
  • txt[1]=0 ın amacı string dizilerinde sistem ilk elemandan başlayarak okur sıfırı görene kadar dizi sonuna geldiğini anlayamaz ve hata verir. Bu sebeple buraya sıfır koyarak sisteme dizinin sonuna geldiğini bildirmiş oluyoruz.
  • for döngüsünede değinecek olursak her SD_DATA_TAMPONU elemanı 4 parçaya ayrılıyor ardından sonraki diziye geçiyor bu sebeple iç içe for döngüsü kullandım.
  • SD kartın sektöründeki veriyi karakter olarak yazdırma mantığı bu şekildedir sonuç aşağıdaki fotoğrafta görülmektedir.
  • Fotoğraftada aktarım mantığı anlatılmıştır. Bütüm veri parçalanır ve parçalar sırası ile uygun veri tipi ile GLCD ye gönderilir her gönderimde 1 sütun kaydırılır böylece karakterler üst üste binmez ve istenilen sonuç elde edilir.
sd-kart-sektor-okuma-yazi
SD kartın sektöründeki verinin karakter olarak okunması

5- SD Kartın Sektörlerindeki Verinin Silinmesi

  • SD kartın 4. sektörüne yazdığımız veriyi SD_MOD_SEKTOR_SIL fonksiyonu ile sileceğiz.
  • Silme işlemi sektör boyutunda olduğu için kalıcı bir silem işlemidir asla geri getirilemez.
  • Sektör silme işlemi için kullanacağımız kodu inceleyelim
void  main()
{
  unsigned char denetim=120;
    ADCON1=7;
    CMCON=7;

   SAP1024_INIT(240,128,6);

   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0);//SD kart analizi ve kurulumu yapıldı
   do{denetim=SD_MOD_SEKTOR_SIL(4,4);}while(denetim==0);// 4. sektör silindi
   
   SAP1024_YAZI_YAZMA(1,1,"bitti");//GLCD ekranda bitti yazdırılır
}
  • SD_MOD_SEKTOR_SIL fonksiyonu ile silme işlemi gerçekleştirildi. Bu fonksiyon silinecek sektörün başlangıç ve bitiş adreslerini istemektedir. Eğer tek sektör silinecekse başlangıç ve bitiş adresine aynı sektör numarası yazılır.
  • Sonuç aşağıdaki resimde görülebilir.
sd-kart-sektor-silme
SD kartın 4. sektöründe bulunan veri silidi

SD Kart Sonuç

  • SD kartların kullanımı için gerekli sürücü devresini kurarak SD kartlarda sektör boyutunda işlem yapmayı da öğrendiniz.
  • Sektör boyutunda veri yazılsa da SD kartın için girdiğimizde bu verileri göremeyiz ve okuyamayız. Herhangi bir şekilde dosya oluşturamayız.
  • Sizde sadece sektörlere veri yazmakla yetinmeyip “Dosya Sistemine” geçmek istiyorsanız aşağıda FAT32 dersi ile devam edin.
  • SD kartın çalışma mantığı bu kadar şimdi dersimizin 2. bölümüne FAT32 ye geçebiliriz.

FAT32 Dosya Sistemi

  • FAT32 dosya sistemine geçmeden önce ilk olarak disklerin sahip olduğunu sistemi temel olarak görelim.
fat32-disk-sistemi
Temel Disk Sistemi
  • Yukarıdaki resim de görüldüğü gibi tüm diskler benzer sisteme sahiptir.
  • Buna göre bir diskin ( depolama aracı) en küçük yapı taşı “sektör” lerdir.
  • Sektörler birleşerek “Cluster” ları oluşturur.
  • Clusterlerde bir araya gelerek diski oluşturur.
  • Tamamen iç içe geçmiş bir sistemdir.
  • SD kartlarda 1 sektör daima 512 bytet tır. Ancak cluster boyutu o kartı formatlarken yaptığımız seçime göre değişir.
fat32-cluster-secimi
Cluster Boyutu Seçimi
  • Yukarıda görüldüğü gibi cluster boyutunu format atarken seçeriz.
  • Cluster boyutu diskin nasıl parçalanacağını belirler. FAT32 dosya sisteminde cluster boyutu ne kadar büyük olursa olsun en basit bir text dosyası dahi açsanız hemen ona 1 adet cluster atanır. Yani dosya boyutu 1byte dahi olsa en az 8192 byte alan ayrılmış olur. Buna göre en küçük clusteri seçmek disk alanını daha verimli kullandırırken büyük dosyalarda ise okumada yavaşlık yaratmaktadır.
  • Çalışmada Cluster numarası derken sektörleri kapsayan bir bütün yapı olduğunu unutmayın sektörler clusterları meydana getirmektedir.
  • Şimdi basitçe FAT32 dosya sistemini görelim
fat32-sistemi-sema
Fat32 sisteminin şematik görüntüsü
  • FAT32 sistemi temel olarak 3 bölümden oluşur;
    1. Boot Sektör : Disk takıldığında ilk olarak bu bölüm okunur. Sistem diskin herhangi bir dosya sistemine sahip olup olmadığını burada denetler. Buradan disk hakkında ;
      • Sektör başına düşen byte miktarını
      • Cluster başına düşen sektör miktarını
      • Rezerve sektör miktarını
      • Kaç adet FAT bölgesi olduğunu
      • Toplam Sektör sayısını öğrenir. Ancak daha farklı birçok parametre olsa da çoğu SD karta uygun olmayan parametrelerdir. Bu bölgedeki tüm bu bilgi verileri toplamda 32 byte olduğundan dolayı FAT32 denmektedir.
    2. FAT Bölgesi : Genelde FAT1 ve yedeği FAT2 olarak 2 adet bulunur. Diskte bir dosya oluşturulduğunda hemen bu bölgeden bir cluster o dosyaya tahsis edilir. Bu dosya eğer 1 clusteri aşan bir boyuta gelirse otomatik olarak yeni bir cluster daha verilir. Her cluster numarası tabloda 32 bit olarak saklanır ve kendinden sonraki clusterin numarasını verir. Böylece sistem büyük dosyaların devamını doğru olarak takip ederek okur. En son clustere gelindiğinde EOF işareti koyarak ( End Of File) dosyanın sona erdiğini gösterir.
    3. Root Bölgesi : Bu bölgede öncelikle diski biçimlendirirken verdiğimiz isim yer alır. Diskte oluşturulan her dosya veya klasörün ismi ve diğer bilgileri ( cluster numarası gibi) burada yer alır. FAT32 sisteminde  tüm root bölgesi tek tek tarandıktan sonra yeni dosyayı oluşturur. Bir süre sonra dosya sayısındaki artış aşırı yavaşlamaya sebep olur. Bu sebeple FAT32 sisteminde klasörler içerisine gruplandırarak dosya oluşturmak sistemin hızını arttıracaktır.
  • FAT32  2TB a kadar olan diskleri destekler.

FAT32 Dosya Sistemi Yazılımı

  • İlk olarak alan açısından sizede PIC18F4620 kullanmanızı öneririm. Çünkü FAT32 işlemleri oldukça yer kaplamaktadır.
  • FAT32 yazılım SD kart ile tam uyumlu yazıldığından fazladan herhangi birşey yüklemenize veya devre kurmanıza gerek yoktur.
  • Yazılımda FAT32 ye dair sadece uzun dosya ismi desteği yoktur. Bunun sebebi PIC in kapasitesini gereksiz yere harcamamak içindir, ancak ileride eklenebilir.
  • Yazılımda kullandığım bazı sabitler bulunmaktadır. Bu sabitler belli işlemlerde kullanılmak üzere oluşturuldu. Buradan isimlerini öğrenebilirsiniz çünkü aynı isem sahip değişken tanımlamanıza MikroC izin vermeyecektir.
    • unsigned long SD_FAT32_SEKTOR : Dosya seçme fonksiyonunda kullanılır
    • unsigned long SD_FAT32_CLUSTER :  seç fonksiyonunda kullanılır
    • unsigned long SD_FAT32_DOSYA_KONUM_SEKTOR : Dosya konumlandırma fonksiyonunda kullanılır
    • unsigned int SD_FAT_32_KOK_DIZIN : Root bölgesidir aynı zamanda bu bölgenin bilgisini tutar
    • unsigned char SD_FAT32_DIZI : Dosya seçme fonksiyonunda kullanılır
    • unsigned char SD_FAT32_DOSYA_ICERIK_DIZI : Dosya içerik işlemlerinde kullanılır
    • unsigned char SD_FAT32_SON_KALINAN_BIT_SAYISI : Dosya içerik işlemlerinde kullanılır
fat32-faydanilan-kaynaklar
FAT32 kütüphanesi yazarken faydalandığım yerli ve yabancı kaynakların bir kısmı . Tamamı ders sonunda paylaşılacaktır.

Fonksiyonlar

  • Bu bölümde fonksiyonları tek tek ele alacağım.
  • Kullanıcı fonksiyonlarının başlıkları yeşil , sistem fonksiyonlarının başlıkları ise kırmızı yazılacaktır.

1- Başlangıç Analiz ve Format Fonksiyonları

 

SD_FAT32_INIT Fonksiyonu

Fonksiyon : unsigned char SD_FAT32_INIT()

Amacı : SD kartı okuyarak format atılmasına gerek olup olmadığını denetler

Parametreler : Bulunmuyor

Kullanım Şekli :

SD_FAT32_INIT();//SD kartı okuyarak karta format atılıp atılmaması gerektiğini belirler

Geri Bildirim :

  • 0 ise karta format atılmalıdır
  • 1 ise format atmaya gerek yoktur
  • Kullanıcı fonksiyonudur

 

SD_FAT32_FORMAT Fonksiyonu

Fonksiyon : unsigned char SD_FAT32_FORMAT(unsigned char DISK_ETIKETI[11])

Amacı :

  • SD karta format atarak FAT32 sistemine uygun hale getirir.
  • Diskteki tüm veri silinir. Derinlemesine format atar geri dönüşü yoktur

Parametreler :

  • DISK_ETIKETI[11]
    • SD karta verilecek isim belirlenir.
    • Türkçe karakter destekler
    • 11 karakterlik isim verilebilir

Kullanım Şekli :

SD_FAT32_FORMAT("eşröç      ");// Formatlanıp isim verilir Türkçe karakterleri destekler

Geri Bildirim :

  • 1 ise başarılı olmuştur
  • Kullanıcı fonksiyonudur

 

2- Hesaplama Fonksiyonları

  • Tamamı sistem fonksiyonudur . Sadece bilgi amaçlı verilmiştir.
  • Bu fonksiyonlar çağırmak sistemde bozukluğa sebep olabilir

2A- Genel Hesap Fonsksiyonları

 

SD_FAT32_TOPLAM_SEKTOR_SAYISI Fonksiyonu

Fonksiyon : unsigned long SD_FAT32_TOPLAM_SEKTOR_SAYISI()

Amacı : SD kartta bulunan toplam sektör sayısını hesaplar

Parametreler : Bulunmuyor

Kullanım Şekli :

SD_FAT32_TOPLAM_SEKTOR_SAYISI();//SD kartta bulunan sektörlerin sayısını hesaplar

Geri Bildirim :

  • Hata bildirimi bulunmaz
  • Sektör sayısını geri bildirir
  • Sistem fonksiyonudur

 

SD_FAT32_KOKDIZIN Fonksiyonu

Fonksiyon : void SD_FAT32_KOKDIZIN()

Amacı : SD kartın kök dizinini hesaplar

Parametreler : Bulunmuyor

Kullanım Şekli :

SD_FAT32_KOKDIZIN();//SD kartın data başlangıç sektörünü hesaplar ve bu aynı zamanda kök dizin numarasıdır

Geri Bildirim :

  • Geri bildirimde bulunmaz
  • Sistem fonksiyonudur

 

SD_FAT32_BPB_FATSz32 Fonksiyonu

Fonksiyon : unsigned int SD_FAT32_BPB_FATSz32()

Amacı : FAT bölgesi başına düşen sektör sayısını hesaplar

Parametreler : Bulunmuyor

Kullanım Şekli :

SD_FAT32_BPB_FATSz32();//FAT Basına düşen sektör sayısı

Geri Bildirim :

  • Hata bildirim yapmaz
  • Sektör sayısını geri döndürür
  • Sistem fonksiyonudur

 

BPB_RsvdSecCnt Fonksiyonu

Fonksiyon : unsigned int BPB_RsvdSecCnt()

Amacı : Rezerve sektörleri hesaplar

Parametreler : Bulunmuyor

Kullanım Şekli :

BPB_RsvdSecCnt();

Geri Bildirim :

  • Hata bildirimi yapmaz
  • Rezerve sektör sayısını geri bildirir
  • Sistem fonksiyonudur

 

SD_FAT32_BOS_CLUSTER_SAYISI Fonksiyonu

Fonksiyon : unsigned int SD_FAT32_BOS_CLUSTER_SAYISI()

Amacı : Boş cluster sayısını hesaplar

Parametreler : Bulunmuyor

Kullanım Şekli :

SD_FAT32_BOS_CLUSTER_SAYISI();//FSI_Free_Count- Boş olan cluster sayısını hesaplar

Geri Bildirim :

  • Hata bildirimi yapmaz
  • Boş cluster sayısını geri döndürür
  • Sistem fonksiyonudur

 

SD_FAT32_SD_ID Fonksiyonu

Fonksiyon : unsigned long SD_FAT32_SD_ID()

Amacı : SD kartın ID numarasını okur

Parametreler : Bulunmuyor

Kullanım Şekli :

SD_FAT32_SD_ID();//BS_VOLID - SERINUMARASI OKUMA

Geri Bildirim :

  • Hata bildirimi yapmaz
  • Seri numarasını geri döndürür
  • Sistem fonksiyonudur

 

2B- FAT Bölgesi Hesap Fonksiyonları

 

FAT_BOLGE_DUZENLEME Fonksiyonu

Fonksiyon : unsigned int FAT_BOLGE_DUZENLEME(unsigned int BASLANGIC_CLUSTER_NUMARASI)

Amacı : FAT bölgesinde boş ve dolu yerleri tespit eder gerekli düzenlemeyi yapar

Parametreler :

  • BASLANGIC_CLUSTER_NUMARASI : Taramanın başlayacağı cluster numarası girilir

Kullanım Şekli :

FAT_BOLGE_DUZENLEME(100);

Geri Bildirim : 

  • Hata bildirimi yapmaz
  • Sistem Fonksiyonudur

 

FAT_BOLGE_OKUYUCU Fonksiyonu

Fonksiyon : unsigned int FAT_BOLGE_OKUYUCU(unsigned int BASLANGIC_CLUSTER_NUMARASI)

Amacı : Verilen cluster numarasından itibaren tüm clusterleri takip ederek okur ve numaralarını geri döndürür.

Parametreler :

  • BASLANGIC_CLUSTER_NUMARASI : Taramanın başlayacağı cluster numarası girilir

Kullanım Şekli :

FAT_BOLGE_OKUYUCU(100);

Geri Bildirim : 

  • Hata bildirimi yapmaz
  • Sistem Fonksiyonudur

 

FAT_BOLGE_SILICI Fonksiyonu

Fonksiyon : unsigned char FAT_BOLGE_SILICI(unsigned int BASLANGIC_CLUSTER_NUMARASI)

Amacı : Verilen başlangıç clusterından kuyruğu takip ederek sırayla tüm clusterları siler

Parametreler :

  • BASLANGIC_CLUSTER_NUMARASI : Taramanın başlayacağı cluster numarası girilir

Kullanım Şekli :

FAT_BOLGE_SILICI(100);

Geri Bildirim : 

  • Hata bildirimi yapmaz
  • Sistem Fonksiyonudur

 

FAT_SON_BOLGE_BULUCU Fonksiyonu

Fonksiyon : unsigned long FAT_SON_BOLGE_BULUCU(unsigned int BASLANGIC_CLUSTER_NUMARASI)

Amacı : Verilen cluster numarasını takip eder en son cluster numarasını geri döndürür. Dosya sonuna gitme işlemi için kullanılır

Parametreler :

  • BASLANGIC_CLUSTER_NUMARASI : Taramanın başlayacağı cluster numarası girilir

Kullanım Şekli :

FAT_SON_BOLGE_BULUCU(100);

Geri Bildirim : 

  • Hata bildirimi yapmaz
  • Son cluster numarasını geri döndürür
  • Sistem Fonksiyonudur

 

FAT_BOLGE_TAYIN_EDICI Fonksiyonu

Fonksiyon : void FAT_BOLGE_TAYIN_EDICI()

Amacı : Dosya oluşturulduğunda dosyaya ilk cluster bölgesini tayin eder

Parametreler : Bulunmuyor

Kullanım Şekli :

FAT_BOLGE_TAYIN_EDICI();

Geri Bildirim :

  • Hata bildirimi yapmaz
  • Sistem Fonksiyonudur

 

FAT_BOLGE_TAYIN_EDICI_KLASOR Fonksiyonu

Fonksiyon : unsigned long FAT_BOLGE_TAYIN_EDICI_KLASOR()

Amacı : Yeni klasör için cluster yeri bulur ve o bölgeye EOC işareti bırakır

Parametreler : Bulunmuyor.

Kullanım Şekli :

FAT_BOLGE_TAYIN_EDICI_KLASOR();

Geri Bildirim : 

  • Hata bildirimi yapmaz
  • Bulduğu boş cluster numarasını geri döndürür.
  • Sistem Fonksiyonudur

3- Dosya İşlem Fonksiyonları

  • Yeni dosya oluşturma, dosya içeriğini değiştirme, dosya silme gibi işlemler bu fonksiyonlar aracılığı ile yapılır. Çoğunluğu kullanıcı fonksiyonlarıdır.

 

SD_FAT32_DOSYA_OLUŞTUR Fonksiyonu

Fonksiyon : unsigned char SD_FAT32_DOSYA_OLUSTUR(unsigned char DOSYA_ADI[11])

Amacı : Yeni dosya oluşturmak

Parametreler :

  • DOSYA_ADI[11] : Oluşturulacak dosyanın adı ve uzantısı yazılır isim için 8 karakter uzantı için 3 karakter kullanılır . Ör : DOSYA_ADI[“ERCAN   TXT”] isim 8 karakterden küçükse mutlaka boşluk ile 8 e tamamlanmalıdır. Daima büyük harfle Türkçe karakter kullanmadan isim verilmelidir.

Kullanım Şekli :

SD_FAT32_DOSYA_OLUSTUR("ERCAN   TXT");

Geri Bildirim :

  • 1 dönmüş ise başarılıdır.
  • 255 dönmüş ise dosya varyasyonu 99 a ulaşmış demektir. ( uygulamada detaylı anlatılacak)
  • Kullanıcı fonksiyonu

 

SD_FAT32_DOSYA_SEC Fonksiyonu

Fonksiyon : unsigned char SD_FAT32_DOSYA_SEC(unsigned char DOSYA_ADI[11])

Amacı : İşlem yapılacak dosyayı seçer

Parametreler :

  • DOSYA_ADI[11] : Oluşturulacak dosyanın adı ve uzantısı yazılır isim için 8 karakter uzantı için 3 karakter kullanılır . Ör : DOSYA_ADI[“ERCAN   TXT”] isim 8 karakterden küçükse mutlaka boşluk ile 8 e tamamlanmalıdır. Daima büyük harfle Türkçe karakter kullanmadan isim verilmelidir.

Kullanım Şekli :

SD_FAT32_DOSYA_SEC("ERCAN   TXT");

Geri Bildirim :

  • 1 dönmüş ise başarılıdır.
  • Kullanıcı fonksiyonu

 

SD_FAT32_DOSYA_KLASOR_SIL Fonksiyonu

Fonksiyon : void SD_FAT32_DOSYA_KLASOR_SIL()

Amacı : Seçilmiş olan dosya veya klasörü siler

Parametre : Bulunmuyor

Kullanım Şekli :

SD_FAT32_DOSYA_KLASOR_SIL();

Geri Bildirim :

  • Hata bildirimi yapmaz
  • Kullanıcı fonksiyonudur

 

SD_FAT32_DOSYA_YENIDEN_ADLANDIR Fonksiyonu

Fonksiyon : unsigned char SD_FAT32_DOSYA_YENIDEN_ADLANDIR(unsigned char DOSYA_ADI[11])

Amacı : Seçilen dosyayı yeniden adlandırır

Parametre :

  • DOSYA_ADI[11] : Oluşturulacak dosyanın adı ve uzantısı yazılır isim için 8 karakter uzantı için 3 karakter kullanılır . Ör : DOSYA_ADI[“ERCAN2  TXT”] isim 8 karakterden küçükse mutlaka boşluk ile 8 e tamamlanmalıdır. Daima büyük harfle Türkçe karakter kullanmadan isim verilmelidir.

Kullanım Şekli :

SD_FAT32_DOSYA_YENIDEN_ADLANDIR("ERCAN2  TXT");

Geri Bildirim :

  • 1 dönmüş ise başarılıdır.
  • Kullanıcı fonksiyonu

 

SD_FAT32_DOSYA_SONUNA_GIT Fonksiyonu

Fonksiyon : void SD_FAT32_DOSYA_SONUNA_GIT()

Amacı : Seçilen dosyanın içeriğinde sonuna gider.

Parametre : Bulunmuyor.

Kullanım Şekli :

SD_FAT32_DOSYA_SONUNA_GIT();

Geri Bildirim :

  • Hata bildirimi yapmaz
  • Kullanıcı fonksiyonudur

 

SD_FAT32_DOSYA_BASINA_GIT Fonksiyonu

Fonksiyon : void SD_FAT32_DOSYA_BASINA_GIT()

Amacı : Seçilen dosya içeriğinin en başına gider.

Parametre : Bulunmuyor.

Kullanım Şekli :

SD_FAT32_DOSYA_BASINA_GIT();

Geri Bildirim :

  • Hata bildirimi yapmaz
  • Kullanıcı fonksiyonudur

 

SD_FAT32_DOSYA_TARIH_SAAT_AYARLA Fonksiyonu

Fonksiyon : unsigned char SD_FAT32_DOSYA_TARIH_SAAT_AYARLA(unsigned int YIL,unsigned short AY,unsigned short GUN,unsigned char SAAT,unsigned char DAKIKA )

Amacı : Dosyanın tarihini ve saatini ayarlar . FAT32 sistemi gereği dosya yılı 1980 den geriye gidemez.

Parametre :

  • YIL : Yıl rakam ile yazılır  – 2017 gibi
  • AY : Ay rakamla yazılır – 10 gibi
  • GUN : Gün rakamla yazılır – 1 ( pazartesi ) gibi
  • SAAT : 24 saat esasına göre yazılır – 23 gibi ( akşam 11)
  • DAKIKA :  24 saat esasına göre yazılır – 59 gibi ( 59 dakika)

Kullanım Şekli :

SD_FAT32_DOSYA_ERISIM_TARIH_SAAT_AYARLA(2017,10,6,21,10);// 10 Ekim 2017 saat 21:10

Geri Bildirim :

  • 255 dönmüş ise yazma işleminde hata oluşmuştur
  • Kullanıcı fonksiyonudur

 

SD_FAT32_DOSYA_DEGISIM_TARIH_SAAT_AYARLA Fonksiyonu

Fonksiyon : unsigned char SD_FAT32_DOSYA_DEGISIM_TARIH_SAAT_AYARLA(unsigned int YIL,unsigned short AY,unsigned short GUN,unsigned char SAAT,unsigned char DAKIKA )

Amacı : Dosyanın son değişim tarihini değiştirir.

Parametre :

  • YIL : Yıl rakam ile yazılır  – 2017 gibi
  • AY : Ay rakamla yazılır – 10 gibi
  • GUN : Gün rakamla yazılır – 1 ( pazartesi ) gibi
  • SAAT : 24 saat esasına göre yazılır – 23 gibi ( akşam 11)
  • DAKIKA :  24 saat esasına göre yazılır – 59 gibi ( 59 dakika)

Kullanım Şekli :

SD_FAT32_DOSYA_DEGISIM_TARIH_SAAT_AYARLA(2017,10,6,21,10);// 10 Ekim 2017 saat 21:10

Geri Bildirim :

  • 255 dönmüş ise yazma işleminde hata oluşmuştur
  • Kullanıcı fonksiyonudur

 

SD_FAT32_DOSYA_LISTELEME Fonksiyonu

Fonksiyon : unsigned char SD_FAT32_DOSYA_LISTELEME(unsigned int DOSYA_NO)

Amacı : Dizinde bulunan dosyaların ;

  • Dosya Adı
  • Dosya Oluşturma Tarihi
  • Dosya Oluşturma Zamanı
  • Dosya Boyutunu listeler istenirse hepsi veya bir tanesi seçilebilir detayı uygulama kısmında anlatılacak.

Parametre :

  • DOSYA_NO : Dizinde hangi dosyanın listeleneceğini belirtir. Eğer birden fazla alt alta listeleme isteniyorsa bu fonksiyon for döngüsüne alınır. Zaten fonksiyon yapısı gereği silinen dosyaları görmez ve sona geldiğini anlayarak hata kodu gönderir.
  • Ayrıca kütüphanede bu fonksiyon ile bağlantılı DOSYA_BILGILERI adında yapı tanımlanmıştır.

Kullanım Şekli :

for(i=0;i<10;i++)
   {
     if(SD_FAT32_DOSYA_LISTELEME(i)!=255)
       {
        SAP1024_YAZI_YAZMA(1,(i+2-x),(YDosya_Bilgileri.dosya_adi));
        SAP1024_YAZI_YAZMA(15,(i+2-x),(YDosya_Bilgileri.dosya_olusturma_tarih));
        SAP1024_YAZI_YAZMA(26,(i+2-x),(YDosya_Bilgileri.dosya_olusturma_zaman));
        SAP1024_YAZI_YAZMA(31,(i+2-x),(YDosya_Bilgileri.dosya_boyutu));

       }
   }//not: detayı uygulama bölümüne anlatılacak !!!!

Geri Bildirim :

  • 255 dönmüş ise silinmiş dosya vardır yada dosyaların sonuna gelinmiştir.
  • Kullanıcı fonksiyonudur.

 

SD_FAT32_DOSYA_LISTELEME_SONLANDIR Fonksiyonu

Fonksiyon : void SD_FAT_32_DOSYA_LISTELEME_SONLANDIR()

Amacı : Listeleme işlemini sonlandırmak için kullanılır.

Parametre : Bulunmuyor

Kullanım Şekli : 

SD_FAT_32_DOSYA_LISTELEME_SONLANDIR();

Geri Bildirim:

  • Hata bildiriminde bulunmaz
  • Kullanıcı fonksiyonudur

 

SD_FAT32_DOSYA_VERI_YAZ Fonksiyonu

Fonksiyon : unsigned char SD_FAT32_DOSYA_VERI_YAZ()

Amacı : Veriyi ( SD_DATA_TAMPONuna yüklenmiş olan – SD karttan hatırlayın) seçilmiş olan dosyanın içerisine yazar.

Parametre : Bulunmuyor

Kullanım Şekli :

SD_DATA_TAMPONU[0]=0X47DC4C41;
SD_DATA_TAMPONU[1]=0X59000000;
SD_DATA_TAMPONU[2]=0;

SD_FAT32_DOSYA_VERI_YAZ();

Geri Bildirim :

  • 1 dönmüş ise yazma başarılıdır
  • Kullanıcı fonksiyonu

 

SD_FAT32_DOSYA_VERI_OKU Fonksiyonu

Fonksiyon : void SD_FAT32_DOSYA_VERI_OKU(unsigned long DOSYA_SEKTOR_SAYISI)

Amacı : Dosyadan sektör bazında veri okur çünkü SD_DATA_TAMPONU 512 byte ttır bu da 1 sektöre denk gelir.

Parametre :

  • DOSYA_SEKTOR_SAYISI : Seçilen dosyanın kaçıncı sektörünün okunacağını seçer. Örneğin sıfır değeri verilirse seçilen dosyanın ilk sektörünü okur.
  • Not : Eğer tüm dosya içeriği okunmak isteniyorsa dosyanın toplam boyutu  512 byte ‘a bölünür ve kaç sektör olduğunu tespit edilir. Detaylar uygulamada anlatılacaktır.

Kullanım Şekli :

SD_FAT32_DOSYA_VERI_OKU(0);//seçili dosyanın ilk sektörünü okur

Geri Bildirim :

  • Hata bildiriminde bulunmaz
  • Kullanıcı fonksiyonudur

 

4- Klasör İşlem Fonksiyonları

 

SD_FAT32_KLASOR_OLUSTUR Fonksiyonu

Fonksiyon : unsigned char SD_FAT32_KLASOR_OLUSTUR(unsigned char KLASOR_ADI[8])

Amacı : Klasör oluşturur

Parametre :

  • KLASOR_ADI[8] : Oluşturulacak klasörün adı 8 karakter olarak yazılır.

Kullanım Şekli :

SD_FAT32_KLASOR_OLUSTUR("ERCAN5  ");

Geri Bildirim :

  • 1 dönmüş ise yazma başarılıdır
  • Kullanıcı fonksiyonu

 

SD_FAT32_KLASOR_ICERIK_YAZMA Fonksiyonu

Fonksiyon : void SD_FAT32_KLASOR_ICERIK_YAZMA(unsigned long CLUSTER_SAYISI)

Amacı : SD_FAT32_KLASOR_OLUSTUR fonksiyonu içerisinde kullanılır. Klasör hakkında bilgileri sisteme yazar

Parametre :

  • CLUSTER_SAYISI : Klasöre atanan clusterin sayısıdır

Kullanım Şekli :

SD_FAT32_KLASOR_ICERIK_YAZMA(YEREL_CLUSTER);

Geri Bildirim :

  • Hata bildiriminde bulunmaz
  • Sistem fonksiyonudur

 

SD_FAT32_KLASOR_SEC Fonksiyonu

Fonksiyon : unsigned char SD_FAT32_KLASOR_SEC(unsigned char KLASOR_ADI[8])

Amacı : İşlem yapılacak klasörü seçer

Parametre :

  • KLASOR_ADI[8] : Seçilecek klasörün adı 8 karakter olarak yazılır.

Kullanım Şekli :

SD_FAT32_KLASOR_SEC("ERCAN1 ");

Geri Bildirim :

  • 1 dönmüş ise yazma başarılıdır
  • Kullanıcı fonksiyonu

 

SD_FAT32_KLASOR_YENIDEN_ADLANDIR Fonksiyonu

Fonksiyon : unsigned char SD_FAT32_KLASOR_YENIDEN_ADLANDIR(unsigned char KLASOR_ADI[8])

Amacı : Seçilen klasörü yeniden adlandırır.

Parametre :

  • KLASOR_ADI[8] : Klasörün yeni adı 8 karakter olarak yazılır.

Kullanım Şekli :

SD_FAT32_KLASOR_YENIDEN_ADLANDIR("ERCAN9 ");

Geri Bildirim :

  • 1 dönmüş ise yazma başarılıdır
  • Kullanıcı fonksiyonu

 

SD_FAT32_KOK_DIZINE_GIT Fonksiyonu

Fonksiyon : void SD_FAT32_KOK_DIZINE_GIT()

Amacı : Kök ( root ) dizine gider . Yapılacak işlemler bundan sonra kök dizinde yapılır

Parametre : Bulunmuyor

Kullanım Şekli :

SD_FAT32_KOK_DIZINE_GIT();

Geri Bildirim :

  • Hata bildiriminde bulunmaz
  • Kullanıcı fonksiyonudur

 

SD_FAT32_BIR_DIZIN_YUKARI_GIT Fonksiyonu

Fonksiyon : void SD_FAT32_BIR_DIZIN_YUKARI_GIT()

Amacı : Bulunduğu dizinden bir yukarı çıkar

Parametre : Bulunmuyor

Kullanım Şekli :

SD_FAT32_BIR_DIZIN_YUKARI_GIT();

Geri Bildirim :

  • Hata bildiriminde bulunmaz
  • Kullanıcı fonksiyonudur

 

Fonksiyonların Uygulaması

  • Yukarıda anlatılan fonksiyonların uygulamarını burada daha detaylı göreceğiz.
  • Sektörleri incelerken yine WinHex programını kullanacağım.
  • Sektörlerin incelenmesindeki amacım sadece ezbere dayalı olarak kütüphaneyi öğretmeden bir yandan temel seviyede bile olsa FAT32 sisteminin işleyişi hakkında bilgi vermektir.

1- SD Kart Analizi Yapmak

  • SD kartımızın uygun formatta yani FAT32 formatında biçimlendirilmiş olup olmadığını denetleyecek ve bunun sonucunu GLCD de göreceğiz.
  • Kütüphane nerede biçimlendirilmiş olursa olsun tüm sistemlere uyumludur yani SD kart mutlaka devre üzerinde biçimlendirilmesine gerek yok FAT32 formatında biçimlendirildiği sürece PC yada PIC fark etmez hepsi ile uyum içerisinde çalışır.
void  main()
{
    unsigned char denetim=120;

    ADCON1=7;
    CMCON=7;

   SAP1024_INIT(240,128,6); // GLCD çalıştırma kodu

   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0);//SD kartı çalıştırmak için mutlaka en başta olmalıdır

   if(SD_FAT32_INIT()==0)//analiz fonksiyonu
     {
       SAP1024_YAZI_YAZMA(1,1,"FORMAT ATILMALI");
     }
   else
     {
       SAP1024_YAZI_YAZMA(1,1,"FORMAT ATILMAMALI");
     }
 }
  • Kodu inceleyecek olursak ilk başta yine SD_SDMOD_ANALIZ fonksiyonunu çağırdık çünkü öncelikle SD kartımızı çalıştırmamız gerekiyor.
  • Koşul içerisinde SD_FAT32_INIT fonskiyonunu koyduk böylece eğer 0 sonucu gelirse “Format Atılmalı” değil ise “Format Atılmamalı” şeklinde GLCD de yazdırmasını sağladık.
  • Sonucu aşağıda görelim.
fat32-sd-analiz-format-atilmamali
SD kart analizi – Format Atılmamalı sonucunu verdi
  • Fotoğrafta görüldüğü gibi SD kartın daha önceden biçimlendirildiğini ve formata ihtiyacı olmadığını belirttir.
  • Devre üzerinde format atmadığımıza göre o halde SD kart PC üzerinde formatlanmış olabilir. Hemen SD kartın 0. sektörünü inceleyelim,
fat32-sd-analiz-format-sektor-kontrol
SD kartın 0. sektörü ve PC içerisindeki durumu
  • Yukarıda görüldüğü gibi SD kartın 0. sektörü formatlandığı sistem tarafından doldurulmuş ve PC üzerinde de tanımlı bir disk halinde görülmektedir.
  • O halde kütüphaneyi test etmem için 0. sektörü SD_MOD_SEKTOR_SIL fonksiyonu ile silip bunu tekrar gözlemleyelim
void  main()
{
    unsigned char denetim=120;

    ADCON1=7;
    CMCON=7;

   SAP1024_INIT(240,128,6); // GLCD çalıştırma kodu

   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0);//SD kartı çalıştırmak için mutlaka en başta olmalıdır
   do{denetim=SD_MOD_SEKTOR_SIL(0,0);}while(denetim==0);// 0. sektör siliniyor
   
   SAP1024_YAZI_YAZMA(1,1,"bitti");
}
  • Yukarıdaki kod ile SD kartın 0. sektörünü siliyoruz  ardından tekrar yukarıdaki analiz kodlarını uygulayıp sonucu göreceğiz.
void  main()
{
    unsigned char denetim=120;

    ADCON1=7;
    CMCON=7;

   SAP1024_INIT(240,128,6); // GLCD çalıştırma kodu

   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0);//SD kartı çalıştırmak için mutlaka en başta olmalıdır

   if(SD_FAT32_INIT()==0)//analiz fonksiyonu
     {
       SAP1024_YAZI_YAZMA(1,1,"FORMAT ATILMALI");
     }
   else
     {
       SAP1024_YAZI_YAZMA(1,1,"FORMAT ATILMAMALI");
     }
 }
  • SD kart analiz kodu yukarıda görülmektedir. SD kartımızı tekrar analiz ederek sonucu görelim.
fat32-sd-analiz-format-atilmali
SD kart analiz format atılmalı sonucu verdi
  • Yukarıdaki fotoğrafta görüldüğü gibi bu sefer fonksiyon format atılması gerektiği sonucuna vardı  çünkü 0. sektörü silerek SD kartı tanımsız hale getirdik.
  • Şimdi tekrar SD kartın 0. sektörünü ve aynı zamanda SD kartın PC deki durumunu görelim
fat32-sd-analiz-format-sektor-kontrol-2
SD kartın 0. sektörü ve PC deki durumu
  • Yukarıda görüldüğü gibi SD kartın 0.sektöründeki bilgiler silindir ve kart PC ortamında da tanımsız hale geldi .
  • SD_FAT32_INIT fonksiyonu görüldüğü gibi kartın formatlı olup olmadığını test ederek kullanıcıyı yönlendirmektedir.

2- SD Kartı FAT32 Formatında Biçimlendirme

  • 1. bölümde SD kartımızın 0. sektörünü silerek onu tanımsız hale getirmiştik. Ancak çalışmalara devam edebilmek için tekrar tanımlı hale getirmemiz gerekli.
  • Bu işlemi SD_FAT32_FORMAT fonksiyonu ile devre üzerinde yapacağız. Böylece SD kartımızı FAT32 formatına göre devre üzerinde biçimlendireceğiz.
  • Biçimlendirme işlemi yaparken aynı zamanda SD karta “DENEME 1  ” adını vereceğim.
void  main()
{
    unsigned char denetim=120;

    ADCON1=7;
    CMCON=7;

   SAP1024_INIT(240,128,6); // GLCD çalıştırma kodu

   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0);//SD kartı çalıştırmak için mutlaka en başta olmalıdır
   SD_FAT32_INIT();// analiz fonksiyonu mutlaka çağırılmalıdır
   do{denetim=SD_FAT32_FORMAT("DENEME 1   ");}while(denetim==0);// SD KART formatlanıyor
   
   SAP1024_YAZI_YAZMA(1,1,"bitti");

}
  • Kodu incelersek , daima SD_FAT32_INIT fonksiyonunu çağırıyoruz. Bu fonksiyondan sonra diğer FAT32 işlemlerine geçebiliriz.
  • SD_FAT32_FORMAT fonksiyonu ile SD karta FAT32 sistemi ile format atıp “DENEME 1” ismini vereceğiz.
  • Sonucu görelim
fat32-sd-analiz-format-atildi
Formattan sonra SD kartın 0. sektör ve SD kartın PC deki durumu
  • Yukarıda görüldüğü gibi SD kartın 0. sektörüne yeni veriler geldi. Ben kendi fonksiyonumu yazarken gereksiz verileri temizleyerek kütüphanenin bana ait olduğunu göstermesi açısından “2017www.ercankoclar.com” yazısınıda ekledim.
  • Ancak yukarıda görülemeyen birşey var SD kartın adını “DENEME1” yaptık ancak yukarıda göremedik .
  • Başlangıçtan hatırlayacağınız gibi FAT32 sisteminde SD kartın ismi 0.sektör  (Boot sektör) de değil  kök dizinde (root) yer alır. O halde bilgi edinmek açısından kök dizine göz atalım.
fat32-kok-dizin-inceleme
Kök dizinin incelenmesi – Disk ismi kök dizinde yazılıdır

NOT: Eğer formatlamada sorun yaşarsanız SD kartın tüm sektörlerini silip ( SD kart sektör silme fonksiyonu ile ) tekrar deneyin. Bazı durumlarda kalan artık veriler sistemde kararsızlığa yol açabiliyor.

3- Dosya İşlemleri

  • Bu bölümde dosya oluşturma , dosya silme , dosya seçme, dosyaya veri yazma gibi fonksiyonları uygulamalı olarak göreceğiz.
  • Kartımızı formatladıktan sonra artık işlem yapmaya hazır durumdadır.

3A- Dosya Oluşturma

  • Bu kısımda oluşturacağımız dosyaların hepsi kök dizinde yani diskin hemen içerisinde oluşturulacaktır. Alt dizinleri klasör bölümünde göreceğiz.
  • İçerisindeki verileri daha ileride görmek açısından ben text dosyası oluşturacağım siz istediğiniz tarzda dosyaları oluşturabilirsiniz.
  • Başlangıç olarak ben “ERCAN4 TXT” dosyasını oluşturacağım . Dosya adı olarak 8 karakter ve uzantı için ise 3 karakter yerimiz bulunmaktadır.
  • Bu bölümde SD_FAT32_DOSYA_OLUSTUR fonksiyonunu kullanacağız.
void  main()
{
    unsigned char denetim=120;

    ADCON1=7;
    CMCON=7;

   SAP1024_INIT(240,128,6); // GLCD çalıştırma kodu

   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0);//SD kartı çalıştırmak için mutlaka en başta olmalıdır
   
   SD_FAT32_INIT();//FAT32 analiz fonksiyonu mutlaka çağırılmalıdır
  
   SD_FAT32_DOSYA_OLUSTUR("ERCAN4  TXT");//dosya oluşturma fonksiyonu

   SAP1024_YAZI_YAZMA(1,2,"bitti");//işlemin bittiğini haber vermesi için eklendi
}
  • Herzaman ki gibi SD_FAT32_INIT ana fonksiyonun arkasından SD_FAT32_DOSYA_OLUSTUR(“ERCAN4 TXT”) fonksiyonu ile dosyamızı oluşturduk.
  • Şimdi PC üzerinde ve SD kartın sektörlerinde bunu inceleyelim.
  • Hatırlayacağınız gibi yeni oluşturulan dosya veya klasörlerin kayıtları kök dizinde bulunuyordu.
fat32-dosya-olusturma
SD kart içerisinde dosya oluşturuldu
  • Yukarıda görüldüğü gibi ERCAN4.txt dosyası SD kart içerisinde oluşturuldu. Ancak içerisi boş olduğundan boyutu 0 bayt yazmaktadır.
  • Kütüphanemde her dosya oluşturulduğunda otomatik olarak 29 Ekim 1980 tarihi atanmaktadır. 1980 olmasının sebebi tarih ile ilgili dosya işlemleri kısmında anlatılacak. “29 Ekim” in sebebini herhalde anlatmaya gerek yoktur.
  • Şimdi SD kartın kök dizininde oluşan değişiklikleri inceleyelim
fat32-dosya-olusturma-kok-sektor
FAT32 sisteminde dosyaların kayıtları kök dizinde tutulur
  • Tek dosya oluşturduğumuzda herhangi bir sorun oluşmadı. Ancak ya yanlışlıkla yada daha önce SD kartın içinde ne olduğunu bilmeden aynı isme ait  iki dosya oluşturursak ne olacak
  • Yeni bir çalışma ile iki adet ERCAN4.txt dosyası oluşturacağım ve sonucu görelim
void  main()
{
   unsigned char denetim=120;
   ADCON1=7;
   CMCON=7;

   SAP1024_INIT(240,128,6); // GLCD çalıştırma kodu

   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0);//SD kartı çalıştırmak için mutlaka en başta olmalıdır
   
   SD_FAT32_INIT();//fat32 ana fonksiyonu

   SD_FAT32_DOSYA_OLUSTUR("ERCAN4  TXT");//ercan4.txt oluşturuldu
   SD_FAT32_DOSYA_OLUSTUR("ERCAN4  TXT");//ercan4.txt oluşturuldu

   SAP1024_YAZI_YAZMA(1,2,"bitti");//işlemin bittiği GLCD üzerinden bildirilecek
}
  • Kodlarda anlaşılacağı üzere arka arkaya aynı isme ve uzantıya sahip iki adet dosya oluşturdum sonucu görelim
fat32-dosya-mukerrer-dosya-olusturma
İki adet aynı isme sahip dosya oluşturulmak istendi
  • Yukarıda görüldüğü gibi aynı isme sahip olarak iki dosyayı oluşturmadı. İkinci dosyanın adını ERCAN400.txt yaptı yani sonuna iki adet sıfır “00” ekledi.
  • Eğer yeni bir tane daha aynı isme sahip oluşturulsaydı ERCAN401.txt yapacaktı . Bu sebeple en fazla 99 adet aynı şekilde gidebilir eğer 99 adeti aşarsa fonksiyon 255 kodu geri döndürecektir.

 

3B- Dosya Seçme ve Silme İşlemi

  • Dosya seçme işlemi tıpkı PC de bir dosyay tıklayarak oku aktif hale getirmek gibi düşünülebilir ardından o dosya ile ilgili işlemleri yapabiliriz.
  • Burada ilk olarak göreceğimiz dosya seçme bu işlemi yapmaktadır ancak bunun anlamlı olabilmesi için dosya silmeyi de beraber olarak anlatacağım
  • Dosya seçme işlemini SD_FAT32_DOSYA_SEC fonksiyonu ile dosya silme işlemini ise SD_FAT32_DOSYA_KLASOR_SIL fonksiyonu ile yapacağım.
  • Dosya seçerken dosya adını doğru ve tam olarak yazdığınızdan emin olun aksi halde size hata kodu olan 0 ( sıfır ) sonucunu verecektir.
void  main()
{
    unsigned char denetim=120;
    unsigned char txt[11];
    int ercan;
    ADCON1=7;
    CMCON=7;

   SAP1024_INIT(240,128,6); // GLCD çalıştırma kodu



   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0);//SD kartı çalıştırmak için mutlaka en başta olmalıdır
   
   SD_FAT32_INIT();//ana fonksiyon
  
   SD_FAT32_DOSYA_OLUSTUR("ERCAN5  TXT");//yeni bir dosya daha oluşturuldu
   
   SD_FAT32_DOSYA_SEC("ERCAN4  TXT");//daha önceden oluşturulan dosya seçildi

   SD_FAT32_DOSYA_KLASOR_SIL();//seçilen dosya silindi

   SAP1024_YAZI_YAZMA(1,2,"bitti");//işlemin bittiğini GLCD de göstermesi için eklendi.
   
}
  • İlk olarak ERCAN5.txt adında yeni bir dosya daha oluşturdum. Böylece seçilen dosyanın silinip silinmediğini görebileceğiz.
  • SD_FAT32_DOSYA_SEC fonksiyonu ile eskiden oluşturduğumu ERCAN4.txt dosyasını seçtim.
  • SD_FAT32_DOSYA_KLASOR_SIL fonksiyonu ile seçilen dosyayı sildim.
  • Şimdi sonucu hem PC den hemde SD kartın sektörlerinden inceleyelim.
fat32-dosya-secme-silme-islemi
FAT32 dosya seçme ve silme işlemi
  • Yukarıda görüldüğü gibi eski seçilen dosya silinirken yeni dosya olduğu gibi duruyor.
  • Fakat FAT32 sisteminde dosya kaydını tamamen silmek varken neden bu kayıt durur sadece başına 0xE5 konur ?
  • Sebebi şudur,FAT32 sistemi kök dizini sırası ile tarar siz bir diski açtığınızda kök dizini tarar ve gördüğü dosyaları orada gösterir, en son boş bir satıra denk gelene kadar. Eğer 5 dosya oluşturup sonrasında ilk oluşturduğumuzu silseydik ve geride veri kalmasaydı ilk satır boş kalırdı ve diski açtığımızda diğer 4 dosyayı göremezdik çünkü sistem kök dizini okuyacak daha ilk satırda boşluğu görecek ve diskte dosya olmadığı kararına varacaktı .
  • Bunu önlemek için FAT32 sisteminde dosya kaydı silinmez yerine ilk karakter 0xE5 yapılır. Daha sonraki zamanda 0xE5 olan yere sistem yeni bir dosya oluşturacağından yer kaplama açısından da sorun oluşturmaz.

 

3C- Dosyayı Yeniden Adlandırma

  • Öncelikle işlem yapmak istediğimiz dosyayı SD_FAT32_DOSYA_SEC fonksiyonu ile seçip ardından SD_FAT32_DOSYA_YENIDEN_ADLANDIR fonksiyonu ile yeni bir isim vereceğiz.
  • İsim verme kuralı tıpkı yeni dosya oluşturmada olduğu gibi 8 karakter isim 3 karakter uzantı şeklinde olacaktır.
  • Eğer bir dosyayı seçtiğinizde başka bir dosya seçene kadar o dosya seçili kalır her işlem için dosyayı tekrar tekrar seçmenize gerek yoktur.
  • Daha önceden oluşturduğumuz ERCAN5.txt dosyasının adını ERCAN10.txt olarak değiştireceğim.
void  main()
{
    unsigned char denetim=120;
    unsigned char txt[11];
    int ercan;
    ADCON1=7;
    CMCON=7;

   SAP1024_INIT(240,128,6); // GLCD çalıştırma kodu

   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0);//SD kartı çalıştırmak için mutlaka en başta olmalıdır
   
   SD_FAT32_INIT();// fat32 ana fonksiyonu

   SD_FAT32_DOSYA_SEC("ERCAN5  TXT");//daha önceden oluşturduğum dosyayı seçtim

   SD_FAT32_DOSYA_YENIDEN_ADLANDIR("ERCAN10 TXT");//dosya adını ERCAN10 olarak değiştirdim

   SAP1024_YAZI_YAZMA(1,2,"bitti");//işlemin bittiğini GLCD üzerinden haber verir
}
  • Eski oluşturduğum ERCAN5.txt dosyasının adını değiştirmek istediğim için o dosyayı SD_FAT32_DOSYA_SEC fonksiyonu ile seçtim
  • SD_FAT32_DOSYA_YENIDEN_ADLANDIR(“ERCAN10 TXT“) fonksiyonu ile yeni vermek istediğim ismi bildirdim.
  • Sonucu hem PC hemde sektör boyutunda inceleyelim
fat32-dosya-olusturma-yeniden-adlandirma
Dosya ERCAN10.txt olarak yeniden adlandırıldı
  • Yukarıda görüldüğü gibi ERCAN5.txt dosyasının adı ERCAN10.txt olarak değiştirildi.
  • Kök dizini inceleyecek olursak görüldüğü gibi dosya silinmedi sadece adı değiştirildi ve bu değşiklik PC boyutunda da görüldü.

 

3D- Dosyanın Tarih ve Saatini Değiştirme

  • Dosyalar oluşturulurken otomatik olarak 29 Ekim 1980 tarihini alıyordu. 1980 olmasının sebebi FAT32 sisteminde bir dosya en az 1980 tarihinde oluşturulabilecek şekilde kurulması . Yani gerçekte herhangi bir tarih girişi yoktur örneğin tarih verisine 2 yazdığınızda FAT32 sistemi bunu 1980+2 = 1982 olarak algılamaktadır. Bu sebeple 1980 den geriye gidilememektedir.
  • Bu bölümde SD_FAT32_DOSYA_TARIH_SAAT_AYARLA fonksiyonu ile oluşturduğum dosyanın tarihini 06 Kasım 2019 saat 12:00 olarak değiştireceğim.
  • Eğer bir tarih-saat devresine sahipseniz oradan aldığınız verileri fonksiyona yükleyerek gerçek zamanlı dosyaların tarihlerini ayarlayabilirsiniz. İleride bu konuda bir ekleme yapacağım.
void  main()
{
    unsigned char denetim=120;
    ADCON1=7;
    CMCON=7;

   SAP1024_INIT(240,128,6); // GLCD çalıştırma kodu

   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0);//SD kartı çalıştırmak için mutlaka en başta olmalıdır
   
   SD_FAT32_INIT();// fat32 ana fonksiyonu

   SD_FAT32_DOSYA_SEC("ERCAN10 TXT");// hangi dosya üzerinde işlem yapılacaksa seçilir
   
   SD_FAT32_DOSYA_TARIH_SAAT_AYARLA(2019,11,6,12,00); // tarih 06 Kasım 2019 saat 12:00 ayarlandı

   SAP1024_YAZI_YAZMA(1,2,"bitti"); //işlemin bittiğini GLCD üzerinden bildirir.
}
  • Herzaman olduğu gibi mutlaka üzerinde işlem yapılacak dosyayı öncelikle seçiyoruz , ardından yapmak istediğimiz işlem ile ilgili fonksiyonu çağırıyoruz.
  • Şimdi sonuçları inceleyelim
fat32-dosya-tarih-degistirme
FAT32 – dosyanın oluşturma tarihinin değiştirilmesi
  • Yukarıda görüldüğü gibi dosya oluşturma tarihi 6 Kasım 2019 saat 12:00 yani gelecekte bir dosya oluşturduk.
  • Farkettiğiniz gibi değiştirme tarihi ise eski zamana ait ,bunu da değiştirmemiz gerekebilir.
  • Bu değişikliği SD_FAT32_DOSYA_DEGISIM_TARIH_SAAT_AYARLA fonksiyonu ile yapıyoruz kullanımı aynıdır.
  • Bu fonksiyon ile ilgili bir deneme yapalım. Bu sefer tarihi 20 kasım olarak değiştireceğim
void  main()
{
    unsigned char denetim=120;

    ADCON1=7;
    CMCON=7;

   SAP1024_INIT(240,128,6); // GLCD çalıştırma kodu

   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0);//SD kartı çalıştırmak için mutlaka en başta olmalıdır
   
   SD_FAT32_INIT();// fat32 ana fonksiyonu

   SD_FAT32_DOSYA_SEC("ERCAN10 TXT");// hangi dosya üzerinde işlem yapılacaksa seçilir
   
   SD_FAT32_DOSYA_DEGISIM_TARIH_SAAT_AYARLA(2019,11,20,12,00); // tarih 20 Kasım 2019 saat 12:00 ayarlandı

   SAP1024_YAZI_YAZMA(1,2,"bitti");//işlemin bittiğini GLCD üzerinden bildirir.

}
  • SD_FAT32_DOSYA_DEGISIM_TARIH_SAAT_AYARLA ile dosya değiştirme tarihini 20 Kasıma ayarlamış olduk
  • Sonucu görelim.
fat32-dosya-degistirme-tarihi
FAT32 – Dosya değiştirme tarihinin ayarlanması
  • Yukarıda görüldüğü gibi değiştirme tarihi 20 Kasım olarak ayarlandı.
  • Bu dosyanızda işlem yaptığınız son tarihi gösterir.

 

3E- Dosyaya Veri Yazma ve Veri Konumlandırması

  • Dosyaya veri yazmaya geçmeden önce FAT32 sistemi ile ilgili bazı noktalara değinmem gerekiyor.
  • FAT32 sisteminde sıfırın (0) hiç bir değeri yoktur. Ancak burada dikkat edilmesi gereken nokta şudur mikroC de yazdığımız örneğin : ercan=0; ın FAT32 de bir anlamı yoktur. Çünkü sıfır boş kullanılmayan alan demektir. Ancak eğer siz sıfırı   desimal değilde string olarak yazmak istiyorsanız o halde 0x30 yazmanız gerekmektedir. Diğer türlü heksadesimal yada desimal olarak sıfırın hiç bir anlamı yoktur FAT32 sisteminde . Bu ayrımı çok iyi yapmamız gerekmektedir.
  • Örneğin : Bir termometre devresi yaptınız ve ısıları belli aralıklarla SD kartın içindeki bir dosyaya kayıt ediyor. Ölçülen ısılar sırasıyla 5,10,15,20 derece olsun. Şimdi sensörden gelen ve PIC içerisinde işlem gören veri tipi desimal olacaktır. Ancak siz bu desimal değerleri olduğu gibi FAT32 ye aktarırsanız FAT32 bu rakamları sektöre yazıcak size bu rakamların string karşılıklarını gösterecektir halbuki siz dosyanızda bu değerleri okumak istiyorsunuz o halde  5,10,15,20 desimal değerlerinin string karşılıklarını yazmanız gerekmekte
  • Veri yazma işlemimizi SD_FAT32_DOSYA_VERI_YAZ fonksiyonu ile yapmaktayız. Ancak verinin konumunu öncelikle belirlemeliyiz. Eğer ki yeni bir dosya açmış isek SD_FAT32_DOSYA_BASINA_GIT fonksiyonunu önceden çağırmalıyız ki dosyanın başından itibaren doğru şekilde yazılsın.
  • Aynı zamanda herhangi bir dosyanın üzerine yazmak istiyorsak SD_FAT32_DOSYA_BASINA_GIT fonksiyonu ile yazma yaparsak o dosyadaki veriler silinir ve yeni veriler üzerine yazılmış olur.
  • Şimdi bunları ve yukarıdaki anlattığım konuyu biraz daha iyi anlayabilmek için kodlarımzı yazalım
void  main()
{
    unsigned char denetim=120;
   
    ADCON1=7;
    CMCON=7;
    
   SAP1024_INIT(240,128,6); // GLCD çalıştırma kodu
  
   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0);//SD kartı çalıştırmak için mutlaka en başta olmalıdır

   SD_FAT32_INIT();
   
   SD_FAT32_DOSYA_SEC("ERCAN10 TXT");
    
   SD_FAT32_DOSYA_BASINA_GIT();//yeni dosyalara veri yazılacağında ve eski dosyaların üzerine yazma yapılacağında çağırılır
   
   //NOT: SD_DATA_TAMPONU mutlaka veri yazma fonksiyonundan önce çağırılmalıdır araya kesinlikle başka bir fonksiyonu konulmamalıdır
   SD_DATA_TAMPONU[0]=0x05;//5 değeri
   SD_DATA_TAMPONU[1]=0x0A;//10 değeri
   SD_DATA_TAMPONU[2]=0x0F;//15 değeri
   SD_DATA_TAMPONU[3]=0x14;//20 değeri

   SD_FAT32_DOSYA_VERI_YAZ(); // veri yazma fonksiyonu
   
   SAP1024_YAZI_YAZMA(1,2,"bitti");//işlemin bittiğini GLCD den bildirir
}
  • Mutlaka SD_DATA_TAMPON‘u SD_FAT32_DOSYA_VERI_YAZ dan hemen önce gelmelidir araya asla ne şekilde olursa olsun bir işlem yada fonksiyon konulmamalıdır aksi halde verilerde bozulma olabilir.
  • Kodların sonucunu aşağıda inceleyelim
fat32-dosya-veri-yazma-mantigi-1
FAT32 yazılacak veriler stringe çevrilmelidir
  • Yukarıda görüldüğü gibi desimal olarak değerleri yazdığımız için dosya içerisinde anlamsız şekiller gördük ve sektöre baktığımızda bizim verdiğimiz desimal değerler direk sektöre yazıldı . Ancak amacımız dosya içerisinde 5,10,15,20 sayısını görmekti.
  • Şimdi kodlarımızı değiştirip 5,10,15,20 nin string karşılıklarını yazarak tekrar kodu yenileyip çalıştıralım
void  main()
{
    unsigned char denetim=120;
   
    ADCON1=7;
    CMCON=7;
    
   SAP1024_INIT(240,128,6); // GLCD çalıştırma kodu
  
   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0);//SD kartı çalıştırmak için mutlaka en başta olmalıdır

   SD_FAT32_INIT();
   
   SD_FAT32_DOSYA_SEC("ERCAN10 TXT");
    
   SD_FAT32_DOSYA_BASINA_GIT();//yeni dosyalara veri yazılacağında ve eski dosyaların üzerine yazma yapılacağında çağırılır
   
   //NOT: SD_DATA_TAMPONU mutlaka veri yazma fonksiyonundan önce çağırılmalıdır araya kesinlikle başka bir fonksiyonu konulmamalıdır
   //NOT2 : Veri sonlarında bulunan 0D0A FAT32 de enter tuşuna denk gelir yani veri sonuna bunu yazarsanız bir sonraki veri dosyada alt satırda yazılır
   SD_DATA_TAMPONU[0]=0x350D0A;//5
   SD_DATA_TAMPONU[1]=0x31300D0A;//10
   SD_DATA_TAMPONU[2]=0x31350D0A;//15
   SD_DATA_TAMPONU[3]=0x32300D0A;//20

   SD_FAT32_DOSYA_VERI_YAZ(); // veri yazma fonksiyonu
   
   SAP1024_YAZI_YAZMA(1,2,"bitti");//işlemin bittiğini GLCD den bildirir
}
  • Yukarıdaki kodda 5,10,15,20 değerlerinin string karşılıklarını yazdık. Ayrıca kod sonuna alt satıra geçmeyi sağlayan 0D0A kodu eklendi ki verilerimizi alt alta görebilelim.
  • Şimdi kodu deneyerek sonuçları inceleyelim
fat32-dosya-veri-yazma-mantigi-2
Fat32 – çevrilen verilen text dosyasında görülmektedir
  • Yukarıda görüldüğü gibi veri yazım işlemi istediğimiz gibi sonuçlandı.
  • Bir tane de verilerin stringe çevrilmesi ile ilgili çalışma yapalım.
  • Kütüphanede direkt olarak yazılan her şeyi stringe çevirme sistemi eklenebilirdi ancak kullanıcıyı kısıtlamamak her projesine uygun tasarımlar yapabilmesi açısından serbest bıraktım . Çünkü herhangi bir projede siz SD karta desimal sıfır göndermek isteseydiniz ve ben stringe çevrimi kütüphaneye yerleştirmiş olsaydım böyle bir şey yapmanız imkansız olurdu. Bu sebeple bir kaç satır fazla kod yazmamıza sebep olsa da bu esnekliğin farklı projelerde bizi kısıtlamalardan kurtaracağını düşünüyorum.
  • Şimdi kodları inceleyelim
//*************STRINGE ÇEVİRME FONKSİYONU BAŞLANGIÇ******************// 
void string_cevir(unsigned long veri )
    {
      char txt[11];
      unsigned char i=0,x=0,y=0,z=0;
           
      LongWordToStr(veri,txt);
      SD_DATA_TAMPONU[x]=0;
      
      for(i=0;i<strlen(txt);i++)
        {
          if(txt[i]!=0 && txt[i]!=0x20)
            {
               SD_DATA_TAMPONU[x]=SD_DATA_TAMPONU[x]|(1L*(txt[i])<<(24-y));
               y=y+8;

               if(y==32)
                 {
                   x++;
                   y=0;
                   SD_DATA_TAMPONU[x]=0;
                 }
             z++;//dizide kaç adet anlamlı veri olduğunu tutmaya yarar
            }
        }
      
      //veri bütünlüğü burada sağlanır 
      SD_DATA_TAMPONU[x]=SD_DATA_TAMPONU[x]|(0x20202020>>((z%4)*8));
        
     if(x!=127){SD_DATA_TAMPONU[x+1]=0;} //son diziyi sıfıra eşitler artık veri kalmasını engeller
    }
//*************STRINGE ÇEVİRME FONKSİYONU BİTİŞ******************// 

void  main()
{
    unsigned char denetim=120;
    
    ADCON1=7;
    CMCON=7;
    
   SAP1024_INIT(240,128,6); // GLCD çalıştırma kodu
  
   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0);//SD kartı çalıştırmak için mutlaka en başta olmalıdır

   SD_FAT32_INIT();//fat32 ana fonksiyonu
  
   SD_FAT32_DOSYA_SEC("ERCAN10 TXT");//dosya seçildi
   
   SD_FAT32_DOSYA_BASINA_GIT();//dosyanın başına giderek konumlandırma yapıldı
   string_cevir(26587);// main üstündeki string fonksiyonu çağırıldı ve çevirilecek değer yazıldı
   SD_FAT32_DOSYA_VERI_YAZ();//veri yazıldı

   SAP1024_YAZI_YAZMA(1,2,"bitti");//işlemin bittiğini GLCD üzerinden bildirir
}
  • Yukarıda görüldüğü gibi ilk olarak SD_DATA_TAMPON u sıfıra eşitlendi çünkü veya lama yapılacağından içerisinde artık veri kalmamalıydı.
  • strlen ile string dizisinin kaç elemanlı olduğu tespit edilir böylece veri 5 te olsa 5555 te olsa strlen ile dizi büyüklüğü tespit edilir ve o kadar döngü oluşturulur
  • Veriler txt dizisine 8 bit olarak yazıldığından 32  bit SD_DATA_TAMPON u dizisine kaydırarak yazılır ve her seferinde kendisi ile veya lanır.
  • Veri bütünlüğü ile yapılmak istene eğer yukarıdaki gibi değerimiz “26587” ise bize 5 adet 8 bitlik alan gerekir bu da  32 bitlik bir tam dizi + 8 bit demektir yani şu halde kalan 24 bit boşta ve sıfıra eşitlenmiş haldedir. Ancak 0x00 FAT32 de tanımsızdır ve asla aralarda kullanılmaz bu sistemin işleyişini bozar. O halde çevirilen veri analiz edilir kaç bitlik boşluk var ise o kısımlar 0x20 değeri ile doldurulur. Veri bütünlüğü kısmı bunu yapmaktadır.
  • Son olarak yeni dizi ve son dizi sıfırlanarak artık verilerden kurtulunur.
  • Aşağıda sonuçları inceleyelim
sd-kart-sektor-veri-yazma-string-donusum
Fat32 – veri bütünlüğü sağlamak için 0x20 ile dolduruldu

 

  • Yukarıda görüldüğü gibi SD karta veri istediğimiz şekilde yazıldı. Eğer boşluklar doldurulmaz ise 0x00 olarak kalır ve sonraki yazma işlemlerinde hataya sebep olur.

3F- Dosya Sonuna Giderek Veri Yazılması

  • Daha önceden oluşturduğumuz ve içerisine veri yazdığımız dosyalarımıza ek yapmak istediğimizde dosyanın sonuna giderek veri yazmaya devam etmeliyiz  yoksa veriler üst üste gelir ve dosya bozulur.
  • SD_FAT32_DOSYA_SONUNA_GIT fonksiyonu ile dosyanın sonuna gidip eski verileri bozmadan dosyaya ekleme yapacağız.
  • Kodları inceleyelim
unsigned char x=0;//global değer
unsigned char string_cevir(unsigned long veri,unsigned char satir_atla )
    {
      char txt[11];
      unsigned char i=0,y=0,z=0;

      LongWordToStr(veri,txt);//mikroc standart kütüpahanesi
      SD_DATA_TAMPONU[x]=0;//başlangıç dizisi sıfıra eşitlenir
      
      for(i=0;i<11;i++)
        {
          if(txt[i]!=0 && txt[i]!=0x20)
            {
               SD_DATA_TAMPONU[x]=SD_DATA_TAMPONU[x]|(1L*(txt[i])<<(24-y));// 8 bitlik veriler kaydırılarak yerleştiriliyor
               y=y+8;

               if(y==32)
                 {
                   if(x!=127) // eğer data tamponu sonuna gelinmediyse
                     {
                       //yeni dizi sıfıra eşitlenir
                       x++;
                       SD_DATA_TAMPONU[x]=0;
                     }
                   else
                    {
                      return 255 ;//data dizisi dolduğundan işlem sonlandırıldı
                    }
                   y=0;//veri kaydırma değişkeni sıfırlanır
                 }
             z++;// kaç adet anlamlı veri olduğunu hesaplar
            }
        }
      
      if(satir_atla==1)//satır atlama enter komutu
        {
          SD_DATA_TAMPONU[x]=SD_DATA_TAMPONU[x]|(0x20202020>>((z%4)*8));// veri bütünleme bölümü
          x++;
          SD_DATA_TAMPONU[x]=0x0D0A;//eğer satır atlama seçilmiş ise enter kodu ekler

        }
      x++;//yeni diziye geçiş
}

  • Öncelikli olarak stringe çevirme fonksiyonunu burada biraz daha geliştirdim. Öncelikle sadece bu fonksiyonu inceleyelim.Fonksiyonu yeni bir parametre olan satir_atla eklendi. Bu parametre 1 olursa veriler alt alta dizilecektir.
  • Daha önce sadece tek seferde 1 dizi yükleniyor ve yazılıyordu. Ancak biz 512 byte lık 127 elemanlı bir diziye sahibiz her seferinde tek tek yazmak vakit kaybı olacağından istediğimiz kadar diziyi yükleyip bir seferde yazdırmak daha mantıklı ve doğru olur ayrıca hızlı olan yolda budur.
  • İlk olarak global  x değişkeni atadım bu SD_DATA_TAMPONU nun hangi dizisinden kaldığı bilgisini tutacak
  • Veri mikroc nin çevrim kütüphanesine gider ve bize txt adında string dizisi verir. Ancak yüklenen veri doğrultusunda bu 10 elemanlı dizinin tamamı dolu olmaz yani biz eğer 5 değeri verdiysek 9 eleman 0 dır sadece son elemanı 5 değerini taşır. O halde ilk olarak anlamlı verileri anlamsızlardan ayırmalıyız
  • Bu iş için if koşulu kullandım ve anlasız verileri ayıkladım.  Strlen fonksiyonunu iptal ettim onun yerine dizinin tam uzunluğunu yazdım
  • SD_DATA_TAMPONU 32 bit ve bizim string dizimizin her elemanı 8 bit o halde sıra ile kaydırarak 4 er li gruplar halinde SD_DATA_TAMPONU na verileri yüklüyoruz
  • Bir dizi dolduğunda sonraki diziye geçiyoruz tabiki orada görülen if(x!=127) toplam 127 adet dizi olduğundan son diziye gelindiyse kullanıcıya 255 kodu döndürerek SD_DATA_TAMPONU nun artık dolduğunu haber verir.
  • Tüm veri işlemleri bittiğinde if(satir_atla==1) koşulu eğer kullanıcı bundan sonra gelecek veririnin bir alt satıra geçmesini istemiş ise buna göre işlemler yapılır. İlk olarak veri bütünleme çalışır diziyi tamamalar ardından gelen diziye enter kodu yani 0x0D0A ekler böylece arkadan gelen veri bir alt satırda görünür.
  • En son yeni diziye geçilir ve fonksiyon son bulur. Kullanıcı bu şekilde bu fonksiyonu for döngüsüne sokarak ve veri parametresine verileri arka arkaya vererek 512 byte alanı doldurup tek seferde yazma yapabilir bu yukarıda bahsettiğim avantajları sağlar.
  • Şimdi tüm programa geçebiliriz.
void  main()
{
    unsigned char denetim=120;
    
    ADCON1=7;
    CMCON=7;
    
   SAP1024_INIT(240,128,6); // GLCD çalıştırma kodu
  
   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0);//SD kartı çalıştırmak için mutlaka en başta olmalıdır

   SD_FAT32_INIT();
 
   SD_FAT32_DOSYA_SEC("ERCAN10 TXT");
 
   x=0;// global dizi değeri her yeni yükleme öncesi sıfırlanır
   
   SD_FAT32_DOSYA_SONUNA_GIT();//dosya sonuna giderek daha önce yazılan veriler bozulmaz 26587 yazdırılmıştı

   //**Bu bölümde diziye yükleme yapılır ister tek tek isterse for döngüsüne alarak yükleme yapılır
   //** string_cevir fonksiyonundan 255 cevabı gelirse bu SD_DATA_TAMPONU nun dolduğu anlamı taşır

   string_cevir(145658,1); // string çevir alt satıra geç
   string_cevir(1234,1); // string çevir alt satıra geç
   string_cevir(458,0);// string çevir yanından devam et
   string_cevir(125,1);// string çevir alt satıra geç

   SD_FAT32_DOSYA_VERI_YAZ();//veriler yazılır

   SAP1024_YAZI_YAZMA(1,2,"bitti");//işlemin bittiğini GLCD üzerinden bildirir
 }
  • Ana programda herzaman ki gibi dosya seçildi, global x değeri sıfıra eşitlendi çünkü yeni bir yükleme yapacağız.
  • Veri  SD_FAT32_DOSYA_SONUNA_GIT ile konumlandırıldı daha önce yazılan veriye ek olarak devam edecek.
  • Bu aşamada SD_DATA_TAMPONU string_cevir fonksiyonu ile arka arkaya yüklenir ve en son veri yazılır.
  • Şimdi sonuçları inceleyelim
sd-kart-sektor-veri-yazma-string-donusum2
Fat32 – Veri konumlandırması sona alınarak eskiden yazılan dosya içerğine ek yapıldı. Alt satıra geçme kodu(0x0D0A) uygulandı.
  • Veri yazma işlemlerini farklı açılardan ele aldık ve tamamladık. Çevrim fonksiyonu kullanmak yada farklı fonksiyon yazmak geliştirmek tamamen size kalmış.

 

3G- Dosya İçerisinden Veri Okunması

  • SD kartta oluşturduğumuz dosyalarda bulunan verileri SD_FAT32_DOSYA_VERI_OKU fonksiyonu ile okuyacağız. Okuma fonksiyonundan önce mutlaka SD_FAT32_DOSYA_BASINA_GIT fonskiyonu gelmelidir ve işlem yapacağınız dosyayı seçmeyi unutmayın
  • Okuma yaparken dosyanın kaçıncı sektörünün okunacağı belirtilmelidir. Her sektör 512 byte olduğundan sektör okunduğu anda veriler SD_DATA_TAMPONU na yüklenir ve verileri oradan bulabiliriz.
  • Şimdi önceki konularda oluşturduğumuz verileri okuyarak GLCD heksadesimal olarak okumaya çalışalım.
void  main()
{
    unsigned char denetim=120,i=0;
    unsigned long veri;
    char txt[11];
    ADCON1=7;
    CMCON=7;
    
   SAP1024_INIT(240,128,6); // GLCD çalıştırma kodu

  
   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0);//SD kartı çalıştırmak için mutlaka en başta olmalıdır

   SD_FAT32_INIT();
  
   SD_FAT32_DOSYA_SEC("ERCAN10 TXT");//işlem yapılacak dosya seçilir
   
   SD_FAT32_DOSYA_BASINA_GIT();// dosyanın başına gidilir bu kural asla değişmez

   SD_FAT32_DOSYA_VERI_OKU(0);//dosyanın 0. sektörü okunur
  

   for(i=0;i<12;i++)//daha önceki konularda 12 adet dizi kullandığımız için 12 yaptım (0-11)
      {
        LongWordToHex(SD_DATA_TAMPONU[i],txt);//mikroc standart kütüpahanesi değerleri heksadesimal olarak çeviriyor
        SAP1024_YAZI_YAZMA(1,(i+1),txt);//her satıra bir dizi gelecek şekilde GLCD de gösterecek
      }
}
  • Dosya seçildikten sonra SD_FAT32_DOSYA_BASINA_GIT ile konumlandırma tamalandı ve  SD_FAT32_DOSYA_VERI_OKU(0) ile seçilmiş dosyanın 0. sektörü okundu veriler SD_DATA_TAMPONU na yüklendi.
  • for döngüsü ile bu verileri heksadesimale çevirip GLCD de her satıra bir dizi gelecek şekilde gösterecek
  • Şimdi sonuçları inceleyelim
sd-kart-dosyadan-veri-okumak
SD kart içerisinde yazılı olan veri okunarak GLCD üzerinde görüntülendi.
  • Yukarıda görüldüğü gibi sonuç başarılı. Daha önceki konuda yüklenen veriler GLCD de okundu. Verileri string olarak gösterilmesini daha önce görmüştük (SD Kartın Sektörlerinden Veri Okunması) oradakine benzer şekilde isterseniz stringe çevirip okuyabilirsiniz.

 

3H-Dizindeki Dosyaları Listeleme

  • Bu işlem MS-DOS taki dir komutu ile aynı işlevi görür. Seçilen dizindeki dosyaları GLCD de düzenli bir şekilde listeler.
  • SD_FAT32_DOSYA_LISTELEME fonksiyonu kullanarak bu işlemi yapmaktayız. Bu fonksiyon seçilen dizinin içinde bulunan dosya ve klasörleri liste halinde tarar. Daha görmediğimiz ilerideki konularda göreceğimiz Klasör seçme komutu ile hangi klasör yani dizin seçilirse onun içeriğini listeler eğer herhangi bir seçim yapılmazsa kök dizin yani diskin direk içerisinde bulunan dosya ve klasörleri listeler
  • Listeleme işlemi SD_FAT_32_DOSYA_LISTELEME_SONLANDIR fonksiyonu ile sonlandırılır.
  • Kodları yazarak inceleyelim
void  main()
{
    unsigned char denetim=120,i=0,x=0;
    unsigned long veri;
    char txt[11];
    ADCON1=7;
    CMCON=7;
    
   SAP1024_INIT(240,128,6); // GLCD çalıştırma kodu

  
   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0);//SD kartı çalıştırmak için mutlaka en başta olmalıdır

   SD_FAT32_INIT();//fat32 ana fonksiyonu
    
   for(i=0;i<45;i++)
     {
       if(SD_FAT32_DOSYA_LISTELEME(i)!=255)//dosya listeleme fonksiyonu
         {
           SAP1024_YAZI_YAZMA(1,(i+2-x),(YDosya_Bilgileri.dosya_adi));//dosya adı
           SAP1024_YAZI_YAZMA(15,(i+2-x),(YDosya_Bilgileri.dosya_olusturma_tarih));//dosya oluşturulma tarihi
           SAP1024_YAZI_YAZMA(26,(i+2-x),(YDosya_Bilgileri.dosya_olusturma_zaman));//dosya oluşturulma saati
           SAP1024_YAZI_YAZMA(31,(i+2-x),(YDosya_Bilgileri.dosya_boyutu));//dosya boyutu
         }
      else
         {
           x++;
         }

     }
   SD_FAT_32_DOSYA_LISTELEME_SONLANDIR();//listeleme sonlandırılır
}
  • Fonksiyonun kullanımı yukarıda görülmektedir. for döngüsü içerisinde kullanmak zorundayız. SD_FAT32_DOSYA_LISTELEME fonksiyonuna verilen parametre dosyanın bulunduğu satırı temsil eder. Yani 1 yazarsak 1. dosyayı sadece tarar ve gösterir bu sebeple tüm dosyaları görebilmek için for döngüsü içerisinde kullanıyoruz.
  • Ben kendi GLCD kütüphanemin yazı yazdırma fonksiyonunu kullandım siz istediğiniz kütüphaneyi kullanabilirsiniz.
  • x parametresi dosyalar okunurken arada silinmiş dosyalar olabilir bu sebeple bunlar boşluk olarak ekranda görülecektir ancak fonksiyon bu tarz silinmiş dosyalar ile karşılaştığında 255 değeri geri döndürür bu kod şekli ile de -x yaparak boşluk silinir böylece görüntüde bütünlük sağlanır.
  • YDosya_Bilgileri.dosya_adi, YDosya_Bilgileri.dosya_olusturma_tarihYDosya_Bilgileri.dosya_olusturma_zamanYDosya_Bilgileri.dosya_boyutu bunlar kütüphanede oluşturulmş yapı içerisinde bulunur. Bunların hepsini yada istediğinizi kullanabilirsiniz. Hangi GLCD kütüphanesini kullanırsanız kullanın bunları yazı kısmına eklemeniz gerekmektedir.
  • i+2 şeklinde yazılan kod GLCD de listelemenin en tepeden değil 1 satır alttan başlamasını sağlar bu rakam arttırılıp azaltılarak listeleme başlangıcı ayarlanabilir. Bırakılan bu boşluğa başlık vs. yazılabilir herhangi bir bağlayıcılığı yada etkisi yoktur.
  • SD_FAT_32_DOSYA_LISTELEME_SONLANDIR fonksiyonu mutlaka çağrılmalıdır listeleme yaparken kullanılan global değerleri sıfırlar eğer bu fonksiyon kullanılmazsa tekrar listeleme yaptığınızda hata ile karşılaşırsınız.
  • Şimdi sonucu GLCD üzerinde görelim
fat32-dosya-listeleme-GLCD
Kök dizinde bulunan dosyalar listelenerek GLCD üzerinde görüldü
  • Fotoğrafta görüldüğü gibi diskte bulunan dosyalar GLCD üzerinde listelendi. Listelenme sırası kök dizinde oluşturulma sırası iledir.
  • Dosya adı ve uzantısı – tarihler – boyut görülmektedir. Ancak sizi yanıltmasın bu boyut byte cinsinden ve dosyanın gerçek boyutudur disk içerisinde kapladığı boyutu değildir. Disk içerisinde her birine 1 cluster ayrıldığından en az bir cluster kadar ( 16 Kbyte) görülecektir.
  • Şimdi kök dizinde nasıl bir durum olduğunu inceleyelim.
fat32-dosya-listeleme-kok-sektor
Dosya ve klasörler bulunduğu dizindeki sırasına göre listelenir
  • GLCD dizilimi ile sektördeki dizilim aynıdır.
  • Silinmiş dosyalar ve sistem ile ilgili veriler GLCD de gösterilmez. Boşluk olmaması için yukarıdaki kod kısmında bahsettiğim -x kullanılır.
  • Şu an klasör seçme yapılmadığından kök dizindeki dosyalar listelenmiştir. İlerideki konularda klasör seçimine gelindiğinde klasör ile nasıl çalıştığı da gösterilecek.

 

4-Klasör İşlemleri

  • Bu bölümde klasör oluşturma, klasörler içerisinde hareket etme alt dizine inme üst dizine çıkma gibi işlemleri göreceğiz.

 

4A- Klasör Oluşturma

  • SD_FAT32_KLASOR_OLUSTUR(unsigned char KLASOR_ADI[8]) fonksiyonunu kullanarak klasör oluşturacağız.
  • Parametreden anlaşılacağı üzere klasör adı 8 karakter olabilir.
  • Kodları inceleyelim
void  main()
{
    unsigned char denetim=120;
    ADCON1=7;
    CMCON=7;
    
   SAP1024_INIT(240,128,6); // GLCD çalıştırma kodu
  
   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0);//SD kartı çalıştırmak için mutlaka en başta olmalıdır

   SD_FAT32_INIT();//fat32 ana fonksiyon
   
   SD_FAT32_KLASOR_OLUSTUR("ERCAN5  ");//kök dizinde ERCAN5 adında klasör oluşturur
    
   SAP1024_YAZI_YAZMA(1,1,"bitti");//işlemin bittiğini GLCD üzerinden bildirir
}
  • SD_FAT32_KLASOR_OLUSTUR(“ERCAN5 “) fonksiyonu ile kök dizinde bir klasör oluşturdu. Kök dizinde olmasının sebebi herhangi bir dizin seçimi yapılamamış olmasıdır.
  • Klasörlerde kök dizinde dosya gibi oluşturulurlar sadece uzantıları ve boyutları yoktur.
  • Sonuçlara geçmeden önce kök dizini temiz hale getirmek için SD kartı tekrardan formatladım ve ERCAN10.txt ve ERCAN100.txt dosyalarını oluşturdum.
  • Şimdi sonucu görelim
fat32-klasor-olusturma
Fat32 – Klasör oluşturuldu
  • Yukarıdaki sektörde dosya ve klasörden sonra bazı anlamsız yazılar bulunmaktadır. Bunlar SD karta PC nin kendi eklediği birtakım verilerdir.

 

4B- Klasör Seçme İşlemleri

  • SD_FAT32_KLASOR_SEC(unsigned char KLASOR_ADI[8]) fonksiyonu ile tıpkı oluşturmadaki gibi klasör seçimi yapıyoruz.
  • Klasör seçimi dosya seçiminden farklı durumları içerisinde barındırmakta. Birkaç konudur bahsettiğim dizin mantığı burada ortaya çıkar.
  • Geçtiğimiz konuda ERCAN5 adında klasör oluşturduk ancak bu klasörü kök dizinde oluşturmuştuk. Şimdi dizin mantığını kavramak adına ERCAN5 klasörünü seçip yeni bir ERCAN50.txt dosyası ve ERCAN50 klasörü oluşturacağız
  • Kodları inceleyelim.
void  main()
{
    unsigned char denetim=120;
    ADCON1=7;
    CMCON=7;
    
   SAP1024_INIT(240,128,6); // GLCD çalıştırma kodu

   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0);//SD kartı çalıştırmak için mutlaka en başta olmalıdır

   SD_FAT32_INIT();//fat32 ana fonksiyonu
   
   SD_FAT32_KLASOR_SEC("ERCAN5  ");//oluşturmuş olduğumuz ERCAN5 klasörü seçildi böylece yeni oluşturulacak dosyalar bu klasörün içerisinde barınacak
   
   SD_FAT32_KLASOR_OLUSTUR("ERCAN50 ");//ERCAN50 adında yeni klasör oluştur
   SD_FAT32_DOSYA_OLUSTUR("ERCAN50 TXT");//ERCAN50.txt adında yeni dosya oluştur
  
   SAP1024_YAZI_YAZMA(1,1,"bitti");//işlemin bittiğini bize GLCD üzerinden bildirir
}
  • Önceden oluşturduğumuz ERCAN5 klasörünü seçtik böylece yeni oluşturacağımız ERCAN50 klasörü ve ERCAN50.txt dosyası kök dizin yerine ERCAN5 klasörünün içerisinde oluşturulacaktır.
  • Sonuçları görelim
fat32-klasor-sec
Klasör seçimi ile seçilen klasör içerisinde yeni bir klasör oluşturuldu.
  • Görüldüğü gibi ERCAN5 klasörü seçildi yeni dosya ve klasörler ERCAN5 klasörünün içerisinde oluşturuldu.
  • Daha öncede bahsettiğim bir konuda olduğu gibi ERCAN5 klasörü seçildiğine göre o halde SD_FAT32_DOSYA_LISTELEME fonksiyonu ile kök dizin yerine ERCAN5 klasörünün içeriğini listeleyerek GLCD de görelim.
void  main()
{
    unsigned char denetim=120,i=0,x=0;
    ADCON1=7;
    CMCON=7;
    
   SAP1024_INIT(240,128,6); // GLCD çalıştırma kodu

  
   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0);//SD kartı çalıştırmak için mutlaka en başta olmalıdır

   SD_FAT32_INIT();//fat32 ana fonksiyonu
   
   SD_FAT32_KLASOR_SEC("ERCAN5  ");//ERCAN5 klasörü seçildi
      
   for(i=0;i<45;i++)   
     if(SD_FAT32_DOSYA_LISTELEME(i)!=255)//ERCAN5 klsörünün içeriği listelenecek
       {
        SAP1024_YAZI_YAZMA(1,(i+2-x),(YDosya_Bilgileri.dosya_adi));
        SAP1024_YAZI_YAZMA(15,(i+2-x),(YDosya_Bilgileri.dosya_olusturma_tarih));
        SAP1024_YAZI_YAZMA(26,(i+2-x),(YDosya_Bilgileri.dosya_olusturma_zaman));
        SAP1024_YAZI_YAZMA(31,(i+2-x),(YDosya_Bilgileri.dosya_boyutu));
       }
     else
       {
        x++;
       }
    }
   SD_FAT_32_DOSYA_LISTELEME_SONLANDIR();//listeleme bitirme fonksiyonu
}
  • Daha önce gördüğümüz listeleme kodu ile aynı tek fark SD_FAT32_KLASOR_SEC(“ERCAN5 “) fonksiyonu ile kök dizin yerine ERCAN5 klasörü içeriğini listelemiş olmamız
  • Sonuçları inceleyelim
fat32-klasor-sec-listeleme
Klasör seçimi yaparak seçilen klasörün içeriği listelendi ve GLCD üzerinde gösterildi.
  • Klasör seçme ve oluşturma bu şekilde sonsuza kadar gidebilir. Yani yeni bir a klasörü oluşturup onu seçip içinde b klasörü oluşturup onu  seçip içinde c klasörü oluşturarak sayısız bir dizin zinciri oluşturabilirsiniz.
  • Şimdi yeni bir örnek ile önce ERCAN5 klasörünü seçip ardından ERCAN50 klasörünü seçeceğim ve içerisine SON.txt adlı bir dosya oluşturacağım.
void  main()
{
    unsigned char denetim=120;
    ADCON1=7;
    CMCON=7;
    
   SAP1024_INIT(240,128,6); // GLCD çalıştırma kodu
  
   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0);//SD kartı çalıştırmak için mutlaka en başta olmalıdır

   SD_FAT32_INIT();//fat32 ana fonksiyon
   
   SD_FAT32_KLASOR_SEC("ERCAN5  ");//ilk olarak kök dizinde bulunan ERCAN5 klasörü seçildi
   
   SD_FAT32_KLASOR_SEC("ERCAN50 ");//ERCAN5 klasörü içinde bulunan ERCAN50 klasörü seçildi
   
   SD_FAT32_DOSYA_OLUSTUR("SON     TXT");//ERCAN50 klasörü içerisinde SON.txt oluşturuldu
  
   SAP1024_YAZI_YAZMA(1,1,"bitti");//işlemin bittiğini GLCD üzerinden bildirir.
}
  • Yukarıda görüldüğü gibi KÖK DİZİN > ERCAN5 >ERCAN50  şeklinde seçim yapıldı. Ardından dosya oluşturma işlemi yapıldığı için yeni dosya ERCAN50 klasöründe oluşturulması gerekiyor.
  • Bu durumda yapılacak her işlem ERCAN50 klasörü içerisi için geçerli olacaktır örneğin kök dizinde ERCAN5.txt dosyası olsada bu durumda ERCAN5.txt yi sil derseniz dosya bulunamadığı için size hata kodu verir bu sebeple hangi dizinde bulunuyorsak yapacağımız her işlem o dizin ile ilgilidir.
  • Şimdi sonucu inceleyelim
fat32-alt-dizine-inip-dosya-olusturma
İç içe oluşturulan klasörler seçilerek en alt dizinde yeni bir dosya oluşturuldu

 

4C- Bir Dizin Yukarı Çıkmak

  • Bir önceki konuda dizinlerde aşağı doğru gitmiştik. Bu konuda iste tek tek yukarı çıkmayı göreceğiz yani bir klasör yukarı çıkmış olacağız.
  • SD_FAT32_BIR_DIZIN_YUKARI_GIT fonksiyonunu kullanıp ERCAN50 klasöründen yukarı çıkıp(ERCAN5 klasörüne girmiş olacağız) ERCAN50.txt  dosyasını sileceğim.
  • Kodları inceleyelim.
void  main()
{
    unsigned char denetim=120;
    ADCON1=7;
    CMCON=7;
    
   SAP1024_INIT(240,128,6); // GLCD çalıştırma kodu

   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0);//SD kartı çalıştırmak için mutlaka en başta olmalıdır

   SD_FAT32_INIT();
   
   SD_FAT32_KLASOR_SEC("ERCAN5  ");//ERCAN5 klasörü seçildi
   SD_FAT32_KLASOR_SEC("ERCAN50 ");//ERCAN50 klasörü seçildi 
     
   SD_FAT32_BIR_DIZIN_YUKARI_GIT();//bir dizin yukarı gidilerek ERCAN5 klasörüne geri dönüldü
   
   SD_FAT32_DOSYA_SEC("ERCAN50 TXT");//ERCAN50.txt seçildi
   SD_FAT32_DOSYA_KLASOR_SIL();//ERCAN50.txt silindi
    
   SAP1024_YAZI_YAZMA(1,1,"bitti");//işlemin bittiğini GLCD üzerinden bildirir.
}
  • Öncelikle en alt dizine inildi ardından bir dizin yukarı çıkılarak ERCAN5 klasörü içerisinde oluşturduğumuz ERCAN50.txt seçildi ve silindi.
  • Sonuçları inceleyelim
fat32-bir-dizin-yukari-cik
En alt dizinden bir yukarı çıkarak bir önceki klasör içerisinde bulunan dosyalar için işlem yapıldı
  • ERCAN5 klasöründe bulunan ERCAN50.txt nin silindiği sektörden de okunmaktadır.
  • Yanlızca içerisinde bulunduğunuz klasördeki veya dizindeki dosyalar için işlem yapabilirsiniz farklı bir durumda hata kodu alırsınız.

4D- Kök Dizine Dönmek

  • Bir önceki konuda tek tek dizinlerde yukarı çıkmayı görmüştük ancak iç içe dizinler arasında hemen en yukarıya kök dizine dönmemiz gerekebilir bu sebeple bu fonksiyonu yazdım.
  • SD_FAT32_KOK_DIZINE_GIT fonksiyonu ile nerede olursanız olun hemen kök dizine geri dönersiniz.
  • Bu çalışmada aynı zamanda klasör silme işlemini de yapacağım. Silme işlemini daha önce gördüğümüz SD_FAT32_DOSYA_KLASOR_SIL ortak fonksiyonu ile yapacağım .
  • Kodları inceleyelim
void  main()
{
    unsigned char denetim=120;
    ADCON1=7;
    CMCON=7;
    
   SAP1024_INIT(240,128,6); // GLCD çalıştırma kodu
  
   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0);//SD kartı çalıştırmak için mutlaka en başta olmalıdır

   SD_FAT32_INIT();//fat32 ana fonksiyonu
   
   SD_FAT32_KLASOR_SEC("ERCAN5  ");//ERCAN5 klasörü seçildi
   SD_FAT32_KLASOR_SEC("ERCAN50 ");//ERCAN50 klasörü seçildi
      
   SD_FAT32_KOK_DIZINE_GIT();//Direk kök dizine geri gelindi
   
   SD_FAT32_KLASOR_SEC("ERCAN5  ");//ERCAN5 klasörü seçildi

   SD_FAT32_DOSYA_KLASOR_SIL();//Kök dizindeki ERCAN5 klasörü silindi
 
   SAP1024_YAZI_YAZMA(1,1,"bitti");//işlemin bittiğini GLCD üzerinden bildirir
}
  • Programı test amacı ile yine en alt dizine inildi ve ardından SD_FAT32_KOK_DIZINE_GIT komutu ile kök dizine dönüldü.
  • Kök dizinde bulunan ERCAN5 klasörü seçildi ve silindi
  • Sonuçları inceleyelim
fat32-kok-dizine-don
En alt dizinden hemen kök dizine dönüldü
  • Yukarıda görüldüğü gibi kök dizine gelindi ve kök dizinde bulunan ERCAN5 klasörü silindi. Eğer bir klasör silinirse o klasörün içerisinde bulunan hersey onun ile beraber tanımsız hale gelir ancak SD kart sektörleri içerisinde yerini korumaya devam eder.
  • SD_FAT32_DOSYA_KLASOR_SIL fonksiyonu ortak olmasına karşın eğer en son seçilen ne ise onu siler yani bir dosya seçilmiş ise onu yada klasör seçilmiş ise en son klasörü siler

4E- Klasörü Yeniden Adlandırmak

  • Dosyaları yeniden adlandırmada ki gibi klasörleri de yeniden adlandırırken öncelikle klasörü seçiyoruz ardından yeniden adlandırıyoruz.
  • SD_FAT32_KLASOR_YENIDEN_ADLANDIR(unsigned char KLASOR_ADI[8]) fonksiyonunu kullanarak işlemi gerçekleştiriyoruz.
  • Klasör adı 8 karakter olmalıdır. İşlem yaparken seçilecek klasörün bulunduğu dizinde olmamız gerekiyor. Farklı dizindeki dosya ve klasörler üzerinde bir işlem yapamayız
  • Kök dizinde ERCAN5 ve ERCAN500 klasörleri bulunmaktadır. Çalışma ile ERCAN500 klasörüne SON ismini vereceğim
void  main()
{
    unsigned char denetim=120;
    ADCON1=7;
    CMCON=7;
    
   SAP1024_INIT(240,128,6); // GLCD çalıştırma kodu
  
   do{denetim=SD_SDMOD_ANALIZ(4);}while(denetim==0);//SD kartı çalıştırmak için mutlaka en başta olmalıdır

   SD_FAT32_INIT();//fat32 ana fonksiyonu

   SD_FAT32_KLASOR_SEC("ERCAN500");// ERCAN500 klasörü seçildi

   SD_FAT32_KLASOR_YENIDEN_ADLANDIR("SON     ");//ERCAN500 klasörünün adı SON olarak değiştirildi
  
   SAP1024_YAZI_YAZMA(1,1,"bitti");//işlemin bittiğini GLCD üzerinden bildirir.
}
  • Klasör kök dizinde olduğundan herhangi bir dizin işlemi yapılmadı
  • ERCAN500 klasörü önce seçildi sonra SD_FAT32_KLASOR_YENIDEN_ADLANDIR(“SON “) fonksiyonu ile yeniden adlandırıldı.
  • Sonuçları görelim
fat32-klasor-yeniden-adlandir
Klasör yeniden adlandırıldı
  • Yukarıda görüldüğü gibi yeniden adlandırma işlemi tamamlandı

SONUÇ

  • SD kart (SD Mod) ve FAT32 kütüphanesinde bulunan fonksiyonların kullanımını ve SD kart ile FAT32 sistemi hakkında yüzeysel de olsa bilgi sahibi oldunuz.
  • Bu kütüphane tamamen özgün olup zaman içerisinde geliştirilecektir.
  • Bu kütüphane ile SD kart ve FAT32 kullanarak hızlı, tam anlamı ile dosya sistemi kurup kullanabileceksiniz. Artık SPI gibi sizi yavaşlatan zincirlerden kurtulmuş bulunmaktasınız.
  • Kütüphane için 22 ay harcadım yaklaşık olarak bitmiş kod satırı 4000 civarındadır.
  • Soru ve bildirimler için soru-cevap forumunu kullanabilirsiniz.

Kütüphane Dosyaları

 


Yararlanılan Belgeler

 

 


This post is also available in: English (İngilizce)

About ERCAN KOÇLAR

Çalışmalarım çocukken başladı kolonyalı kağıtları yakmak, ilaçları birbirine katmak gibi değişik deneylerim vardı. Kimya kitabında elektroliz ile suyun hidrojen ve oksijene ayrıldığı ve hidrojenin yandığını yazıyordu, o zamanlarda aklım almıyordu sudan nasıl yanan....Devamını okumak için tıklayınız ;)