SD memory card support by STM32F1 Value Line microcontrollers. The implementation of the FAT32 file system.

Podobne dokumenty
Wbudowane układy komunikacyjne cz. 1 Wykład 10

Komunikacja w mikrokontrolerach Laboratorium

16MB - 2GB 2MB - 128MB

Projekt MARM. Dokumentacja projektu. Łukasz Wolniak. Stacja pogodowa

Mikrokontrolery AVR techniczne aspekty programowania

UW-DAL-MAN v2 Dotyczy urządzeń z wersją firmware UW-DAL v5 lub nowszą.

LABORATORIUM - ELEKTRONIKA Układy mikroprocesorowe cz.2

PROJECT OF FM TUNER WITH GESTURE CONTROL PROJEKT TUNERA FM STEROWANEGO GESTAMI

STM32Butterfly2. Zestaw uruchomieniowy dla mikrokontrolerów STM32F107

Przemysłowy odtwarzacz plików MP3

Struktura dysku. Dyski podstawowe i dynamiczne

Wykład 4. Interfejsy USB, FireWire

dr inż. Jarosław Forenc

Kod produktu: MP01105

Kod produktu: MP01105T

Pracownia Transmisji Danych, Instytut Fizyki UMK, Toruń. Instrukcja do ćwiczenia nr 10. Transmisja szeregowa sieciami energetycznymi

Sprawozdanie z projektu MARM. Część druga Specyfikacja końcowa. Prowadzący: dr. Mariusz Suchenek. Autor: Dawid Kołcz. Data: r.

Universal MIDI controller. Uniwersalny sterownik MIDI

Mikroprocesory i Mikrosterowniki Laboratorium

Standard transmisji równoległej LPT Centronics

Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki

m e d i a s e r v i c e Moduł kamery JPEG z komunikacją szeregową CJ0706A

Technika Mikroprocesorowa

INSTRUKCJA OBSŁUGI PRZYSTAWKI PEN-01 DO PENDRIVE A

Szkolenia specjalistyczne

Obsługa kart pamięci Flash za pomocą mikrokontrolerów, część 1

RSD Uniwersalny rejestrator danych Zaprojektowany do pracy w przemyśle

Cyfrowy rejestrator parametrów lotu dla bezzałogowych statków powietrznych. Autor: Tomasz Gluziński

Instrukcja obsługi. Terminal SD for DB25 CNC

Obsługa kart pamięciowych SD, część 3

Notatka lekcja_#3_1; na podstawie W.Kapica 2017 Strona 1

System plików. Warstwowy model systemu plików

