Obsługa FAT w mikrokontrolerach STM32 – obsługa kart
Współcześnie najpopularniejsze i najbardziej uniwersalne są karty SD ( Secure Digital ). Standard obejmuje karty o pojemności do 4 GB, a jego rozsfzerzenie, czyli SDHC ( Secure Digital High Capacity ), aż do 32 GB. Standard kart SD został opracowany przez trzy firmy: Matsushita, SanDisk i Toshiba. Pierwsze nośniki danych tego typu pojawiły się pod koniec 2000 roku. Początkowo dokumentacja stfandardu SD była dosyć trudno dostępna, jednak sytuacja uległa zmianie wraz z nadejściem roku 2006, kiedy to stały się dostępne informacje m.in. na temat interfejsu SDIO, co w efekcie pozwoliło na implementację w mikrokontrolerach sprzętowych sterowników kart SD. Przedstawiciele najbardziej zaawansowanej grupy układów z rodziny STM32 mają wfbudowany właśnie taki sterownik.
Wszystkie karty SD dostępne na rynku obsługują dwa standardy komunikacyjne: SDBus oraz SPI. Jak to zwykle bywa, interfejs natywny (SDBus) oferuje duże możliwości i dużą szybkość pracy, ale za cenę wzrostu stopnia skomplikowania obsługi interfejsu. Z tego powodu w kartach SD dostępna jest również komunikacja za pomocą o wiele prostszej w obsłudze magistrali SPI, z tym, że tutaj mamy nieco okrojone możliwości. Jeśli tylko aplikacja nie wymaga wyjątkowo dużej szybkości przesyłania danych, to nie ma jakiekolwiek sensu implementacja obsługi interfejsu SDBus, wystarczy praca z magistralą SPI. Przedstawione wyżej podejście znakomicie upraszcza sprawę, ponieważ zdecydowana większość dostępnych mikrokontrolerów (w tym oczywiście z rodziny STM32F) jest wyposażona w sprzętowy kontroler SPI. Sposób podłączenia karty SD przez magistralę SPI do mikrokontrolera przedstawiono na rys. 1. Podobny układ został wykorzystany na płytce ewaluacyjnej STM3210B-EVAL.
Rys. 1. Sposób podłączenia karty SD przez magistralę SPI do mikrokontrolera w zestawie STM3210B-EVAL
Komendy obsługiwane przez karty SD
Każda komenda, która ma być wysłana do karty SD, składa się z sześciu bajtów. Pierwszym bajtem jest zawsze kod komendy, kolejne cztery bajty to jej argument. Na końcu jest przesyłany bajt sumy kontrolnej CRC. O ile w trybie pracy z interfejsem SDBus suma CRC jest weryfikowana, to przy komunikacji za pomocą magistrali SPI suma kontrolna jest przez kartę ignorowana. Tylko w trakcie przesyłania komendy CMD0, przełączającej tryb pracy z SDBus na SPI jest wymagany bajt CRC. Nie trzeba go w żaden sposób obliczać, ponieważ jest to stała wartość i wynosi 0x95. W tab. 1 umieszczonokilka komend obsługiwanych w trybie pracy z magistralą SPI wraz z opisem argumentów. Oprócz standardowych komend CMD karty SD mogą wykorzystywać jeszcze tak zwane komendy aplikacji (ACMD). Wysłanie komendy aplikacji wymaga uprzedniego wysłanie komendy CMD55, która informuje kartę SD, że następna będzie komenda ACMD.
Tab. 1. Polecenia obsługiwane przez karty SD w trybie z magistralą SPIf
Komenda | Opis |
CMD0 | zeruje kartę, pozwala włączyć tryb pracy z magistralą SPI |
CMD12 | wymuszenie zakończenia transmisji wielu bloków danych |
CMD16 | konfiguracja długości bloku danych dla zapisu/odczytu |
CMD17 | odczyt bloku pamięci o długości określonej przez CMD16 |
CMD24 | zapis bloku pamięci o długości określonej przez CMD16 |
CMD32 | w argumencie jest przesyłany adres pierwszego bloku przeznaczonego do skasowania |
CMD33 | w argumencie jest przesyłany adres ostatniego bloku przeznaczonego do skasowania |
CMD38 |
kasuje bloki wyznaczone za pomocą CMD32 i CMD33 |
System plików FAT
Z perspektywy systemu plików, każdy nośnik danych (dysk twardy, karta pamięci) jest podzielony na sektory i klastery. Sektorem nazywamy najmniejszą liczbę bajtów, jaką można zapisać lub odczytać. Zwykle sektor ma rozmiar 512 bajtów. Pliki zapisywane są w numerowanych klastrach. Rozmiar klastra jest zależny od systemu plików i nośnika danych. Każdy klaster jest w całości przydzielony do danego pliku, co oznacza, że nawet jeśli plik jest dużo mniejszy od rozmiarów klastra, to i tak na dysku zajmuje tyle, co pojedynczy klaster.
Kluczowym elementem systemu plików FAT ( File Allocation Table ) jest, zgodnie z jego nazwą, tablica alokacji plików. System plików FAT występuje w sumie w czterech odmianach, przy czym w systemach wbudowanych zazwyczaj wykorzystuje się dwie, w zależności od rozmiarów nośnika i wymagań aplikacji będzie to FAT16 lub FAT32.
Rys. 2. Podział nośnika danych w systemie FAT
Nośnik danych w systemie plików FAT jest dzielony na pięć części, wszystkie przedstawiono na rys. 2. Pierwszą logiczną częścią nośnika danych, umieszczoną w pierwszym sektorze, jest obszar zarezerwowany, który zawiera wszystkie podstawowe informacje na temat bieżącej partycji (nośnika). Do tych informacji zaliczają się m.in.: typ i rozmiar partycji, rozmiar sektora i liczba sektorów w klastrze. Za obszarem zarezerwowanym znajdują się tablice alokacji plików, które są podstawowym źródłem informacji na temat danych zapisanych na nośniku. Zwykle, oprócz głównej tablicy alokacji, występuje również jej kopia. Czwarty obszar to katalog główny, który jest zakładany automatycznie w trakcie tworzenia systemu plików. Ostatni, piąty region, to obszar danych.