fatiherdem.net üstresimdir
SD karttan ilk sektörü okuyalım / 19 Eylül 2010

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: 0×40 0×00 0×00 0×00 0×00 0×95
ile kartı resetleyip “idle state”e alıyoruz, 0×01 cevabını görene kadar(komutun işlendi bilgisi) cevap istiyoruz. İlk 4-5 byte da 0×01 cevabını alamadıysak komutu tekrar gönderiyoruz. İlk 4-5 diyorum, belki daha da uzatılabilir.
CMD1: 0×41 0×00 0×00 0×00 0×00 0×95
ile kartı “idle state” ten çıkarıyoruz, sondaki CRC bilgisinin sadece CMD0 da önemi var, 0×95 olarak bıraktık. Bu komuttan sonra 0×00 cevabını görene kadar cevap istiyoruz. İlk 4-5 byetta 0×00 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: 0×50 0×00 0×00 0×02 0×00 0×95
ile data yazma veya okumada kullanılacak blok uzunluğunu belirliyoruz 0×0200 512byte a karşılık geliyor, argümana 0×0010 yazsaydık 16 byte haberleşebilirdik. 0×0001 yazıp 1byte okumayı denediğimde okuma işlemi gerçekleşmişti. Bu komuttan sonra da 0×00 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: 0×51 0×00 0×00 0×00 0×00 0×95 komutuyla 0×00000000 adresinden itibaren blok uzunluğu kadar byte ı okumak istediğimizi belirtiyoruz. Gelen cevap 0×00 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ı.
Ekran1, Hex
sd_2
sd_2_ascii
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.

“SD karttan ilk sektörü okuyalım” için 4 Yorum

  1. KIRIKDR

    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…

  2. admin

    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.

  3. KIRIKDR

    tesekkur ederim fatih hocam bilgisayardan haberlesmeyi ben de deneyim size sorularımı yazacağım..

  4. KIRIKDR

    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…

Yorum Yapın

2007 © fatiherdem.net | İrtibat Formu | RSS