Zaliczenie Termin zaliczenia: Sala IE 415 Termin poprawkowy: > (informacja na stronie:

Programowanie mikrokontrolerów. 8 listopada 2007

1. Opis aplikacji. 2. Przeprowadzanie pomiarów. 3. Tworzenie sprawozdania

Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska

Sektor. Systemy Operacyjne

ang. file) Pojęcie pliku (ang( Typy plików Atrybuty pliku Fragmentacja wewnętrzna w systemie plików Struktura pliku

Przemysłowy odtwarzacz plików MP3 SD

Obługa czujników do robota śledzącego linie. Michał Wendland czerwca 2011

Płytka uruchomieniowa XM64

Dodatkowa pamięć w kieszeni - o przenośnych nośnikach danych

RSD Uniwersalny rejestrator danych Zaprojektowany do pracy w przemyśle

Zastosowanie procesorów AVR firmy ATMEL w cyfrowych pomiarach częstotliwości

Dyski półprzewodnikowe

Charakterystyka mikrokontrolerów. Przygotowali: Łukasz Glapiński, Mateusz Kocur, Adam Kokot,

STM32 Butterfly. Zestaw uruchomieniowy dla mikrokontrolerów STM32F107

Tworzenie partycji i dysków logicznych

dokument DOK wersja 1.0

Instrukcja dla: Icomsat v1.0 SIM900 GSM/GPRS shield for Arduino oraz dla GPRS Shield produkcji Seeedstudio.

Politechnika Wrocławska

Wykład 4. Przegląd mikrokontrolerów 16-bit: - PIC24 - dspic - MSP430

Opis czytnika TRD-FLAT CLASSIC ver Naścienny czytnik transponderów UNIQUE w płaskiej obudowie

LITEcompLPC1114. Zestaw ewaluacyjny z mikrokontrolerem LPC1114 (Cortex-M0) Sponsorzy:

Optymalizacja wydajności dysków pendrive. Cluster alignment.

Wydział Elektryczny. Katedra Automatyki i Elektroniki. Instrukcja. do ćwiczeń laboratoryjnych z przedmiotu: SYSTEMY CYFROWE 1.

Instytut Teleinformatyki

ZL8AVR. Płyta bazowa dla modułów dipavr

WYKŁAD 5. Zestaw DSP60EX. Zestaw DSP60EX

Wyniki (prawie)końcowe - Elektroniczne warcaby

Podstawowe wiadomości o systemach plików.

Wykład 4. Interfejsy USB, FireWire

Systemy plików FAT, FAT32, NTFS

SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE

Uniwersalna stacja dokująca z USB Type-C

LABORATORIUM UKŁADÓW PROGRAMOWALNYCH. PROCESORY OSADZONE kod kursu: ETD 7211 SEMESTR ZIMOWY 2017

Przemysłowy odtwarzacz plików MP3 SD ze wzmacniaczem 2x10 Watt

ISP ADAPTER. Instrukcja obsługi rev.1.1. Copyright 2009 SIBIT

2. Architektura mikrokontrolerów PIC16F8x... 13

AVR DRAGON. INSTRUKCJA OBSŁUGI (wersja 1.0)

LEKCJA TEMAT: Zasada działania komputera.

instrukcja użytkownika terminala ARGOX PA-20 SYSTEMY AUTOMATYCZNEJ IDENTYFIKACJI

Wpisany przez Łukasz Nawrotek Poniedziałek, 20 Październik :57 - Zmieniony Poniedziałek, 20 Październik :02

Parametryzacja przetworników analogowocyfrowych

Problematyka sieci miejscowej LIN

Mikroprocesory i Mikrosterowniki Magistrala szeregowa I2C / TWI Inter-Integrated Circuit Two Wire Interface

Popularne pamięci FLASH firmy GigaDevice

Programator procesorów rodziny AVR AVR-T910

Instytut Teleinformatyki

Rys. 1. Schemat ideowy karty przekaźników. AVT 5250 Karta przekaźników z interfejsem Ethernet

Vinculum scalony host USB

1.1 Co to jest USBasp? Parametry techniczne Obsługiwane procesory Zawartość zestawu... 4

1. Wprowadzenie Programowanie mikrokontrolerów Sprzęt i oprogramowanie... 33

micro Programator ISP mikrokontrolerów AVR zgodny z STK500v2 Opis Obs³ugiwane mikrokontrolery Wspó³praca z programami Podstawowe w³aœciwoœci - 1 -

Przykładowe zagadnienia na sprawdzian z wiedzy ogólnej. Linux to nazwa: A. Programu biurowego. B. Systemu operacyjnego. C. Przeglądarki internetowej.

interfejs szeregowy wyświetlaczy do systemów PLC

Kod produktu: MP01611

Komunikacja w mikrokontrolerach. Magistrala szeregowa I2C / TWI Inter-Integrated Circuit Two Wire Interface

Opis czytnika TRD-80 CLASSIC ver Moduł czytnika transponderów UNIQUE z wbudowaną anteną

PAMIĘCI. Część 1. Przygotował: Ryszard Kijanka

Kod produktu: MP-BTM222-5V

Sterownik procesorowy S-2 Komunikacja RS485 MODBUS

USB 3.0 DUAL SATA HDD STACJA DOKUJĄCA

MODBUS RTU wersja M1.14 protokół komunikacyjny wyświetlaczy LDN

Architektura komputerów. Układy wejścia-wyjścia komputera

MARM Odtwarzacz plików MP3 z kardy SD

Bit 11 pierwszego słowa komunikacji acyklicznej ustawny jest na wartość 0 i nie podlega modyfikacji.

Modułowy programowalny przekaźnik czasowy firmy Aniro.

Bootowalny pendrive USB z Windows

Transkrypt:

Wojciech Grys I rok Koło Naukowe Techniki Cyfrowej dr inż. Wojciech Mysiński opiekun naukowy SD memory card support by STM32F1 Value Line microcontrollers. The implementation of the FAT32 file system. Obsługa kart pamięci SD przez mikrokontrolery STM32F1 Value Line. Implementacja systemu plików FAT32. Keywords: STM32 Value Line, SD Memory Card, microcontroller, FAT32, Implementation, File System Słowa kluczowe: STM32 Value Line, Karta pamięci SD, mikrokontroler, FAT32, Implementacja, System plików This article contains informations about connecting STM32 microcontrollers with Secure Digital Memory Cards. The connection is made via the SPI interface. This article also contains a few information about the SD Memory Card and STM32 microcontrollers, and explains FAT32 conception and explains the way to implement FAT32 File system on microcontrollers. At the end of this article you can read about one of the possible use of STM32, SD CARD and FAT32. 1. Wstęp Wielu konstruktorów urządzeń mikroprocesorowych, i nie tylko, podczas tworzenia swoich projektów po jakimś, dłuższym lub krótszym, czasie musi stawić czoła problemowi jakim jest prezentacja danych zebranych przez urządzenie człowiekowi. Jak wiadomo każde urządzenie mikroprocesorowe jest swego rodzaju komputerem a jak wiadomo jednym z zadań komputera, oprócz przyjmowania danych wejściowych ze świata zewnętrznego oraz ich przetwarzania, jest właśnie prezentacja tych danych człowiekowi. Zagadnienie to mogłoby wydawać się bardzo proste w wielu przypadkach, ponieważ ktoś może powiedzieć, że zawsze można do układu podłączyć diodę i dana ilość mignięć oznaczała by jakąś informację, albo podłączyć wyświetlacz i prezentować na nim dane. Oczywiście taka osoba ma rację, lecz np. miganie diody bardzo ogranicza nam zakres danych, które możemy przekazać. Podobnie sytuacja przedstawia się jeśli chcemy użyć wyświetlacza, który nie daje nam możliwości magazynowania zebranych i przetworzonych danych, chyba że postawimy przy nim człowieka który będzie je notował. W sytuacjach, w których musimy do lub z urządzenia samodzielnego przekazać dane w dużej ilości lub dane te są zbierane przez jakiś dłuższy okres, przychodzą nam z pomocą nośniki danych czyli pamięci typu flash. Tego typu pamięci znajdują się w mikrokontrolerach, pamięciach USB, czy kartach pamięci. Ja referat ten poświęcę tym ostatnim. W dniu, w którym piszę ten referat obecna technologia pozwala nam na zakup karty pamięci 32GB w cenie poniżej 100PLN. Ale sama technologia jest na tyle rozwinięta, że na rynku istnieją karty pamięci o pojemności do 2TB. To co napisałem idealnie pokazuje jak duży potencjał posiadają i jak duże możliwości dają nam karty pamięci. W referacie tym postaram się przybliżyć sposób wykorzystywania kart pamięci w systemach mikroprocesorowych oraz sposób zastosowania tego typu rozwiązań. Moim celem było napisanie własnej biblioteki do obsługi kart pamięci oraz systemu plików FAT32. Cel ten zrealizowałem a w tym artykule podzielę się informacjami, które mogą się przydać innym konstruktorom.

2. Karty pamięci SD Tutaj napiszę parę zdań na temat samych kart pamięci typu SD/SDHC/SDXC. Pierwsze pytanie jakie może się nasuwać laikowi, jest takie Czym się różnią te trzy wersje?. W dalszej części postaram się to rozjaśnić, ale najpierw trochę historii. 2.1 Początki kart pamięci Karty pamięci SD (ang. Secure Digital) można powiedzieć, że są potomkami kart pamięci MMC (ang. MultiMedia Card). Karty MMC zadebiutowały na rynku w roku 1997. Standard MMC utworzony został przy współpracy firm SanDisk Corporation oraz Siemens AG/Infineon Technologies AG. Charakteryzowały się wymiarami 24 32 1,4 mm, zatem były bardzo małe, oraz wysoką wytrzymałością na warunki atmosferyczne. Karty MMC zwykle produkowano o pojemnościach od 16 MB do 2 GB. 2.2 Standard Secure Digital SD Standard został opracowany opracowany przez firmy Panasonic, SanDisk i Toshiba w 2000 roku. Zmieniły się nieco wymiary tego typu kart pamięci. Zyskały one także przełącznik blokujący możliwość zapisu na karcie. Karty SD mają pojemności od 8MB do 4GB. Napięcie zasilania 2,7 3,6 V. Standard SD obejmuje różnego rodzaju karty pamięci, pochodzące z różnych firm. Można je podzielić, ze względu na prędkość zapisu za pomocą wkaźnika x lub na klasy: Ocena Szybkość Klasa 13x 16 Mb/s 2 26x 32 Mb/s 4 40x 48 Mb/s 6 66x 80 Mb/s 10 300x 360 Mb/s 45 Tabela 1. Prędkości i klasy kart typu SD Pierwsze cztery przedstawione w tabeli klasy kart są powszechnie dostępne na rynku. 2.3 Standard SDHC Jest to ulepszenie standardu SD, główną różnicą jest to, że karty produkowane w tym standardzie mają o wiele większe pojemności od 4GB do 32GB. Sam skrót SDHC nam to sugeruje (ang. Secure Digital High Capacity). Karty tego standard charakteryzowały się o wiele wyższymi prędkościami zapisu. Z powodu, że SDHC to ulepszenie SD urządzenia obsługujące SDHC obsługują karty SD, natomiast urządzenia zgodne z SD nie obsługują kart SDHC. 2.4 Standard SDXC SDXC (ang. Secure Digital extended Capacity) to kolejne ulepszenie standardu SD. Karty SDXC posiadają pojemności z zakresu 32GB 2TB. Podobnie też, karty te gwarantują wyższe przepustowości ale ich cena jest o wiele wyższa w stosunku do SDHC. Niektóre urządzenia zgodne z SDHC moga obsługiwać karty w tym standardzie ale zwykle nie pozwalają uzyskać pełnych pojemności, większość jednak nie jest w stanie tego zrobić. Urządzenia zgodne z SDXC obsługują SDHC.

2.5 Zastosowania w elektronice Myślę, że już dobrze widać podstawowe różnice pomiędzy tymi standardami. Ja jednak zajmę się tylko kartami SD i SDHC, gdyż SDXC jak na ten moment są o wiele droższe, a poza tym dla konstruktora prostych urządzeń mikroprocesorowych nie potrzebne są aż tak duże pojemności i przepustowości. SDXC głównie stosowane są do przenoszenia np. filmów w wysokiej jakości lub do rejestracji filmów wideo w kamerach. Dodatkowo karty SD występują w różnych obudowach (MicroSD, MiniSD), jednak wszystkie są zgodne ze standardem i obsługuje się je tak samo. Standardy te począwszy od MMC aż po SDXC mają jedną wspólną cechę, o której nie wspomniałem ale jest bardzo istotna, otóż każde z nich może działać w trybie SPI (ang. Serial Peripheral Intreface), czyli interfejs szeregowy dostępny prawie w każdym mikrokontrolerze. Właściwość ta jest bardzo użyteczna i sprawia, że karta pamięci staje się bardzo użytkowa. Niestety ma to też swoje minusy, otóż karta w takim trybie nie osiąga swojej maksymalnej prędkości. Ja jednak zajmę się właśnie tym trybem, gdyż wydajnie obsłużyć go potrafią nie tylko wyspecjalizowane mikrokontrolery ale także te mniejsze i słabsze. Skoro jestem już przy mikrokontrolerach pozwolę sobie napisać parę zdań o tym, którego użyłem. 3. Mikrokontrolery STM32F1 Value Line. Ktoś może zapytać, dlaczego akurat taki mikrokontroler? Odpowiedź jest banalna, otóż do tej pory używałem 8-bitowych tanich mikrokontrolerów AVR lecz tworząc kolejne projekty potrzebowałem nieco więcej zasobów oraz szybkości ale zależało mi na tym aby mikrokontroler był możliwie najtańszy. Przeglądałem oferty producentów i okazało się, że STM32F1 Value Line są najlepszym przybliżeniem tego czego poszukuję. Mikrokontrolery te są produkowane przez firmę STMicroelectronics. Poniżej przedstawię kilka cech tego mikrokontrolera w porównaniu do mikrokontrolera firmy Atmel. nazwa STM32F100RB Atmega32 cena 14 PLN 14 PLN architektura 32-bitowa 8-bitowa maks. taktowanie 24 MHz 16 MHz Pamięć FLASH 128 KB 32 KB Pamięć SRAM 8 KB 2 KB Jak widać rzeczywiście w tej samej cenie mamy układ dużo lepszy, a nie wspomniałem jeszcze o peryferiach układów, w których także STM32 bije na głowę 8-bitowy AVR. Wiele mikrokontrolerów STM32 posiada wbudowany interfejs obsługujący interfejs SDIO czyli podstawowy interfejs dla kart pamięci, niestety mikrokontrolery z serii F1 VL nie posiadają tego interfejsu i dlatego do komunikacji używam interfejsu SPI. Do realizacji projektu używałem zestawu STM32F1VL Discovery, czyli płytki która posiada wbudowany układ STM32F100RB oraz umożliwia nam w łatwy sposób debugowanie poprzez interfejs ST- LINK, płytka łączy się z komputerem poprzez USB. Środowisko, z którego korzystałem to Atollic TrueStudio z kompilatorem GCC. Dla programistów w języku C, w wersji darmowej oprogramowania jedynym ograniczeniem jest maksymalna ilość kodu wynikowego 32KB. W wersji darmowej nie zaprogramujemy mikrokontrolera w języku C++. Środowisko to jest bardzo wygodne i dobre dla początkujących dlatego wybrałem właśnie je. Rysunek 1. Płytka STM32F1VL DISCOVERY

4. Połączenie mikrokontrolera i karty pamięci. Jak już pisałem wcześniej, używam trybu SPI. A kartę pamięci traktujemy jako standardowe urządzenie z magistralą SPI. W przypadku, gdy do czynienia mamy z mikrokontrolerem, który pracuje z napięciem 3,3V podłączenie jest bardzo proste i przedstawia je schemat poniżej. Rysunek 2. Połączenie karty SD z mikrokontrolerem W przypadku kiedy mikrokontroler pracuje z zasilaniem 5V schemat nieco się nam komplikuje. Taki problem można rozwiązać na dwa różne sposoby. Pierwszy z nich to tworzenie dzielników napięcia. Drugim sposobem jest wykorzystanie układu scalonego zawierającego bufory, który wystarczająco obniży nam napięcia dochodzące do karty. Przykład układu z wykorzystaniem buforów zamieszczam poniżej. Rysunek 3. Połączenie karty SD z mikrokontrolerem zasilanym napięciem 5V Teoretycznie bramka pomiędzy kartą a wejściem MISO mastera nie jest potrzebna gdyż napięcie karty jest niższe niż napięcie mikrokontrolera, ale w praktyce lepiej ją dać gdyż zabezpieczy nam kartę na wypadek np. błędu w programie który ustawi nam pin odpowiadający MISO jako wyjście i poda na nie stan wysoki co groziłoby trwałym uszkodzeniem karty pamięci. Jak widzimy powyżej schemat nie jest nazbyt skomplikowany jednak należy pamiętać, że nie jest to schemat dokładny i uwzględnia jedynie schemat połączeń. Obydwa schematy są na tyle proste, że nie ma co w nich wyjaśniać. Dlatego przejdę do dalszej części. 5. Konfiguracja SPI do pracy z kartą pamięci SD. Karta pamięci pracuje w trybie SPI MODE 3. To znaczy, że sygnał zegarowy w stanie spoczynku jest w stanie wysokim, a poszczególne bity odczytywane/zapisywane są przy zboczu narastającym (CPOL=1, CPHA=1). W mikrokontrolerach STM32F1 oznacza to, że piny odpowiadające sygnałom MOSI, MISO i SCK ustawimy jako Alternative Function Output Pullup, natomiast pin CS będziemy sterować programowo i ustawimy go jako General Purpose Output Pull-up.

Po odpowiednim skonfigurowaniu kanału SPI, możemy podłączyć kartę i zająć się jej obsługą. Zaraz po podłączeniu karty jest ona w domyślnym trybie dla standardu SD, czyli SDIO. My jednak chcemy aby karta pracowała w trybie SPI, zatem musimy ją jakoś przełączyć w ten tryb. Jedynym sposobem jest wykonanie poniższej sekwencji: Listing 1. Przykładowy kod konfigurujący SPI1 Ustawienie pinu CS w stan niski Wysłanie 80 cykli sygnału zegarowego SPI, czyli po prostu 10 bajtów o wartości 0xFF Wysłanie komendy CMD0 (reset karty) Po odebraniu potwierdzenia karta pracuje w trybie SPI Po wykonaniu powyższej sekwencji należy sprawdzić odpowiednie rejestry karty za pomocą odpowiednich komend, a konkretniej chodzi o rejestr OCR, czyli rejestr w którym znajdują się informacje na temat zasilania z jakim karta może pracować. Może się to wydawać trochę bez sensu skoro już odczytujemy rejestr to karta musi działać, ale nie jest to takie głupie w sytuacji kiedy nasz układ pracuje powiedzmy na dolnym progu zasilania to przy odczycie większych danych możemy mieć spadek napięcia i karta może przerwać działanie. Ważnym też jest sprawdzenie z jaką kartą mamy do czynienia zaraz po jej inicjalizacji, ponieważ dalsze użytkowanie kart SD i SDHC się różni. Powyżej napisałem że należy wysłać komendę CMD0, teraz postaram się wyjaśnić co to jest i jak to działa. 6. Warstwa fizyczna karty pamięci. Komendy i rejestry. Z kartą pamięci komunikujemy się za pomocą komend wysyłanych przez SPI od Mastera do Slave a. Każda z tych komend ma 6 bajtów długości a jej struktura przedstawia się w poniższy sposób: Tabela 2. Format komendy karty SD Na początku wysyłany jest BIT STARTU, następnie BIT TRANSMISJI, później następuje indeks komendy przykładowo dla CMD0 będzie to liczba 0, a dla komendy CMD24 liczba 24. Następnie przekazujemy argument funkcji, znaczenie tego pola jest różne dla poszczególnych komend, dla komend odczytu/zapisu bloku będzie to adres konkretnego bloku. Kolejne 8 bitów to liczba kontrolna CRC7 dla komendy i argumentu. Na końcu przesyłany jest bit kończący przesyłanie komendy. Host wysyła komendę a karta na nią odpowiada przesyłając potwierdzenie a następnie dane ale tylko wtedy gdy ich żądaliśmy, w przeciwnym wypadku transmisja kończy się na potwierdzeniu. Po takiej sekwencji host może wysłać kolejną komendę. Najlepiej ilustruje to obrazek poniżej.

Tabela 3. Sekwencja przesyłania komendy i danych Dodatkowo przed każdym blokiem danych przesyłany jest tak zwany Start Token, czyli liczba o wartości 0xFE, a po każdym bloku liczba CRC16 obliczona z danych przesłanych w bloku. Karty SD posiadają kilkadziesiąt komend, dzielimy je na dwie grupy. Komendy zwykłe. Czyli komendy wysyłane bezpośrednio do karty w sposób, który przedstawiłem powyżej. Komendy warstwy aplikacji. Rozkazy te poprzedza komenda zwykła CMD55. Wszystkie podstawowe komendy dostępne w trybie SPI przedstawiam w tabeli poniżej. index potw. nazwa CMD0 R1 GO_IDLE_STATE CMD1 R1 SEND_OP_COND CMD6 R1 SWITCH_FUNC CMD8 R1 SEND_IF_COND CMD9 R1 SEND_CSD CMD10 R1 SEND_CID CMD12 R1b STOP_TRANSMISSION CMD13 R2 SEND_STATUS CMD16 R1 SET_BLOCKLEN CMD17 R1 READ_SINGLE_BLOCK CMD18 R1 READ_MULTIPLE_BLOCK CMD24 R1 WRITE_BLOCK CMD25 R1 WRITE_MULTIPLE_BLOCK CMD27 R1 PROGRAM_CSD CMD28 R1b SET_WRITE_PROT CMD29 R1b CLR_WRITE_PROT CMD30 R1 SEND_WRITE_PROT CMD32 R1 ERASE_START_ADDR CMD33 R1 ERASE_END_ADDR CMD38 R1b ERASE CMD42 R1 LOCK_UNLOCK CMD55 R1 APP_CMD CMD56 R1 GEN_CMD CMD58 R3 READ_OCR CMD59 R1 CRC_ON_OFF Nie będę tłumaczył każdej z komend osobno, dokładny opis każdej z nich można znaleźć w specyfikacji standardu SD. W dalszej części dokumentu będę pisał jakich komend należy użyć do podstawowych operacji z kartą pamięci. Jak widać po każdej z komend występuje potwierdzenie. Wszystkie rodzaje potwierdzeń składają się w rzeczywistości z potwierdzenia typu R1 i kolejnych dodatkowych bajtów, specyficznych dla każdej z komend. Potwierdzenie typu R1 wygląda w następujący sposób: Rysunek 4. Potwierdzenie R1 Otrzymujemy w nim najważniejsze informacje o błędach oraz o stanie karty. Ustawiony bit in_idle_state oznacza, że karta jest w stanie spoczynku. A np. address_error mówi nam, że adres który podaliśmy jest spoza zakresu.

7. System plików FAT32. Mając do dyspozycji kartę i całą jej przestrzeń adresową mamy ogromne możliwości. Możemy po prostu zapisywać w niej kolejne komórki pamięci których jest bardzo wiele. Niestety tak zapisane dane będą zdatne do odczytu tylko przez niewielką ilość urządzeń, a już na pewno nie człowieka. Dla danych, które chcemy dalej przetwarzać i prezentować niezwykle pomocnym jest system plików. FAT32 jest ulepszoną wersją systemu plików FAT16. Wraz ze wzrostem pojemności dysków, FAT16 przestał wystarczać ponieważ na adres klastra przeznaczone było zaledwie 16 bitów, co ograniczało maksymalny rozmiar partycji do 4GB przy rozmiarze klastra 64KB. W FAT32 poszerzono przestrzeń adresową co pozwala nam teoretycznie na obsłużenie partycji do 2TB, jednak w praktyce najczęściej wykorzystuje się go do max 32GB ze względu na spadek wydajności. Systemy FAT są coraz rzadziej stosowane ze względu na brak systemu umożliwiającego przydzielanie/ograniczanie dostępów do zasobów oraz brak dzienników kontrolujących operacje na dysku (tzw. księgowania). Dla konstruktorów systemów mikroprocesorowych FAT32 jest jednak bardzo korzystną opcją, ponieważ w porównaniu do innych taki system jest bardzo łatwy w obsłudze i nie trzeba aż tak wielu zasobów, żeby poprawnie z niego korzystać. Przedstawię może trochę terminologii: Blok danych to najmniejsza jednostka odczytu/zapisu na karcie SD. W kartach SD można było ustawiać rozmiar bloku danych, jednak najczęściej używano 512 bajtów. W kartach SDHC i nowszych SDXC postanowiono ustalić że rozmiar bloku wynosi 512 bajtów i nie da się go zmienić. Klastrem nazywamy najmniejszą jednostkę przechowywania właściwych danych na partycji. Klastry składają się z całych sektorów dlatego muszą być wielokrotnością 512 bajtów. Przykładowo, jeśli rozmiar klastra wynosi 4KB i utworzymy plik tekstowy zawierający jeden znak, to na dysku zostanie wykorzystany nie jeden bajt a cały klaster (4096 bajtów). Partycja to logiczny, wydzielony obszar dysku twardego, który może być sformatowany przez system operacyjny w odpowiednim systemie plików. Na każdej partycji może być zastosowany inny system plików. Aby zacząć działać na systemie plików na początek wysyłamy komendę CMD17 a jako argument podajemy adres 0, czyli adres sektora MBR. W odpowiedzi otrzymujemy 512 bajtów danych, które zawierają: Partycja 1 Program ładujący system operacyjny [446 bajtów] Partycja 2 Partycja 3 Partycja 4 0x55 0xAA W przypadku karty pamięci w miejsce programu prawdopodobnie będą wpisane same 0, ponieważ program ten jest wpisywany przez system operacyjny który znajduje się na którejś partycji. Każdy wpis partycji zajmuje 16 bajtów. Tabela 4. Struktura MBR Strukturę takiego wpisu przedstawia poniższa tabela. Sektor MBR zakończony jest dwubajtową sygnaturą 0x55 0xAA. Status Pierwszy sektor (CHS) Rysunek 5. Struktura wpisu partycji w MBR Typ partycji Ostatni sektor (CHS) Pierwszy sektor (LBA) Rozmiar partycji

Nas interesują dwie ostatnie pozycje w tych wpisach. Wybieramy sobie partycje z której chcemy korzystać i zapisujemy jej adres w przestrzeni dyskowej oraz rozmiar. Do operowania na samych plikach pozostało nam już bardzo niewiele, otóż musimy wczytać jeszcze Boot Sector naszej partycji dzięki temu uzyskamy dostęp do poszczególnych plików. Partycja FAT32 Tabelka obok Kopia Boot Tabela R Tabeli Dane przedstawia strukturę Sector FAT FAT partycji FAT32. Jeśli mamy już adres partycji której chcemy używać, to Tabela 5. Struktura partycji FAT32 możemy wczytać pierwszy sektor tej danej partycji. A więc znowu wysyłamy do karty CMD17 tylko tym razem jako argument podajemy adres LBA początku partycji. W odpowiedzi otrzymamy Boot Sector danej partycji a na podstawie danych, które zawiera można obliczyć adresy początków i końców pozostałych obszarów partycji. Sposób jak obliczyć te adresy przedstawia tabela poniżej. Adres określający początek partycji mamy zapisany wcześniej gdyż potrzebowaliśmy go do odczytu Boot Sectora. Wypisałem także dwa pola które warto odczytać z BS i zapamiętać je, gdyż dane te będą niezbędne do operacji na plikach. Pole w Boot Sector offset nazwa 0x0E Bloki zarezerwowane + początek partycji = początek FAT + początek FAT = początek kopii FAT 0x24 Rozmiar tablicy FAT początek kopii początek obszaru + = FAT danych 0x0D sektorów na klaster 0x2C numer pierwszego klastra 7.1 Struktura tablicy FAT oraz jej kopii. Tabela FAT w systemie FAT32 składa się z 32-bitowych pól. Ilość tych pól możemy wyznaczyć w taki sposób: ilosc=(rozmiar tabeli FAT)/4, ale jest to bardziej ciekawostka niż niezbędna informacja. Każde to pole może przyjmować różne wartości, a wraz z tym z jakiego przedziału jest wartość danego pola decyduje to o jego znaczeniu. Każde to pole jest odpowiada jednemu klastrowi na dysku, np. 5 pole w tabeli odpowiada klastrowi z numerem 5 itd. Informacje jakie niesie takie pole przedstawia tabela poniżej. Wartość 0x0000000 0x0000001 0x0000002-0xFFFFFEF 0xFFFFFF0-0xFFFFFF6 0xFFFFFF7 0xFFFFFF8-0xFFFFFFF Opis Klaster wolny Zarezerwowany Pole wskazuje na adres następnego klastra łańcucha danych Zarezerwowany Uszkodzony lub zarezerwowany Koniec łańcucha (EOC) Kopia zawiera dokładnie te same dane co właściwa tablica FAT.

7.2 Struktura obszaru z danymi. Konkretny fragment obszaru z danymi najczęściej zawiera po prostu ciąg konkretnych danych. Inną funkcją obszaru z danymi jest także przechowywanie danych na temat pliku oraz katalogów jakie znajdują się na dysku, bo to przecież też gdzieś musi być zapisane. Katalog z danymi zajmuje jeden lub wielokrotność jednego klastra, składa się on z 32-bajtowych wpisów. Strukturę wpisu przedstawiam poniżej. Wpis katalogu [32 bajty] Nazwa [8 bajtów] [3 bajty] Rozszerzenie Atrybut [1 B] Czas i data utworzenia [5 bajtów] Dane dodatkowe [3 bajty] Czas i data modyfikacji [4 bajty] Numer klastra [4 bajty] Rozmiar pliku [4 bajty] Tabela 6. Struktura wpisu w katalogu. Zaznaczone kolorem żółtym pole pozwala nam dotrzeć do konkretnych danych w obszarze danych, ale także do określonego wpisu w tablicy FAT, w celu zidentyfikowania następnej części pliku. 7.3 Odczyt danych z dysku. Załóżmy, że chcemy odczytać plik o nazwie STM32.TXT z katalogu głównego. W takiej sytuacji wykonamy następującą sekwencję: Przeszukanie katalogu w celu znalezienia nazwy STM32.TXT Obliczenie numeru bloku na podstawie numeru i rozmiaru klastra Jeśli nie to wczytanie numeru następnego klastra Odczytanie danych Przejście do tabeli FAT i sprawdzenie czy to koniec pliku Jeśli tak to KONIEC Rysunek 6. Sekwencja odczytu pliku z partycji

Jak widać na rysunku idea wcale nie jest bardzo skomplikowana. Podobnie ma się sprawa jeśli chodzi o zapis pliku tylko zamiast przeszukiwać katalog po nazwie, będziemy szukać pierwszego wolnego miejsca na wpis, następnie pierwszego wolnego klastra, potem zapisywać dane, i uzupełniać tabelę FAT tak długo dopóki nie skończą się nam dane do zapisu albo miejsce na karcie pamięci. Jeżeli mamy już zapis i odczyt plików to katalogi możemy traktować jako pliki o zerowym rozmiarze i zaznaczonym atrybucie subdirectory, każdy katalog może zawierać kolejny itd. Główny katalog jest zawsze w pierwszym użytkowym klastrze danych. Ważną informacją jest, że jeśli korzystamy ze standardowych nazw plików i katalogów tj. 8-znaków + 3- rozszerzenie, to nazwa może być zapisywana tylko DRUKOWANYMI LITERAMI, w przeciwnym wypadku plik będzie rozpoznany jako uszkodzony. 8 Przykład zastosowania Wytłumaczyłem już jak działa połączenie Karta SD + FAT32, teraz jako poparcie pokażę przykładowe urządzenie korzystające z tego układu. Otóż, po napisaniu własnej biblioteki do FAT32 formalnością już było zbudowanie układu rejestrującego temperaturę oraz wilgotność powietrza a wyniki pomiarów zapisywanie na kartę pamięci w formacie TXT. Schemat blokowy urządzenia przedstawiam poniżej: Rysunek 7. Schemat blokowy urządzenia Zbudowany w taki sposób układ można spokojnie pozostawić gdzieś w jakimś pomieszczeniu lub w hermetycznej obudowie gdzieś na zewnątrz i już mamy prostą stację meteorologiczną. Po włożeniu karty do czytnika w komputerze odczytujemy plik i kopiujemy do MS Excela i możemy dowolnie je porównywać, przekształcać, robić wykresy itd. Rysunek 8. Prezentacja danych zgromadzonych przez urządzenie

8. Literatura [1] www.sdcard.org, SD Association Physical Layer Simplified Specification [2] www.st.com, STM32F100RB Reference Manual [3] msdn.microsoft.com, Microsoft EFI FAT32 File System Specification [4] www.elektroda.pl/rtvforum