SPI'da microSD kart başlatma için doğru komut sırası nedir?


18

Bir microSD kartı (2 GB, Kingston, Sandisk) bir Silicon Labs C8051F931 denetleyicisi ile arayüzleştirmeye çalışıyorum .

Başlatma için takip etmem gereken dizi hakkında çok kafam karıştı. PIC Mikrodenetleyiciyi Kullanan SD Kart Projeleri kitabında , sayfa 135'den bahsediyor:

SD kartı SPI moduna geçirme adımları bu nedenle şu şekilde olmalıdır:
Açılış.
• CS ve Veri Anahatları mantık “1” olarak ayarlanmış olarak karta en az 74 saat darbesi gönderin.
• CD hattını düşük ayarlayın.
• Kartı SPI moduna geçirmek için 6 bayt CMD0 komutu “40 00 00 00 00 95” gönderin.
• Ayarlanmış hata biti olmadığından emin olmak için R1 yanıtını kontrol edin.
• R1 yanıtındaki “rölanti durumu” biti “0” olarak ayarlanana
ve hiçbir hata biti ayarlanana kadar CMD1 komutunu tekrar tekrar gönderin . Kart şimdi okuma / yazma işlemlerine hazırdır.

Bunu denedim, ama CDM1 için bile 01 alıyorum. 00 bekleniyor.

Ayrıca burada CMD0'dan sonra CMD8 gönderdiği farklı bir komut sırası görüyorum. Ancak kitap CMD1 göndermem gerektiğini söylüyor.

Doğru sıra nedir?

Yanıtlar:


34

Aslında, SD başlatma sırasında bulabileceğiniz bilgi / kodların çoğu, yıllara göre SDHC ve SDXC'den önce geldiği için tarihlidir veya zararsızdır. Prosedür günümüzde daha karmaşıktır, çünkü sizi eski donanımlarla geriye dönük uyumlu bir şekilde başa çıkmaya zorlar.

İlk olarak, başkaları tarafından belirtildiği gibi, düşük bir başlangıç ​​saat hızı seçin (genellikle 100 kHz - 400 kHz aralığında; mümkünse 400 kHz kullanın); cihaz izin veriyorsa daha sonra daha yüksek saate geçebilirsiniz. Yeni kartlar MHz-ish saatine güvenli bir şekilde dayanabilse de, daha yaşlı şikayetçi olur (yani iletişim kurmaz veya çöpü iade etmez).

Bir sonraki şey, CMD1kartınız tanımadığı sürece SD / SDHC / SDXC kartlarını başlatmak için kullanmamalısınız CMD55/ ACMD41; SD Kart spesifikasyonunda belirtildiği gibi:

Hiçbir durumda CMD1 önerilmez çünkü ana bilgisayarın MultiMediaCard ve SD Hafıza Kartı arasında ayrım yapması zor olabilir.

Bazı denetleyiciler (çoğunlukla daha yeni ve daha yüksek kapasiteli kartlar) CMD1bunları çıkarırsanız IDLE'de kalırlar . Önce CMD8 0x1AAsıfırlamadan ( CMD0) sonra çıkmalı ve sonra kullanmayı denemelisiniz CMD55 + ACMD41. Yalnızca bu başarısız olursa kullanın CMD1.

tl; dr SPI modunda yapmanız gerekir kartı başlatmak için:

  1. CMD0arg:, 0x0CRC: 0x95(response :) - yanıt veya bozuk yanıt 0x01durumunda 0xFFbu adımı tekrarlamanız gerektiğini unutmayın ; Daha fazla bilgi için aşağıya bakın.

  2. CMD8arg:, 0x000001AACRC: 0x87(yanıt:, 0x01ardından arg yankısı, bu durumda 0x000001AA) - bu komut isteğe bağlı gibi görünse de, yeni kartlar için tamamen zorunludur. 0x1AABurada ortak bir arg değeri olsa da, aslında diğer değerleri de iletebilirsiniz; bkz. "Tablo 7-5: SPI Modunda CMD8 için Kart Kullanımı", s. 108 teknik özellikler.

    3 A. CMD55arg:, 0x0CRC: herhangi bir, 0x65aslında (yanıt 0x01:; herkesinCMD55 öneki olmak ; yanıt ise , eski bir kartınız var - / yerine arg [CRC ] ile tekrarlayın ) ACMD0x05CMD10x00xF9CMD55ACMD41

    3b. ACMD41, arg:, 0x40000000CRC: herhangi bir, 0x77aslında (bu argümanın kartın bir HCS olduğunu varsaydığını unutmayın, bu genellikle durumdur; eski kartlar için 0x0arg [CRC 0xE5] kullanın ). Yanıt doğruysa 0x0, sorun olmaz; eğer öyleyse 0x01, 3a'ya git; eğer öyleyse 0x05, yukarıdaki nota bakınız (3a.); eğer ikisi de değilse, bununla ilgili bir sorun var (ayrıca aşağıya bakınız).

