18

AĞS

2010

SD Kart Programlama Klavuzu

Yazan: Barış Samancı

sd programlama klavuzu kapak

Bu yazıda SD kartların kullanımı üzerine yazdığım e-kitabımın özetini bulacaksınız. SD (Secure Digital) kartlar MMC (Multi Media Card) kartlar temel alınarak Panasonic (Matsushita), SanDisk ve Toshiba tarafından geliştirilmeye başlanmış ve 2000 yılının başında ilk SD kartlar piyasaya sürülmeye başlanmıştır. Bu üç firma aynı zamanda 2000 yılının başında ortak karar alıp "SD Card Association" adında bir topluluk kurmuş ve SD kart teknolojisini standarta bağlamıştırlar. Bu yüzden MMC kartlar geri planda kalırken SD kartlar ön plana çıkıp gelecek vaat etmeye başlamıştırlar. İlk çıkan SD kartlar 32MB-64MB hafıza kapasitesine sahiptiler. Daha sonra bu kapasite limit 2GB a kadar çıkmış ve yetersiz kalması sonucu SDHC kartlar üretilmeye başlanmıştır. SDHC (SD High Capacity) kartlar daha hızlı çalışmakta ve daha fazla hafıza bölgesini adreslemektedirler. 4-8-16-32GB gibi hafıza kapasitelerine çıkmıştırlar. SD kartlar daha çok cep telefonu, cep bilgisayarı, dijital kamera ve fotoğraf makinalarında kullanılmaktadırlar. Bu yüzden gelişen high defination görüntü teknolojileri ve zamanla artan dosya boyutları yüzünden SDHC kartlarda yetersiz gelmeye başlamış ve 2TB'a kadar adresleme yapabilen SDXC (SD Extended Capacity) kartlar geçtiğimiz aylarda duyurulmuş ve ilk örnekleri piyasaya sürülmüştür. Şuan daha üretilmesede 2TB lık micro SD kart baya ilgi çekici durumda :) Şimdi işin hikaye kısmını bırakıp teknik kısmına geçelim :) Bu yazıda e-kitabımın özetini bulacaksınız. İlginizi çekerse yazının sonundaki linkten indirebilirsiniz.

SD kartların iki adet haberleşme modu vardır. Bu modlar kartın varsayılan modu olan SD modu ve SPI modudur. Kart ilk enerjilendiğinde doğal modu olan SD modunda açılır. Kullanıcı isterse SPI moduna geçirebilir. Bu yazıda ilk önce SD moduna değinilecek, SD modu ile birlikte kartın çalışma mantığı ve saklayıcıları anlatılacaktır. Ardından SPI modu SD modundaki bilgilere dayanılarak anlatılacaktır.

SD Kart SD Modu

SD kart ile haberleşirken karta komut göndermemiz gerekmektedir.Kartın içerisinde kapsamlı bir durum makinası vardır ve çeşitli komutlarla durumdan duruma atlar veya duruma ait verileri bekler. Kart gönderdiğimiz komutlara karşılık bazı komutlar için bize cevap göndermektedir. Komut ve cevap mekanizması sayesinde karta veri yazabilir veya okuyabiliriz. Veri uzunluğu, cevap uzunluğu ve içeriği değişirken komutların uzunluğu sabit 48 bittir. Komutların sadece index alanı ve parametre alanı değişmektedir.Komutlar index alanındaki sayıya göre CMDolarak isimlendirilmektedirler.. Bir komutun standart çerçevesi aşağıdaki gibidir.

SD kart komut çerçevesi

Komutlar başla biti olan 0 ile başlar ve dur biti olan 1 ile biterler. İkinci bitleri haberleşmenin yönünü göstermektedir ve işlemciden karta olduğu için 1 dir. Bu bitin ardından içerik alanı gelmektedir. İçerik alanında komut indexi ile komutun ne olduğu anlaşılabilir. Bu alan binary kodlanmıştır. Aynı şekilde komut ile taşınması istenen bir parametre varsa içerik alanında taşınmaktadır. Komutlar iletim hatalarına karşı yedi bitlik CRC ile korunmaktadırlar.

