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ć CMD1do 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 CMD1je wydasz . Najpierw powinieneś wydać polecenie CMD8 0x1AApo 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ś:
CMD0arg:, 0x0CRC: 0x95(odpowiedź:) 0x01- zwróć uwagę, że w przypadku 0xFFzniekształconej odpowiedzi powinieneś po prostu powtórzyć ten krok; więcej informacji znajdziesz poniżej.
CMD8arg:, 0x000001AACRC: 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ż 0x1AAjest 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. CMD55arg:, 0x0CRC: any, 0x65faktycznie (odpowiedź 0x01:; CMD55będący przedrostkiem każdego ACMD ; jeśli odpowiedź brzmi 0x05, masz starą kartę - powtórz CMD1z arg 0x0[CRC 0xF9] zamiast CMD55/ ACMD41)
3b. ACMD41, arg:, 0x40000000CRC: any, 0x77faktycznie (zauważ, że ten argument zakłada, że karta jest HCS, co zwykle ma miejsce; użyj 0x0arg [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 CMD1jeśli 0x05je 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źnn0nie pojawia się (tzn. jeśli z jakiegoś powodu urządzenie pozostaje w trybie bezczynności). Również otrzymywanie 0xFFod CMD0powszechnie 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 .nCMD00xFF0x01CMD8
Zauważ, że odpowiedzi, które mają ustawiony MSB, ale 0xFFzwykle 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 CMDs, 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 CMD0i CMD8powinna 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)
CMD8wcześniejszego wydania. Ponadto zegar zwykle nie stanowi problemu, o ile znajduje się w rozsądnym zakresie.