Kartların çoğu gerektiren adımları 3a / 3b (veya CMD1eski kartlar için), genellikle en az bir kez, tekrarlanması aralarında bir süre beklemek bile ; yani, gerçek sıra CMD0/ CMD8/ CMD55/ ACMD41/ CMD55/ ACMD41(veya CMD0/ CMD8/ CMD1/ CMD1) şeklindedir - emin olmak için, CMD55/ ACMD41(veya onlardan CMD1aldıysanız 0x05) kez deneyin ( nedeninizdeki seçin ; beklemek zorunda kalmak oldukça yaygındır) cihaz açıldıktan hemen sonra ise birkaç yüz ms, bu yüzden bunu hedefleyin), isterseniz denemeler arasında küçük gecikmelerle ve yanıt varsa başarısız olduğunu varsayalımnn0görünmüyorsa (örneğin, cihaz bir nedenden dolayı BOŞTA modunda kalıyorsa). Ayrıca, alıcı 0xFFgelen CMD0bir cihaz daha önce bazı "garip" durumunda ise yaygındır (örneğin, kafayı bazı iğneli vb, had aşırı / düşük gerilim SS [en yüksek] alnımaz var) - sadece biraz zamana, durulayın ve tekrar kez. Bozuk bir cevap bazen oldukça iyidir - eğer birkaç kez gönderdiyseniz ve cevap hala ne de değilse , ilerlemeye çalışın . Eğer işe yararsa - gitmekte fayda var; eğer yapmazsa - muhtemelen kırılmıştır .nCMD00xFF0x01CMD8

MSB'nin ayarlanmış ancak 0xFFgenellikle SPI'nızın saatte bir kayma olduğunu önermediğini unutmayın (örneğin, SD hotplugs yaparken rutin olarak gerçekleşen Vcc düşüşünün bir sonucu olarak). Düzeltmek için cihazı tamamen sıfırlamayı deneyebilirsiniz (güç açma / kapama, SeasSert / Deass / Assert vb.); o genellikle çalışır.

Ayrıca, spec diyor

Son SD Hafıza Kartı veri yolu işleminden sonra, ana bilgisayarın kartın saati kapatmadan önce işlemi tamamlaması için 8 (sekiz) saat döngüsü sağlaması gerekir.

Onsuz çalışabilir, ancak 8 döngü = 1 SPI çıkış baytı olduğundan, çok fazla zarar vermez ve buna sahip olmak iyidir.

S̲S̲'yi (aka CS) en azından her birinden önce ve sonra düşük tutmanız gerektiğini unutmayın CMD- CMD0(cihaz onsuz açılmıyorsa) ve gerçekte CMDstandartlarınız varsa diğer tüm kullanıcılar için zorunludur. uyumlu SD kart. Kartın S̲S̲'ini GND'ye kalıcı olarak bağlamak ,kartın ana makinenizin bağlanacağı tek SPI istemcisi olması iyi bir fikir olacaktır, çünkü hem uC çıkış pinini hem de kodla yönetme ihtiyacını koruyacaktır ve kartın seçili olduğunu varsayması gerekir zaman. Gerçekte, bazı kartlar (çoğu değilse), aslında sadece düşük algılamak yerine yüksek-alçak bir eğimin açılmasını bekler ve böylece S̲S̲ bitini hiç değiştirmezseniz sinirlenir ve sonra da saatler veya çöp tükürmek; bazı (genellikle daha yeni) kartlar çalışmalıdır, bazı (daha eski) çalışmayabilir, YMMV (yine). Yine de, daha sağlam SPI yapılandırması (> 1 bağımlı cihaz) için, belirtilen SD kartla herhangi bir gerçek işlemden önce pimi düşük tutmayı unutmayın.

Ayrıca, spec SPI modunda sadece CMD0ve CMD8CRC olması gerektiğini söylese de , bazı SD kartlar (Transcend olanlar gibi)CMD55 / ACMD41için güvenli CRC gerektiriyor gibi görünüyor - eğer güvenli tarafta olmak istiyorsanız, onlar için önceden hesaplanmış bir değer kullanın.

Ayrıca, SPI kendi başına pull-up / downs gerektirmezken, MISO'ya 47k pullup atmak iyi bir fikir olabilir; bazı cihazlar DO pinlerini belirli koşullar altında yüksek Z olarak bırakır (başlatılmaz örneğin) ve yüzen pimler her zaman garip sorunların kaynağı olabilir. Eğer sizin uC 3.3 Vcc vardır, dahili pullups kullanabilir; 5V ise, MISO hattınız zaten 5-3.3V mantık çevirisine sahip değilse bunu yapmayın.

Daha fazla okuma:

MMC / SDC Nasıl Kullanılır

SD Özellikleri 1. Bölüm Basitleştirilmiş Fiziksel Katman Basitleştirilmiş Şartname - en önemlisi bölümler 6.4.1 güç verin ve 7.2.1 Mod Seçme ve başlatma ile Şekil 7-1 : SD Bellek Kartı Durum Çizelgesi (SPI modu)


4