Bazı komutlara karşı kart cevap göndermektedir. Bir kaç cevap formatı vardır. Uzunlukları 48 bit yada 136 bittir. Cevaplar Rx olarak isimlendirilmektedirler.Genel olarak cevap formatları aşağıdaki gibidir.

SD kart cevap çerçeve

Şekilden görüldüğü gibi cevaplarda başla ve dur bitlerini kullanmaktadırlar.Verinin yönünün karttan işlemciye olduğunu gösteren transmitter biti '0' dır. R1, R3, R6 cevapları 48 bit uzunluğundadır ve belli komutlara karşılık gönderilmekte ve içerik alanları buna göre değişmektedir. R2 cevabında ise içerik alanında CID veya CSD saklayıcısı taşınmaktadır.

SD kartlarda bir takım saklayıcılar vardır. Bu saklayıcılar bize kartın üretimi, durumu ve çalışması esnasında bir takım bilgiler sağlarlar. Saklayıcıların içeriğine burada değinilmeyecektir.Bu saklayıcılar aşağıdaki tablodaki gibidir.

İSİM
UZUNLUK
AÇIKLAMA
CID
128
Kartın kimlik doğrulama için bireysel ID numarası. (Zorunlu)
RCA
16
Karta kurulum esnasında işlemci tarafından atanan kart adresi (Zorunlu)
DSR
16
İsteğe bağlı olarak veri yolunun performansını arttırmak için genişletilmiş çalışma koşullarını kullanmamızı sağlar. Varsayılan olarak 0x404 tür (Seçmeli)
CSD
128
(Card Spesific Data) Bu saklayıcı karta özel çalışma şartlarını saklar. Ayrıntılı bilgi için SD kart datasheetine bakabilirsiniz. (Zorunlu)
SCR
64
SD Konfigürasyon saklayıcısı. SD kartın özellikleri yetenekleri hakkında bilgi sağlar. Ayrıntılı bilgi için SD kart datasheetine bakabilirsiniz. (Zorunlu)
OCR
32
(Operation conditions register) Kartın VDD besleme gerilimi ve power up zamanı için bilgi bitlerini içerir. (Zorunlu)
SSR
512
SD Status Register.  Kartın tescilli özellikleri hakkında bilgi verir. (Zorunlu)
CSR
32
Card Status Register. Kartın durumu hakkında bilgi verir. (Zorunlu)

 

SD kart ilk açıldığında boşta (idle) modundadır. Bir takım komut dizileri ile kartın bazı bilgileri okunur ve kartın durum makinası sayesinde kart adım adım veri transferleri için bekleme (stand by) durumuna alınır. Burda gönderilen komutları ve ne oldukları açıklanmayacaktır. Sistemin ne şekilde işlediği anlatılmaktadır. Aşağıdaki şekilde gönderilen komutlar ile kartın başlangıçtaki kurulum işlemlerinin nasıl yapıldığı gösterilmektedir. Kart CMD3 komutundan sonra veri haberleşmesine hazır hale gelmektedir.

SD card initilization

 

CMD3 komutundan sonra kart artık bekleme durumunda ve veri haberleşmesine hazır haldedir. Kart CMD3 komutu ile RCA diye adlandırılan bir adresini işlemciye bildirmektedir.İşlemci sistemde bir kart ile haberleşeceği zaman CMD7 komutu ile bahsettiğimiz RCA adresi belli olan bir kartı seçer. Seçilen kart bekleme durumundan transfer durumuna geçer ve gelecek olan okuma ve yazma komutlarını beklemektedir. Bu durum aşağıdaki şekilde gösterilmiştir.

SD card transfer state diagram

 

 

