W rzeczywistości większość informacji / kodu, które można znaleźć podczas inicjalizacji SD, jest albo datowana, albo niedokładna, ponieważ wyprzedza SDHC i SDXC o lata. Procedura jest obecnie bardziej skomplikowana, ponieważ zmusza cię do radzenia sobie ze starym sprzętem w sposób zgodny z poprzednimi wersjami.
Po pierwsze, jak wspomniali inni, wybierz niską początkową częstotliwość taktowania (zwykle w zakresie 100 kHz - 400 kHz; użyj 400 kHz, jeśli to możliwe); będziesz mógł później przejść na wyższy zegar, jeśli pozwala na to urządzenie. Podczas gdy nowe karty mogą bezpiecznie wytrzymywać taktowanie MHz, starsze będą narzekać (tj. Nie komunikować się ani nie zwracać śmieci).
Następną rzeczą jest to, że nie powinieneś używać CMD1
do inicjalizacji kart SD / SDHC / SDXC, chyba że twoja karta nie rozpoznaje CMD55
/ ACMD41
; jak powiedziano w specyfikacji karty SD:
W żadnym z przypadków CMD1 nie jest zalecane, ponieważ host może mieć trudności z rozróżnieniem karty MultiMediaCard i karty pamięci SD.
Niektóre kontrolery (głównie nowsze i karty o większej pojemności) po prostu pozostaną bezczynne, jeśli CMD1
je wydasz . Najpierw powinieneś wydać polecenie CMD8 0x1AA
po resecie ( CMD0
), a następnie spróbować użyć CMD55 + ACMD41
. Jeśli i tylko jeśli to się nie powiedzie, użyj CMD1
.
tl; dr, aby zainicjować kartę w trybie SPI, powinieneś:
CMD0
arg:, 0x0
CRC: 0x95
(odpowiedź:) 0x01
- zwróć uwagę, że w przypadku 0xFF
zniekształconej odpowiedzi powinieneś po prostu powtórzyć ten krok; więcej informacji znajdziesz poniżej.
CMD8
arg:, 0x000001AA
CRC: 0x87
(odpowiedź 0x01
:, po którym następuje echo arg, w tym przypadku 0x000001AA
) - chociaż może się wydawać, że to polecenie jest opcjonalne, jest całkowicie obowiązkowe dla nowszych kart. Chociaż 0x1AA
jest to wspólna wartość argumentu, możesz faktycznie przekazać także inne wartości; patrz „Tabela 7-5: Działanie karty dla CMD8 w trybie SPI”, s. 1. 108 w specyfikacji dla szczegółów.
3a. CMD55
arg:, 0x0
CRC: any, 0x65
faktycznie (odpowiedź 0x01
:; CMD55
będący przedrostkiem każdego ACMD
; jeśli odpowiedź brzmi 0x05
, masz starą kartę - powtórz CMD1
z arg 0x0
[CRC 0xF9
] zamiast CMD55
/ ACMD41
)
3b. ACMD41
, arg:, 0x40000000
CRC: any, 0x77
faktycznie (zauważ, że ten argument zakłada, że karta jest HCS, co zwykle ma miejsce; użyj 0x0
arg [CRC 0xE5
] dla starszych kart). Jeśli odpowiedź brzmi 0x0
, wszystko jest w porządku; jeśli to jest 0x01
, goto 3a; jeśli tak 0x05
, patrz uwaga na ten temat powyżej (w 3a.); jeśli tak nie jest, coś jest nie tak (patrz również poniżej).
Większość kart wymagaCMD1
powtórzenia kroków 3a / 3b (lub w przypadku starych kart), zwykle przynajmniej raz, nawet jeśli odczekasz chwilę między nimi ; tzn. faktyczna sekwencja to CMD0
/ CMD8
/ CMD55
/ ACMD41
/ CMD55
/ ACMD41
(lub CMD0
/ CMD8
/ CMD1
/ CMD1
) - dla pewności wypróbuj CMD55
/ ACMD41
(lub CMD1
jeśli 0x05
je otrzymałeś ) razy (wybierz w swoim rozsądku; w rzeczywistości dość często trzeba czekać kilkaset ms, jeśli urządzenie jest tuż po włączeniu zasilania, więc celuj w to), z małymi opóźnieniami między próbami, jeśli chcesz, i zakładaj porażkę, jeśli odpowiedźnn0
nie pojawia się (tzn. jeśli z jakiegoś powodu urządzenie pozostaje w trybie bezczynności). Również otrzymywanie 0xFF
od CMD0
powszechnie jeśli urządzenie było w jakimś „dziwne” stanu poprzednio (np odłożył, dostał SS dezaktywowane [Wysoka], miał nad- / podnapięciowe na niektóre kołki itd.) - po prostu dać mu trochę czasu, spłukać i powtórzyć razy. Zniekształcona odpowiedź jest czasami OK - jeśli wysłałeś ją kilka razy, a odpowiedź nadal nie jest ani , ani więcej , spróbuj iść dalej . Jeśli to działa - możesz iść; jeśli nie - prawdopodobnie jest zepsuty .nCMD0
0xFF
0x01
CMD8
Zauważ, że odpowiedzi, które mają ustawiony MSB, ale 0xFF
zwykle nie sugerują, że twój SPI zmienił taktowanie (w wyniku np. Spadku Vcc, co zdarza się rutynowo, gdy robisz hotplugs SD). Aby to naprawić, możesz spróbować całkowicie zresetować urządzenie (włączanie / wyłączanie zasilania, deassert / assert S̲S̲ itp.); to zwykle działa.
Ponadto specyfikacja mówi
Po ostatniej transakcji magistrali na karcie pamięci SD host jest zobowiązany do zapewnienia 8 (ośmiu) cykli zegara, aby karta zakończyła operację przed wyłączeniem zegara.
Może bez niego działać, ale ponieważ 8 cykli = 1 bajt wyjściowy SPI, nie zaszkodzi zbytnio i dobrze jest go mieć.
Pamiętaj, że powinieneś potwierdzić S̲S̲ (aka CS) niski przynajmniej przed i po każdym CMD
- jest to całkowicie obowiązkowe w przypadku CMD0
(urządzenie nie włączy się bez niego), a w rzeczywistości jest wymagane dla wszystkich innych CMD
s, jeśli masz standardy -zgodna karta SD. Łączenie S̲S̲ karty z GND może się wydawać na stałebyć dobrym pomysłem, jeśli karta jest jedynym klientem SPI, z którym host będzie się kiedykolwiek łączył, ponieważ pozwoliłoby to zaoszczędzić zarówno pin wyjściowy uC, jak i potrzebę zarządzania nim za pomocą kodu, i ponieważ karta powinna zakładać, że jest wybrana wszystkie czasu. W rzeczywistości niektóre karty (jeśli nie większość) oczekują włączenia wysokiego lub niskiego nachylenia zamiast po prostu wykrywania niskiego, a więc złościć się, jeśli w ogóle nie przełączysz nieco S̲S̲, a następnie opóźnisz się zegary lub pluć śmieci; niektóre (zwykle nowsze) karty powinny działać, niektóre (starsze) mogą nie działać, YMMV (jeszcze raz). Jednak w przypadku bardziej niezawodnej konfiguracji SPI (> 1 urządzenie podrzędne) pamiętaj o zapewnieniu niskiego styku przed faktyczną transakcją przy użyciu danej karty SD.
Poza tym, chociaż specyfikacja mówi, że tylko CMD0
i CMD8
powinna mieć CRC w trybie SPI, niektóre karty SD (takie jak Transcend) wydają się wymagać odpowiedniego CRC dla CMD55
/ ACMD41
- jeśli chcesz być po bezpiecznej stronie, po prostu użyj dla nich wstępnie obliczonej wartości.
Ponadto, chociaż SPI sam w sobie nie wymaga podciągania / spadania, dobrym pomysłem może być podciągnięcie MISO w wysokości 47k; niektóre urządzenia pozostawiają swój pin DO w wysokich Z w określonych okolicznościach (np. nie są inicjowane), a piny swobodne mogą zawsze być źródłem dziwnych problemów. Jeśli twój komputer ma 3,3 Vcc, możesz użyć wewnętrznych podciągnięć; jeśli jest to 5 V, nie rób tego, chyba że twoja linia MISO ma już prawidłowe tłumaczenie logiczne 5-> 3.3 V.
Dalsza lektura:
Jak korzystać z MMC / SDC
Specyfikacje SD Część 1 Uproszczona warstwa fizyczna Uproszczona specyfikacja - najważniejsze sekcje 6.4.1 Włączenie zasilania i 7.2.1 Wybór i inicjalizacja trybu za pomocą rysunku 7-1 : Diagram stanu karty pamięci SD (tryb SPI)
CMD8
wcześniejszego wydania. Ponadto zegar zwykle nie stanowi problemu, o ile znajduje się w rozsądnym zakresie.Może jest już za późno, ale odpowiedź z karty jest OK! Po CMD0 odpowiedź musi wynosić 0x01 - oznacza to, że karta JEST w stanie BEZCZYNNOŚCI i gotowa do pracy. Jeśli masz coś takiego jak 0b00000101, 1 na drugim miejscu mówi, że jest to polecenie niezgodne z prawem, a 1 na 0 oznacza, że sard jest nadal w stanie bezczynności i jest gotowy do pracy. Jeśli odpowiedź wynosi 0x00, oznacza to, że karta NIE JEST w stanie BIEGU bezczynnego i musisz wysłać kolejne polecenie RESET.
źródło
I tried this, but I am getting 01 even for CDM1
- coraz bezczynnie odpowiedziCMD1
na NOT OK. „Odpowiedź” nie rozwiązuje jego prawdziwego problemu.