Czy karta SD w trybie SPI przestrzega wyboru chipa / wyboru slave? Wygląda na to, że resetuję się w mojej aplikacji

9

Mam aplikację, w której mam mikrokontroler (NXP LPC1343 ), który jest podłączony do FPGA przez 16-bitowy interfejs SPI. Istnieje również karta SD korzystająca z tego samego portu SPI (MISO / MOSI), ale z innym pinem CS / SS (oba są aktywne nisko, zgodnie ze specyfikacją SPI). Jedną z rzeczy, które muszę zrobić, to zapisać dane z FPGA do pliku na karcie SD za pomocą FAT32 , a to jest zadanie mikrokontrolera. Mikrokontroler korzysta z FatFS , który sam niezawodnie działam .

Ponieważ mikrokontroler ma tylko niewielką ilość pamięci RAM, tylko niewielka ilość danych może być buforowana jednocześnie. Dlatego mikro musi odczytać bufor z FPGA, zmienić tryb SPI na 8-bit, a następnie zapisać te dane do FATFS. Przypomnij sobie, że aby skonfigurować kartę SD w trybie SPI, należy wysłać polecenie, gdy magistrala SPI pracuje z częstotliwością 400 kHz, i musi nastąpić pewna ilość oczekiwania. Dlatego chciałbym wykonać inicjalizację tylko raz.

Jednak wykonywanie transakcji na FPGA, nawet przy wysokim CS na karcie SD, wydaje się wprowadzać kartę SD w dziwny stan, tak że musi ona ponownie przejść przez inicjalizację. Jest to oczywiście niepożądane, ponieważ inicjalizacja może potrwać kilka milisekund, aby zapisać zaledwie 4 kB danych (ponownie ograniczone przez małą pojemność pamięci RAM mojej mikro). Ponieważ muszę jak najszybciej zapisać kilka megabajtów, zmniejsza to wydajność z około 500 kB / s do mniej niż 100 kB / s.

Wiem, że karty SD nie są technicznie w pełni zgodne z SPI, ale jak rozwiązać ten problem?

Zuofu
źródło
Powinien to honorować, o ile mi wiadomo. Może wypróbujesz inną kartę SD?
Marko
To świetne pytanie. Dzięki za pytanie (i udzielenie odpowiedzi).
markrages

Odpowiedzi:

7

Dobra, właściwie to rozgryzłem. Powinienem był wejść na trochę głębiej. Okazuje się, że karty SD nie działają dokładnie tak, jak urządzenia SPI, gdy współużytkują magistralę, zgodnie z instrukcją obsługi MMC / SDC :

W magistrali SPI każde urządzenie podrzędne jest wybierane z oddzielnymi sygnałami CS, a wiele urządzeń można podłączyć do magistrali SPI. Ogólne urządzenie slave SPI asynchronicznie steruje / zwalnia swój sygnał DO sygnałem CS, aby współdzielić szynę SPI.

Jednak MMC / SDC napędza / uwalnia sygnał DO podczas synchronizacji z SCLK. Oznacza to, że istnieje możliwość konfliktu magistrali z MMC / SDC i innymi urządzeniami podrzędnymi SPI podłączonymi do magistrali SPI. Prawe zdjęcie pokazuje czas napędu / zwolnienia MMC / SDC (sygnał DO jest ciągnięty do 1/2 V cc, aby zobaczyć stan magistrali). Dlatego, aby nadać sygnał DO zwolnienia MMC / SDC, urządzenie nadrzędne musi wysłać bajt po deasserowaniu sygnału CS.

Karta SD i FPGA prawdopodobnie próbowały doprowadzić DO, a karta SD zgubiła się, więc zresetowała się. Wydaje się, że wysłanie dodatkowego bajtu go rozwiązało.

Zuofu
źródło
Pozwala to na zmianę pomiędzy FPGA i kartą, prawda? Czy zauważyłeś również, że możesz przerwać transmisję danych i wznowić? Z tego, co mówi o elm-chan, wygląda na to, że nie jest to możliwe, ale chciałbym wiedzieć, czy to potwierdziłeś, czy obaliłeś.
krs013,
1
Tak, działa zgodnie z oczekiwaniami w przypadku przełączania między FPGA i SD, ale nie można przerwać transferu między połączeniami do FatFS. Przynajmniej nie byłem w stanie tego uruchomić. Oznacza to, że nie możesz (na przykład) odpowiedzieć na przerwanie podczas zapisu pliku i odczytu z czujnika za pomocą wspólnej magistrali SPI.
Zuofu,