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, CMD1
kartı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) CMD1
bunları çıkarırsanız IDLE'de kalırlar . Önce CMD8 0x1AA
sı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:
CMD0
arg:, 0x0
CRC: 0x95
(response :) - yanıt veya bozuk yanıt 0x01
durumunda 0xFF
bu adımı tekrarlamanız gerektiğini unutmayın ; Daha fazla bilgi için aşağıya bakın.
CMD8
arg:, 0x000001AA
CRC: 0x87
(yanıt:, 0x01
ardından arg yankısı, bu durumda 0x000001AA
) - bu komut isteğe bağlı gibi görünse de, yeni kartlar için tamamen zorunludur. 0x1AA
Burada 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. CMD55
arg:, 0x0
CRC: herhangi bir, 0x65
aslında (yanıt 0x01
:; herkesinCMD55
öneki olmak ; yanıt ise , eski bir kartınız var - / yerine arg [CRC ] ile tekrarlayın ) ACMD
0x05
CMD1
0x0
0xF9
CMD55
ACMD41
3b. ACMD41
, arg:, 0x40000000
CRC: herhangi bir, 0x77
aslında (bu argümanın kartın bir HCS olduğunu varsaydığını unutmayın, bu genellikle durumdur; eski kartlar için 0x0
arg [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 CMD1
eski 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 CMD1
aldı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ımnn0
görünmüyorsa (örneğin, cihaz bir nedenden dolayı BOŞTA modunda kalıyorsa). Ayrıca, alıcı 0xFF
gelen CMD0
bir 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 .nCMD0
0xFF
0x01
CMD8
MSB'nin ayarlanmış ancak 0xFF
genellikle 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 CMD
standartları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 CMD0
ve CMD8
CRC olması gerektiğini söylese de , bazı SD kartlar (Transcend olanlar gibi)CMD55
/ ACMD41
iç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)
CMD8
. Ayrıca, mantıklı aralıkta olduğu sürece saat genellikle bir sorun değildir.