Yukarıdaki şekilde haberleşmenin hangi komutlar ile yapıldığında kartın tepkisini ve geçtiği durumu görebilirsiniz. Veri okuma ve yazma işlemleri tek ve çoklu bloklar halinde yapılabilir. Blok okuma ve yazma komutlarından sonra kart istenilen bloğu işlemciye gönderir yada işlemciden gelen bloğu karta yazar. Çoklu blok işlemlerinde ise kart blokları işlemci dur diyene kadar ard arda göndermekte veya almaktadır.Bu sayede tek tek blok okumaya göre hız kazanılmaktadır. Veri yazımında ise verinin hafıza çipine programlanması zaman aldığından kart veriyi yazarken meşgul olabilir. Bu durumda kart DAT0 hattını düşük seviyeye çekerek işlemciyi durumdar haberdar etmektedir.

Kartın SD modunda açıldığını söylemiştik. Kartın SPI moduna geçmesi için resetleme işlemi esnasında CS pininin düşük seviyede olması gerekmektedir. Kart bu sayede SPI moduna geçer ve güç kesilene kadar SPI modunda haberleşmeye devam eder. SPI modunun avantajı SPI donanımı bulunan herhangi bir mikrodenetleyiciden karta yazım veya okuma yapılabilir. SD moduna göre en önemli dezavantajı hızın bük ölçüde düşmesidir. Çünkü SD modunda komut ve cevaplar özel olarak ayrılmış CMD hattından iletilirler ve veriler DAT hatlarından 4 bit paralel olarak iletilirler. SPI modunda ise komut ve cevaplarda veri hatları üzerinden iletilir. Üstelik bu hatlar bir bitliktir.

SD Kart SPI Modu

SD modunda kartın bazı komutlara cevap verdiğini söyledik. SPI modunda ise kart tüm komutlara bir cevapla karşılık vermektedir. Ayrıca SPI modunda varsayılan olarak CRC kontrolü pasiftir fakat özel bir komut ile aktif edilebilir. Sadece ilk gönderilen CMD0 komutunda CRC bitleri kullanılmaktadır çünkü kart bu esnada SD modundadır. SPI modundaki cevap yapılarıda SD moduna göre farklıdır. Bu cevaplardan R1 cevabı her komutta gönderilmektedir 1 byte uzunluğundadır. Yapısı aşağıdaki gibidir.

SD card SPI response r1

In Idle State:
Kart boşta durumundadır ve kurulum (initialization) işlemleri devam etmektedir.
Erase Reset: Silme işlemleri için kullandığımız silme komut dizisi tamamlanmadan arada başka bir komut geldi.
Illegal Command: Geçersiz bir komut kodu tespit edildi.
Com CRC Error: Son komutun CRC kontrolü geçersiz.
Erase Sequence Error: Silme komut dizisi içerisinde bir hata oluştu.
Address Error: Komut içerisinde blok uzunluğu ile uyuşmayan kaymış bir adres kullanıldı.
Parameter Error: Komutun parametresi (adres, blok uzunluğu) kart için izin verilen sınırların dışına taştı.

R1 cevabı diğer cevaplardan önce gönderilmektedir. R2 cevabı 2 byte uzunluğundadır ve ilk byte ı R1 dir. Yapısı aşağıdaki gibidir.

SD card SPI r2 response

Erase Param
: Silmek için geçersiz bir seçim yapıldı (sektörler, gruplar)
Write Protect Violation: Komut yazma korumalı bir alana yazmaya çalıştı.
Card ECC Failed: Kartın dahili ECCsi kullanıldı fakat veriyi düzeltemedi.
CC Error: Dahili kart kontrolcüsünde hata oluştu.
Error: Bilinmeyen veya genel bir hata oluştu.
Write protect erase skip | lock/unlock command failed: Bu bitin iki fonksiyonu vardır. İlki işlemci yazma korumalı bir alanı silmeye çalışığında set olur. İkincisi kart kilitleme, kilit açma işlemlerinde komut dizisi yanlış yada şifrede hata oluşmuştur.
Card Locked: Kart kullanıcı tarafından kilitlendiğinde set olur.

 

