Niezainicjowana karta SD miesza na magistrali SPI

Nov 03, 2022 Last reply: 3 years ago 6 Replies

Taka ciekawostka, zauważona podczas wczorajszego uruchamiania (opisywanej nieco wcześniej) konstrukcji odtwarzacza/radia internetowego na STM32F107. Po uruchomieniu FreeRTOS-a oraz lwIP zabrałem się za testowanie pozostałych peryferiów. Sprawdziłem m.in. czy nadal działa karta SD podłączone do magistrali SPI. Na tej samej magistrali pracuje także pamięć RAM, używana w roli bufora.



Karta zgodnie z oczekiwaniami działa zupełnie prawidłowo - inicjuje się, jest widziana przez FatFS, mogę czytać jej zawartość oraz płynnie odtwarzać przechowywane na niej pliki MP3.



Wszystko działało całkowicie poprawnie do momentu, gdy w ramach kolejnego testu zamiast karty zamontowałem pendrive'a (a więc nie była już wywoływana jej inicjacja). Wszystko zaczęło się psuć - odtwarzanie przerywało, zupełnie jakby był jakoś problem w komunikacji pomiędzy USB, pamięcią SPI RAM oraz VS1003 (ten ostatni układ na osobnej magistrali SPI). Na początku pomyślałem, że gdzieś zmniejszana jest prędkość transmisji na SPI, ale okazało się, że wszystko jest skonfigurowane poprawnie.



Aż w końcu znalazłem winowajcę - sama karta SD pozostawiona w gniazdku miesza w komunikacji na magistrali, o ile nie zostanie zainicjowana. Jeśli jej nie ma - wszystko jest w porządku. Jeśli jest i przejdzie inicjację - też. Za to jeśli pozostawię ją niezainicjowaną, urządzenie zaczyna szwankować.



Nigdy jeszcze nie spotkałem się z taką sytuacją, a kart SD na SPI używałem w wielu swoich projektach, jeszcze z czasów AVR-ów. Linia MISO miała ustawionego wewnętrznego pull-upa. Poza zauważeniu problemu dodałem jeszcze zewnętrznego 10k, ale to nie pomogło. Linia CS rzecz jasna jest podciągnięta do linii zasilania 3,3V rezystorem 10k, podobnie jak linia SD_PRESENT.



Niby nie stanowi to dla mnie wielkiego problemu, bo docelowo karta nie będzie hot-swapowalna i mogę ją po prostu inicjować przy każdym starcie urządzenia. Zastanawia mnie po prostu potencjalna przyczyna takiego zachowania.


A jak się "inicjuje" kartę SD? ZTCP to SD ma minimum dwa (a chyba nawet 3, ale może te 2 to dwa "podtryby") tryby pracy - emulacja MMC, czyli "zwykłe" SPI, oraz SD. Ale nie wiem, który z tych trybów jest aktywny po włączeniu zasilania. "Logicznie" byłoby, gdyby SPI - bo po coś jest ta emulacja MMC - ale może jednak SD?

Właśnie też o tym pomyślałem w pierwszym momencie, ale:

  1. Kart SD na SPI używam w swoich projektach od lat, a dopiero teraz udało mi się zaobserwować takie zachowanie.
  2. Coś mi trudno uwierzyć, że w wiodącym standardzie nośników pamięci takie nieprzewidywalne zachowanie mogłoby przejść w specyfikacji. Nie mówię, że karta musi startować w trynie SPI, jednak niech przynajmniej zostanie ten podstawowy punkt wspólny - trzymanie magistrali w stanie wysokiej impedancji tak długo, jak linia CS jest w stanie wysokim.

Czy sprawdzałeś aby kartę w nowym standardzie, jak XD czy HC? Mimo róznych zapewnień, te karty zachowuja się bardzo niestabilnie w starych urządzeniach. I to raczej nie z powodu pojemności.

Jeśli dobrze pamiętam to zgodnie ze specyfikacją linia CS jest aktywna dopiero po zainicjowaniu trybu SPI. A inicjalizacja trybu SPI (który nie jest domyślny) wymaga CS=1 i pewnej sekwencji SCK. Zatem jeśli kartę nie zainicjujesz a host z innym urządzeniem na tym samym SPI zacznie generować SCK to karta może się wtrącić na linii MISO z CS=1

Hehe, wiodącym, przecież wiadomo, czemu jest "wiodący" - bo najtańszy - a to ma swoją cenę ;>

Może do tej pory używałeś kart MMC? Tak czy siak - własnie po to pytałem, "jak się inicjalizuje" - może być na poziomie kodu. Kto wie, co tam jest za pomysł - a może być pokrętny, tak jak napisal Marek. Bo SD to nie jest SPI. Że ew. może emulować, to oznacza tylko tyle, ze będzie SPI, ale dopiero po wlączeniu tego trybu.

W dniu 2022-11-03 o 12:36, Atlantis pisze:

Jeśli karta SD ma być wyjmowana to jest według mnie kiepski pomysł. Wypadałby założyć, że do gniazda karty włożysz cokolwiek, w szczególności zepsutą kartę (np. ze zwartymi wyprowadzeniami).

To natychmiast kładzie komunikację z pamięcią RAM i całe urządzenie nie działa.

Pozdrowienia, MKi

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required