SD Kart teknik özellikleri sdcard.org adresinde mevcuttur . Basitleştirilmiş sürüm bazı ayrıntıları dışarıda bıraktı, ancak örneğin SDHC ve SD kartlar için başlatma dizilerinin açıklandığı bölüm 1'deki şekil 7-2'ye bakmalısınız.

MicroSD kartlar <= 2 GB daha eski kartlar gibi çalışabilir, bu nedenle sonuçta size 0x00sonuç vermelidir . Bu kart birkaç yeniden denemeden daha fazlasına ihtiyaç duyabilir, çünkü kart bazı dahili işlemleri yürütmek için SPI veri yolundaki harici saati kullanabilir.CMD1


2

@Vaxquis mükemmel cevabına ek olarak, " Fiziksel Katman Basitleştirilmiş Şartname Sürüm 4.10 , © Telif hakkı 2001-2013 SD Grubu (Panasonic, SanDisk, Toshiba) ve SD Kart Birliği" (Şekil 7-2) : SPI Mode Initialization Flow) ile ilişkili olan kısmını dışarı aktarmak suretiyle yedek oluşturmanız gerekir:

SD Kart SPI Başlangıç ​​Sırası

Burada hangi komutların hangi sırayla gönderileceğini ve yanıtların kart türü hakkında bize ne söylediğini görebilirsiniz. Bir cihazın olabildiğince çok kartı desteklemesi arzu edilir; ve 512 baytlık blokları okuma ve yazma temel işlemleri söz konusu olduğu sürece, bu en azından tüm V1.x ve V2.0 SD ve HC kartları için yapılabilmelidir.


2

Bunu başka bir seçenek olarak sunuyorum .. SPI modunda, Samsung MicroSD EVO 32GB tüm komut kodlarının geçerli CRC kodlarına sahip olmasını gerektirir. Eminim sadece onlar değil. Kişinin 32GB üzerindeki tüm kartların bu şekilde olabileceğine inandığı bir yorum okudum. Ben bir haftadan fazla bir hata ayıklama. Karta gönderilen tüm kodlar geçerli crc kodlarına sahip olmadan kodum çalışmaz. Bunu tüm CRC kodlarını hesaplamak için kullandım https://github.com/hazelnusse/crc7/blob/master/crc7.cc Hatta CRC kodlarını kapatmak için bir komut 59 kullanmayı denedim, hayır. Umarım bu başka birine zaman ve emek tasarrufu sağlar.

CRC değerlerine sahip başlatma kodum ..

Power On..
Clock card at least 74 (I use 80) cycles with cs high
CMD0 0, crc=0x95
CMD8 0x01aa, crc=0x87
CMD58 0, crc=0xfd
CMD55 0, crc=0x65
CMD41 0x40000000, crc=0x77
CMD9 0, crc=0xaf
CMD16, 512, crc=0x81 (If you want block length of 512)

Some random other commands..
CMD17 0, crc=0x3b (Read one block)
CMD18 0, crc=0x57 (Read multiple blocks)
CMD24 0, crc=0x6f (set write address for single block)
CMD25 0, crc=0x03 (set write address for first block)

-2

SPI veri yolunuzun 400 kHz'de olduğundan emin misiniz? Başlatma, SD Kart, SPI veri yolu saat hızının artırılabileceği boşta olduğunu bildirene kadar 400 kHz'de çalışan SPI veriyolu ile yapılmalıdır (tam maksimum, üreticiden üreticiye değişiyor gibi görünüyor, ancak öyle görünüyor) 12 MHz çoğu kart için güvenli bir bahistir).

Ayrıca, buna göre: http://elm-chan.org/docs/mmc/mmc_e.html CMD1 doğru başlatmadır. CMD8, yalnızca SDHC olmayan (<= 2GB) kartlarla ilgili bir sorun olmaması gereken voltaj aralığını sorgulamak için gereklidir.


aslında, birçok SD kart (çoğunlukla daha yenileri, Sony SR-32C4 32GB'ım bir tane) önceden verilmeden başlamayacak CMD8. Ayrıca, mantıklı aralıkta olduğu sürece saat genellikle bir sorun değildir.
vaxquis

-3

Belki bu çok geç, ama karttan cevap tamam! CMD0'dan sonra yanıt 0x01 olmalıdır - bu, kartın BOŞTA durumunda ve çalışmaya hazır olduğu anlamına gelir. 0b00000101 gibi bir şeyiniz varsa, 2. sıradaki 1, bunun yasadışı bir komut olduğunu ve 0-s üzerindeki 1, sard'ın hala IDLE durumunda olduğunu ve çalışmaya hazır olduğunu söylüyor. Yanıt 0x00 ise, kart IDLE durumunda DEĞİLDİR ve başka bir RESET komutu göndermeniz gerekir.


soruyu hiç okudun mu? OP açıkça söyledi I tried this, but I am getting 01 even for CDM1- cevaben RÖLANTİ alma CMD1içinde DEĞİL OK. Onun "problemine" ilişkin gerçek sorununu ele almıyorsun.
vaxquis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.