Aynı şekilde R3 ve R7 cevap formatlarıda vardır. R3 OCR saklaıcısını taşırken R7 cevabı CMD8 saklayıcısına yanıt olarak dönmektedir. SPI modunda ayrıca veri gönderilirken ve veri alındıktan sonra bazı işaretler kullanılmaktadır. Bunlar verinin başlangıcını belli eden ve kartın meşgul olduğunu bildiren işaretlerdir. Bunlar kitapta anlatılmıştır. Kitabı datasheetlerden ve SD modunda yaptığım örneklerden yola çıkarak ve minimize etmeye çalışarak yazdım. SD modundaki bilgiler 2GB lık kart ile test edilip herhangi bir hata ile karşılaşılmamıştır.SPI modu denenmemiştir. Bu yüzden kitap genelinde hata veya eksiklikler olabilir. Fark ettiklerinizi iletişim sayfasından bana bildirirseniz gerekli düzeltmeleri yaparım. Dosyayı indirmek için aşağıdaki linki kullanabilirsiniz.

SD Kart Programlama Klavuzu (2.07Mb)

 

Yorumlar
KIRIKDR
20 Ağu 2010 Cuma, 10:37 tarihinde yazmış.

hocam harika bir kitap olmuş eline sağlık kaçtır arıyorum böyle bir kaynağı

21 Ağu 2010 Cumartesi, 01:24 tarihinde yazmış.

Eline sağlık Barış hocam, çok güzel bir kaynak olmuş. İyi çalışmalar, başarılar dilerim.

Mehmet
29 Eyl 2010 Çarşamba, 14:34 tarihinde yazmış.

Eline sağlık hocam. Teşekkür ederim.

Fevzi YAZGAN
01 Eki 2010 Cuma, 00:49 tarihinde yazmış.

Pic ile SD-CARD üzerindeki bir txt dosyasının içerisindeki 90 milyona yakın sayıyı değişik sıralamalarla çağırmak için sektör okuyarak bir uygulama yapmıştım ve bu benim Pic'teki ilk uygulamamdı. Kendimi yeni bir şey keşfetmiş gibi hissetmemde belkide bundandır fakat sizin bu yazılarınızı görünce ne kadar dağınık çalıştığımı fark ettim. Çalışmalırınız çok güzel ilerideki hayatınızda başarılar diliyorum. Dökümanlar için teşekkürler.

Celalettin
11 Kas 2010 Perşembe, 16:34 tarihinde yazmış.

Ülke ve meslek adına yaptığın site için ilgili herkes sana müteşekkir olmalı.Dilerim hayatta herşey gönlünce olur ve bu paylaşımlar ülkede artarak çoğalır...

11 Kas 2010 Perşembe, 16:42 tarihinde yazmış.

Teşekkür ederim. Benimde dileğim o zaten. Yaptıklarımı yayınlıyorum, başkalarınında bunları geliştirip üzerine birşeyler koyup yayınlamasını, onlarında bana farklı şeyler öğretmesini diliyorum. Ama başkaları benim gibi cömert davranıp, saklamayıp paylaşırmı bilmem.

29 Eyl 2012 Cumartesi, 17:18 tarihinde yazmış.

Selamlar Barış Kardeşim, Dökümanları çok güzel hazırlamışsın ellerine sağlık oldukça yararlı.Emeklerin için çok teşekkürler.

Adınız *:
e-Mail Adresiniz *:  ??
Web Siteniz:
Yorumunuz *:
Kalan karakter sayısı: 500
 
 

Tasarım ve Programlama Barış SAMANCI
Her hakkı saklıdır.
barissamanci.net  ©  2010-2018