2009-06-05 15 views
15

Używam karty microSD w projekcie osadzonym. Karta jest podłączona do mikrokontrolera za pomocą interfejsu SPI. To sprawdziło się w przypadku wszystkich kart, z których korzystałem wcześniej, ale teraz moja nowa karta nie zostanie zainicjowana. Karta jest kartą microSD Transcend 2   GB (TS2GUSD).Inicjalizacja karty microSD za pomocą interfejsu SPI

Po wysłaniu początkowej zegara pociągu, aby przełączyć do trybu SPI, I wykonaj następujące czynności:

  1. CMD0 (Argument 0, CRC 0x95) -> Response 0x01 -> OK

  2. CMD8 (Argument 0x000001AA, CRC 0x87) -> Response 0x01 0x000001AA -> Oznacza to SDC V2 + karta, zakres napięcia 2,7   V - 3,6 V jest obsługiwana   -> OK

Następnie powinienem wysłać polecenie ACMD41, ale podczas wysyłania CMD55 (argument 0, CRC 0), który musi poprzedzać CMD41, otrzymuję odpowiedź 0x05 -> Nielegalne polecenie. Próbowałem również wysłać CMD1 (dla kart MMC), ale daje to podobną odpowiedź o niezgodnym poleceniu. Kod działa dobrze z moją kartą microSD Sandisk 2   GB.

Jak naprawić ten problem?

Odpowiedz

14

Wygląda na to, że znalazłem problem. Kiedy obliczy poprawne CRC dla CMD55 i wyśle ​​je zamiast fałszywej CRC, polecenie jest akceptowane (wynik 0x01). Jeśli spojrzeć na the physical layer specification w sekcji 7.2.2, to jednoznacznie mówi:

Interfejs SPI jest inicjowany w domyślnym trybie wyłączenia CRC. (z wyjątkiem poleceń CMD0 i CMD8).

Nie wydaje się, aby miało to miejsce w przypadku tej serii kart Transcend, naruszając tym samym specyfikację. Również w przypadku błędu CRC odpowiedź powinna wynosić 0x09 zamiast 0x05. Próbowałem jawnie wyłączyć sprawdzanie CRC z CMD59, ale to nie wydaje się pomóc.

=> Obliczenie prawidłowej wartości CRC dla (wszystkich?) Poleceń powoduje, że karta działa.

Jestem w kontakcie z obsługą Transcend na ten temat. Jeśli nauczę się czegoś pożytecznego, to ty to wiesz.

Zauważ, że wcześniej użyłem innych kart Transcend, ale zostały one wykonane na Tajwanie, podczas gdy nowa została wyprodukowana w Korei (i wydaje się być kartą Samsunga (MMAGR02GUDCA)).

+1

fajnie! Dobrze, że wykopiesz problem! ... Jestem po prostu oszołomiony, ponieważ to szwy wskazują, że czytniki kart USB nie używają komend combo. Możesz/powinnaś zaznaczyć swoją odpowiedź jako poprawną. BTW, sandisk, transcent, etc nie mają odlewni półprzewodników ... oni kontrolują i cyfrowe usługi projektowania dla swoich produktów (po prostu w rzeczywistości nie wytwarzają chipów) – jpinto3912

+0

Musiałem czekać 48 godzin, aby oznaczyć moją odpowiedź jako poprawną z jakiegoś powodu. Myślę, że czytniki kart USB będą używać interfejsu "rzeczywistego" protokołu karty pamięci SD (ma większe prędkości) .W tym trybie musisz użyć CRC i prawdopodobnie nie będzie problemu. – Ron

+1

Czy kiedykolwiek otrzymałeś odpowiedź od Transcend? zgaduję, że wysłałeś cały ostatni bajt jako zera, powodując, że bit końcowy jest błędny, karta byłaby zgodna ze specyfikacją, a nawet kod błędu miałby sens. (Zostawiłem odpowiedź opisującą to nieco więcej, w Jeśli nadal interesujesz się sprawą po ... 4 latach) –

1

To normalne, prawdopodobnie wewnętrzna pompa ładująca służy do wymazywania napięcia, które trwa dłużej niż zwykle, aby być gotowym ... musisz nalegać na combo CMD55 + ACMD41 do czasu zakończenia inicjalizacji.

CMD58 może również pomóc w sprawdzeniu, czy dostarczany jest prawidłowy poziom napięcia (czasami gniazda mają problemy z kontaktem).

+1

Pętla karty w nieskończoność na CMD55 z wynikiem 0x05. Czekałem więcej niż wystarczająco długo i nic się nie zmieniło. CMD58 ma taki sam wynik 0x05. W międzyczasie wskazałem problem, zobacz odpowiedź poniżej. – Ron

2

Miałem prawie ten sam problem. Wysyłając ACMD41, wysłałem CMD55, a następnie CMD41. Odpowiedzią na CMD55 było 0x01, wskazując stan bezczynności i uruchamiając proces inicjalizacji (jest to normalne, jak sądzę). CMD41 odpowiedziałby wartością 0x05, wskazując na niedozwolone polecenie. Okazuje się, że moja konkretna karta domyślnie sprawdza CRC, nawet w trybie SPI, i nieprawidłowo zgłasza błędy CRC jako nielegalne polecenia (tj. Nie jest zgodne ze specyfikacją SD).Kiedy obliczam prawidłową wartość CRC, działa dobrze. Oto kod obliczenie C7 użyłem, to działa dobrze dla mnie:

https://github.com/hazelnusse/crc7

Jeśli nie zadbali, aby wyłączyć sprawdzanie CRC, myślę, że jest to prawdopodobnie najlepiej założyć, że nie jest wyłączona i uczynić z pewnością obliczyć prawidłowy CRC dla każdej ramki polecenia. Z tego co wiem, niektóre karty domyślnie wyłączają go w trybie SPI, a inne go włączają, mimo że specyfikacja SD stwierdza, że ​​powinna być domyślnie wyłączona w trybie SPI, z wyjątkiem CMD8.

+0

Jeśli jesteś bardzo ciekawym typem, takim jak ja, i nadal się o to troszczę po roku: Czy pamiętasz, co wysłałeś jako ostatni bajt zawierający CRC? Jeśli wysłałeś go jako wszystkie zera, pamiętaj, że ostatni bit nie jest częścią CRC i powinien zawsze wynosić 1. (Zostawiłem również odpowiedź z nieco większą szczegółowością) –

2

Powiedziałeś, że użyłeś CRC 0 dla polecenia niepowodzenia. Zakładam, że oznaczało to, że wysłałeś cały ostatni bajt jako 0x00. Zauważ, że CRC7 to tylko pierwsze 7 bitów ostatniego bajtu - ostatni bit o nazwie end bit powinien zawsze być 1. Więc jeśli wysłałeś 0x00 jako ostatni bajt, z 0 jako ostatnim bitem, awaria byłaby zrozumiała, a nawet kod błędu miałby sens. Jeśli wyślesz 1 jako ostatni bit, powinien on działać, tzn. użyj czegoś takiego jak 0x01 lub 0xFF jako ostatniego bajtu.

1

Wysłanie CMD0 z wybranym chipem (0) nie inicjuje karty w trybie SPI. To tylko ustawia tryb SPI. Karta nie została zainicjowana, dopóki nie zostanie zaakceptowany zwrot ACMD41. Następnie CRC jest domyślnie wyłączone.

Powiązane problemy