SD karttan ilk sektörü okuyalım
SD kartlar projelerimizde kullanabileceğimiz oldukça büyük kapasiteli hafıza elemanlarıdır. Bu kartların dış dünya ile haberleşmek için kullandıkları iki mod var. İlki kartın standart modu diğeri SPI modu, bu modlar arasındaki farkları sıralayacak kadar bilmiyorum ancak SPI modda standart moda göre bazı özellikler eksik.
SD kartı projelerimizde adamakıllı kullanabilmek, hangi bilgileri nerde sakladığımızı karıştırmamak için kartta bir dosya sistemi olması gerekiyor, bu dosya sistemi windows tarafından tanınan NTFS, FAT gibi dosya sistemlerinden olursa projemizde kullandığımız kartı windows ortamında düzenleme kolaylığı geliyor. Ben bu zamana kadar SD kartlarda FAT dosya sisteminden başka bir dosya sisteminin kullanıldığını görmedim. Windows ortamında(sadece XP de denedim) SD kartı kart okuyucuya takarsanız formatlama seçeneklerinde sadece FAT dosya seçeneğinin olduğunu görebilirsiniz. Dosya sistemi olmadan da SD kart RAM gibi kullanılabilir ancak bu durumda da SD kartı karışıklık olmadan kullanabilmek için kendimize çok ilkel de olsa bir dosya sistemi yazmak durumunda kalıyoruz.
FAT dosya sistemi fonksiyonlarını baştan yazmak zorunda değiliz, internette GNU lisansıyla dağıtılan çeşitli kodlar var. Bunlardan bir tanesinin adresi:
http://elm-chan.org/fsw/ff/00index_e.html
FAT dosya sistemini projeme entegre etmeden önce SD kartla iletişim denemesi yapmaya karar verdim, SPI modu olan bir mikrodenetleyiciyle bilgisayardan seri port ile haberleştim. Seri gönderdiğim komut mikrodenetleyici üzerinden SPI ile SD karta gidiyor, SD karttan gelen SPI verisi seri porttan bilgisayar ekranıma geliyor. Yani mikrodenetleyicili devre Serial>SPI, SPI>Serial çevirici olarak çalışıyor. Bu bağlantıyı SD kart ile haberleşme verisini daha iyi takip etmek için kurdum. Mikrodenetleyici olarak atmega8 i 3.5V ta 1MHz de kullandım. 3.3V seçmemin sebebi SD kartın 3.3V ile çalışması*. Bu sayede mikrodenetleyici pinleri ile SD kart arasında voltaj seviyesi olarak uyumsuzluk olmuyor. Seri porttan gelen max232 5V TTL verisini mikrodenetleyiciye girerken 1k – 2k gerilim bölücü kullandım, mikrodenetleyiciden çıkan 3.3V luk TX verisini max232 ye direkt giriyorum, haberleşme sorunsuz çalışıyor. SD kart soketi olayını da microsd kartı SD kart adaptörüne takarak kullanıyorum, lehimi adaptöre yaptım.
Aşağıdaki örnekte sadece SD karttan ilk sektörü okuduk ancak bahsettiğim devreyi kurduktan sonra SPI ile desteklenen tüm komutları deneyebilirsiniz. Bilgisayar tarafında WinHex gibi bir program kullanarak çalışmanızı daha detaylı yapabilirsiniz.
Yeni enerjilendirilen bir karttan okuma yapmak için sırasıyla CMD0, CMD1, CMD16 ve CMD17 komutlarını göndermemiz gerekiyor. Bu komutlar internette birçok yerde anlatılıyor ben Sandisk in MMC kart katalogundan ve yazılmış örnek kodlardan öğrendim.
CMD0: 0x40 0x00 0x00 0x00 0x00 0x95
ile kartı resetleyip “idle state”e alıyoruz, 0x01 cevabını görene kadar(komutun işlendi bilgisi) cevap istiyoruz. İlk 4-5 byte da 0x01 cevabını alamadıysak komutu tekrar gönderiyoruz. İlk 4-5 diyorum, belki daha da uzatılabilir.
CMD1: 0x41 0x00 0x00 0x00 0x00 0x95
ile kartı “idle state” ten çıkarıyoruz, sondaki CRC bilgisinin sadece CMD0 da önemi var, 0x95 olarak bıraktık. Bu komuttan sonra 0x00 cevabını görene kadar cevap istiyoruz. İlk 4-5 byetta 0x00 cevabını almadıysak komutu yeniliyoruz… Cevap istiyoruz derken SD karta 0xFF gönderiyoruz, giden 0xFF ler içerdeki registar a yazılmış cevabın dışarı çıkmasını sağlıyor. Cevap formatları yukarıda verdiğim katalogda var, burda aldığımız cevaplar hep R1 formatında.
CMD16: 0x50 0x00 0x00 0x02 0x00 0x95
ile data yazma veya okumada kullanılacak blok uzunluğunu belirliyoruz 0x0200 512byte a karşılık geliyor, argümana 0x0010 yazsaydık 16 byte haberleşebilirdik. 0x0001 yazıp 1byte okumayı denediğimde okuma işlemi gerçekleşmişti. Bu komuttan sonra da 0x00 cevabını görene kadar cevap istiyoruz.
Bu arada her onay cevabı aldıktan sonra karta 0xFF göndererek bir sonraki komut için kartın kendini düzenlemesini sağlıyoruz.
CMD17: 0x51 0x00 0x00 0x00 0x00 0x95 komutuyla 0x00000000 adresinden itibaren blok uzunluğu kadar byte ı okumak istediğimizi belirtiyoruz. Gelen cevap 0x00 ise sorun yoktur, cevap istemeye devam ediyoruz 0xFE yi gördükten sonra okuma işlemi başlıyor. Aşağıda bunları Docklight seri port terminal programı ile yapmıştım, screentoaster azizlik yapmasaydı video olacaktı ancak gif olarak kaldı.
Herkese iyi çalışmalar.
SPI terminal olarak çalışan Atmega8 kodu
* Kullandığım kart Kingstone 2GB kart ve katalogu sitesinde yok, Sandisk MMC kart katalogunda besleme voltaj aralığı 2.7V- 3.6V olarak belirtilmiş.
İlgili diğer yazılar:
http://dergi.picproje.org/mmc-sd-kart-uygulamasi
http://www.microchipc.com/sourcecode/#mmc ve bu yazıdaki kod.
hocam öncelikle calısmalarınızda basrılar dilerim güzel seylerden bahsetmissiniz..
sd kart calısmanızı anladıgım kadarıyla sadece bilgisayar ortamında denemissiniz..
ben de birkac aydır ccs c ile sd kart programlamak icin ugrasıyorum acaba siz bu calısmalarınızı ccs c yada baska bir pic dilinde denediniz mi..ccs-c nin kendi kütüphanesindeki hazır fonksiyonlarla istediğim gibi bir neticeye ulasabilmis değilim sadece bir sektör okutabiliyorum ama onda da tek bir i karakterini okutabildim:) bu konuda bilginiz varsa yardımcı olur iseniz sevinirim…
Merhabalar, hocam ben mikrodenetleyiciyi sadece RS232-SPI dönüştürücü olarak kullandım, aslında CCS C kullanıyorum ama bu çalışmada değişiklik yapmak istedim ve winavrC ile atmega8 kullandım, kullandığım kod yazının sonunda var. SD kart haberleşme işlerini bir mikrodenetleyiciye devretmeden önce komutları bilgisayardan denemek istedim, o amaçla böyle bir şey yaptım. Yazma ve okuma ile ilgili birçok komutu da denedim ancak hazır bir kütüphane kullanarak sadece mikrodenetleyici ile bir şey yapmadım. Bilgisayardan denemeleri yaptıktan sonra çıkan sorunlara daha kolay müdahale edilebilir, mesela: Okuma komutunu verdikten sonra 00 ı alıyor musunuz, aldınız sonra 0xFE almanız gerekir onu da aldıysanız takip eden bytelarda kaç byte okumak istediğinize göre(bunu komutla belirliyoruz, CMD16) o kadar byte ı size gönderir. Siz eğer bunu 1byte ayarladıysanız bir byte okursunuz, 512 olarak ayarlarsanız sektörü okursunuz. Bildiğim kadarıyla yardımcı olmak isterim, iyi çalışmalar dilerim.
tesekkur ederim fatih hocam bilgisayardan haberlesmeyi ben de deneyim size sorularımı yazacağım..
Fatih hocam tekrar merhabalar aylar sonra tekrar sd kart yazinizi okudum elinize saglik gercekten guzel bir paylasim oldu…hocam winhex programinin kullanimindan bahsedebilir misiniz.winhex ile proteus simulasyonu icin image dosyasi olusturuluyor bildigim kadariyla..bu image dosyasinin nasil olusturuldugu hakkinda bir bilginiz var mi? calismalarinizda basarilar tesekkurler…