SD Kart CMD18 TopluOkuma

Başlatan Ali_54, 27 Ocak 2014, 19:08:00

Ali_54

SD karta şu şekilde bağlanıyorum.

sd_init() içerisinde
CMD1
CMD0 Yaparak spi moduna geçiyorum.

sd_oku(int32 adress);  içerisinde,
CMD17 ile adresle verilen sektörü okuyorum.

sd_yaz(int32 adress); içerisinde,
CMD24 ile 512 byte data yazıyorum.

hatta,
topluoku(int32 adress) içerisinde
CMD18 ile CMD12 göndericeye kadar tıkır tıkır sektörleri ardışık okuyorum. ki bu benim için süper.

Sorun şu ki,
topluoku() bir defalığına beklenen şekilde çalışıyor. AMA


topluoku() (CMD18) i bir defa çağırdıktan sonra gelen komutlar çalışmaz oluyor. atıyorum yenden bir CMD18 yada CMD17 çağırmaya kaltığımda hata alıyorum. (aldığım hata yanıtı 0x05). Günlerdir çabalıyorum. yabancı kaynaklarda da gezindim.

Bu arada şunu da belirteyim. sd_init() te, CMDO için 0x01 CMD1 içinse yine 0x01 alıyorum. (CMD1 için beklenen 0x00). Ama buna rağmen sonra gelen okuma komutlarında problem yok.

Herneyse madem kodumda biryerde hata var. dedim her seferinde kartı resetleyeyim diye topluoku() sonuna da spi_init() attım. ama farketmedi. Enerjiyi kesmeden düzelmiyor.

topluoku() içeriğim şöyle:
       printf("\nCMD18 Toplu Okuma");
       output_low(cs);   
       spi_write(0x52);      // CMD18 KOMUTU
       parametre(adres);   // 32 bİTLİK ADRES Parametresi
       spi_write(0x01);      // crc GÖNDERİMİ
       
            KartCevap = 0xFF;
            while(0xFF == KartCevap) // karttan 0x00 gelene kadar bekle
           {
               KartCevap = spi_read(0xFF);
               delay_ms(1);
           }
             printf("\rCMD18 yanit = 0x%02X",KartCevap); // Normalde 0x00 geliyor. tekrar fonk. çağrınca 0x05 ve kilit!!!
            
            
             
             KartCevap = 0xFF;
             while(0xFF == KartCevap) // karttan 0xFE gelene kadar bekle (data okumanın başlangıcı)
           {
               KartCevap = spi_read(0xFF);
               delay_ms(1);
           }
            printf("\rCMD18 2. yanit = 0x%02X",KartCevap); // 0xFE gelir
            
            i=0;
            while(i<5000)  // 5000 byte oku
            {
                  i++;
                  KartCevap = spi_read(0xFF);
                  output_d(KartCevap);
                  // printf("%lu. 0x%02X - %u\n",i,KartCevap,KartCevap);  // SD KART OKUNUYOR...
                  delay_us(30);
            }
       
       spi_write(0x4c);   // CMD12 Tüm yazma-okuma işlemlerini sonlandır komutu
       parametre_write(0x00000000);  // 32 bİTLİK ADRES Parametresi
       10 tane 0xff yolla;
       output_high(cs);
       10 tane 0xff yolla;
       sd_init();
       printf("Toplu okuma bitti");


bir kaç haftadır SD Kart konusuna boğuldum gittim. kuyruğuna kadar gelmişken hazır kütüphanelere geçmek zorunda kalmak istemiyorum :(
1 harf öğretenin 4 gün kölesi olurum.

Ali_54

#1
Lütfen SDKartçılar... ben var çıldırmak..
1 harf öğretenin 4 gün kölesi olurum.

RaMu

spi_write(0x4c);   // CMD12 Tüm yazma-okuma işlemlerini sonlandır komutu
       parametre_write(0x00000000);  // 32 bİTLİK ADRES Parametresi
       10 tane 0xff yolla;
       output_high(cs);
       10 tane 0xff yolla;
       sd_init();
       printf("Toplu okuma bitti");


tekrar init i fazladan yaptım demişsin zaten neyse,
ama cmd12 için crc göndermemişsin,
crc yi kapattınmı bilmiyorum,
crc yi kapatmadıysan doğru crc yi
kapattıysanda yanlış hatırlamıyorsam 0x00 olarak komutun 6. byte ını yani crc yi göndermelisin,
crc olsun olmasın komutlar 6 byte gönderilmek zorundadır.

Ayrıca cmd12 yi kart aldımı işledimi kontrol etmelisin,
cmd12 response ları neler bir bak ona göre almak gereken cevabı kontrol et geliyormu diye,
ve cmd12 veya herhangibir komutu göndermeden önce sd kart meşgulmü değilmi bakmalısın,
özellikle sd karta yazma yaparken sd kart a veriyi gönderdikten bir müddet sonra dahi meşgul olabiliyor
buda gönderilen komutun alınmamasına sebep olur, komuttan sonraki response larla bunu anlayıp önleyebiliyorsun.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Ali_54

SPI moddayım zaten CRC kullanılmıyor ki SPI modunda? crc yerine 0xff gönderdim. kodda var.
cmd12 nin yanıtı r1b imiş.  cmd12 için karttan 4 byte ıvır zıvır bilgi geliyor. Anlamı ne bunların? gösteren bi döküman hiç görmedim.

karta yazma konusunda sıkıntı yok zaten. yazıyorum, ardından gelen komutlar da çalışıyor. CMD18 ve/veya cmd12 çalıştıktan sonra kartı kitliyor.
1 harf öğretenin 4 gün kölesi olurum.

RaMu

ıvır zıvır dediklerinin anlamı için kaynak paylaşmıştık yokmuymuş orada
https://www.picproje.org/index.php/topic,49787.15.html
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Ali_54

O konuyu ve paylaşılan dökümanların çoğunu incelemiştim. komutlar geçiyor tabi. ama ıvır zırvıra rastlamadım. Varsa Gözümden kaçmışta olabilir. bir kaç gündür kaynak okuyup duruyorum zaten.
1 harf öğretenin 4 gün kölesi olurum.

RaMu

Ben paylaştığım sd kart pdflerini 1 kaç yıldır okuyorum
değişen pekbirşey olmadı :)
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html