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.