[Petit FatFs] library R0.03

Tu możesz pisać o swoich problemach z pisaniem programów w języku C dla AVR.
Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

[Petit FatFs] library R0.03

Postautor: Antystatyczny » niedziela 03 kwie 2016, 13:29

Witam serdecznie

Chciałbym się podzielić moimi spostrzeżeniami i przeróbkami biblioteki Petit FatFs w wersji R0.03. Zasadniczo jest to zbiór kodów oraz informacji znalezionych w sieci, a ja to jedynie posprzątałem i co nieco rozbudowałem część niskopoziomową. Postaram się to przedstawić w prostej i zwięzłej formie.

O sposobach podłączenia karty do mikrokontrolera nie będę się rozpisywał, bo w sieci jest mnóstwo miejsc, w których jest to solidnie opisane.
Przytoczę tu trzy adresy, z których ja skorzystałem:

http://mikrokontrolery.blogspot.com/201 ... ci-sd.html
http://elm-chan.org/docs/mmc/mmc_e.html
http://elm-chan.org/docs/spi_e.html

Gniazdo kart microSD, z którego było mi dane korzystać, znajduje się na wyświetlaczu TFT i podłączone jest do SPI poprzez scalony bufor 74HC245, który zapewnia translację napięć 3.3V <> 5V. Ok, koniec ględzenia... Czas na jakiś kawałek kodu.

Poniżej udostępniam program montujący kartę i wyświetlający przez uart listę plików znajdujących się w katalogu głównym. Program jest bogato skomentowany, ale niektóre drobiazgi omówię i tutaj.

Aby rozpocząć pracę z kartą, należy ją zamontować poleceniem pf_mount(); Polecenie to przyjmuje argument w postaci adresu struktury typu FATFS. W strukturze tej, po udanym zamontowaniu karty, znajdziemy podstawowe dane o systemie plików. Póki co nie miałem potrzeby korzystania z tych danych.

Aby otworzyć plik znajdujący się w katalogu głównym wystarczy polecenie pf_open(), do którego należy przekazać w postaci tekstu nazwę tego pliku wraz z rozszerzeniem. Przykład:

Kod: Zaznacz cały

result = pf_open("BITMAPA1.BMP");


Dlaczego użyłem zmiennej result? Ano po to, by od razu znać wynik próby otwarcia pliku. Jeżeli plik nie istnieje, bo np. błędnie określiliśmy nazwę,
funkcja zwróci nam kod FR_NO_FILE. Jest to prosty i skuteczny sposób na to, by nie próbować czytać z pliku, którego nie dało się otworzyć.

Tutaj uwaga: W pliku pffconf.h jest makro określające, czy biblioteka Petit FatFs ma dopuszczać do korzystania z małych liter w nazwach plików i ścieżkach.

Kod: Zaznacz cały

#define _USE_LCC   0


Jeśli parametr ten ustawiony jest na 0, należy używać wyłącznie wielkich liter. Jeśli wpiszemy nazwę pliku lub ścieżkę małymi literami, biblioteka zwróci nam kod FR_NO_FILE.

Jeśli parametr ustawimy na 1, będziemy mogli swobodnie korzystać z małych i wielkich liter, ale okupimy to zwiększonym zużyciem pamięci RAM o 128 bajtów. Coś za coś.

Ok, to teraz otwórzmy jakiś katalog znajdujący się na karcie. Przypuśćmy, że katalog ten ma nazwę music.

Aby otworzyć jakikolwiek katalog, musimy przygotować sobie strukturkę typu DIR. W przykładowym programie nazwałem tę strukturę katalog.
Przykład:

Kod: Zaznacz cały

result = pf_opendir(&katalog, "/");


Do polecenia pf_opendir() przekazuję adres struktury przechowującej dane o katalogu oraz ścieżkę do katalogu. W przypadku katalogu głównego należy przekazać kod znaku mniejszy od kodu spacji. Specyfika działania tego polecenia powoduje, że ukośnik jest pomijany i odczytywany jest kolejny znak. W naszym przypadku kolejnym znakiem jest null, czyli zero. A zatem warunek spełniamy, bo zero jest kodem niższym od kodu spacji. Dlaczego tak, a nie inaczej? Przecież można by zrobić tak:

Kod: Zaznacz cały

result = pf_opendir(&katalog, 0);


Można... I tak też działa, ale uznałem, ze taki zapis jest mniej czytelny.


Gdy już udało nam się otworzyć katalog, możemy odczytać jego zawartość. Aby móc skorzystać z tego dobrodziejstwa, potrzebujemy strukturę typu FILINFO, w której to znajdować się będzie wynik działania polecenia pf_readdir();
Przykład:

Kod: Zaznacz cały

result = pf_readdir(&katalog, &file


Wynikiem tego polecenia będzie wypełnienie wypełnienie struktury file. Ja z tego skorzystałem w następujący sposób:

Kod: Zaznacz cały

while (pf_readdir(&katalog, &file) != FR_NO_FILE)
   {
      //wysyłam nazwę znalezionego pliku
      uart_puts(0, file.fname);
      uart_puts_P(0, PSTR("\r\n"));
   }


Czytam tak długo katalog główny, aż polecenie pf_readdir() natrafi na koniec wpisów w tablicy i zwróci FR_NO_FILE. Wtedy wiem, że przeczytałem całą zawartość katalogu (w tym przypadku głównego). Ok, na dziś to chyba wszystko, ale jeszcze dodam kilka słów o konfiguracji samego SPI.

Zasadniczo, o ile zadowolimy się dedykowanym pinem SS w ATmedze, nie trzeba niczego konfigurować, bo przygotowałem automat, który skompiluje odpowiedni kawałek kodu zależnie od wybranego przez nas układu w ustawieniach projektu. Poza tym w pliku AVRlowlevel.h są dwa makra:

Kod: Zaznacz cały

#define _HARDWARE_SPI
//#define _SOFTWARE_SPI


Jeśli z jakichś przyczyn nie możemy skorzystać ze sprzętowego SPI, wystarczy zakomentować makro _HARDWARE_SPI, odkomentować makro _SOFTWARE_SPI oraz określić piny, na których ma pracować programowe SPI:

Kod: Zaznacz cały

#if defined(_SOFTWARE_SPI)

#define SPI_SCK_PORT   B
#define SPI_SCK_BIT      5

#define SPI_MISO_PORT   B
#define SPI_MISO_BIT   4

#define SPI_MOSI_PORT   B
#define SPI_MOSI_BIT   3

#define SPI_CS_PORT      B
#define SPI_CS_BIT      2


Oczywiście programowe SPI działa nieco wolniej, ale nie ma tragedii - dużej różnicy nie ma.

No to chyba na tyle... Pozostaje dodać kompletny projekt dla IDE Eclipse:

Petit_FatFs_R0_03.zip


Pozdrawiam.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

SuperGość
Uber Geek
Uber Geek
Posty: 2346
Rejestracja: piątek 04 wrz 2015, 09:03

Re: Petit FatFs library R0.03

Postautor: SuperGość » niedziela 03 kwie 2016, 13:44

Dzięki, kawał dobrej pracy wykonany.

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: Petit FatFs library R0.03

Postautor: Antystatyczny » niedziela 03 kwie 2016, 15:06

To takie podsumowanie... Bo wczoraj przez cały dzień się z tym kopałem, no ale teraz już działa poprawnie. W oryginalnym libsie był babolek, ale udało mi się go namierzyć i usunąć. Gdyby były jeszcze jakieś problemy, to dać znać - spróbuję się z tym zmierzyć.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
Nefarious19
Newb
Newb
Posty: 80
Rejestracja: sobota 02 sty 2016, 20:45

Re: [Petit FatFs] library R0.03

Postautor: Nefarious19 » niedziela 03 kwie 2016, 15:29

Bardzo, bardzo dziękuję. Anty, jesteś niezastąpiony ;) ja chciałem napisać swoje libsy do obsługi SD ale wgryzienie się w ten temat wymaga sporo czasu a ja ostatnio cierpię na jego deficyt :( przynajmniej (jak narazie) spróbuje poanalizować kod ;) jeszcze raz dzięki ;)
Plany na przyszłość: C, C++, C#

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: [Petit FatFs] library R0.03

Postautor: Antystatyczny » niedziela 03 kwie 2016, 15:35

Sam też ją wciąż rozgryzam, ale gdybyś miał jakieś pytania, to wal śmiało.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
matty24
User
User
Posty: 333
Rejestracja: sobota 31 paź 2015, 20:11
Lokalizacja: Małopolska

Re: [Petit FatFs] library R0.03

Postautor: matty24 » niedziela 03 kwie 2016, 16:36

No no no... robisz robotę Antystatyczny. Gratuluję wytrwałości i dzięki za podzielenie się efektami swojej pracy.

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: [Petit FatFs] library R0.03

Postautor: Antystatyczny » niedziela 03 kwie 2016, 16:39

Drobiazg. Poza tym większość tej roboty nie jest moja. Ja to tylko poskładałem do kupy i co nieco uporządkowałem. Najważniejsze jest jednak "know how" i dlatego powstał ten artykuł. Jak to ktoś gdzieś i kiedyś napisał w internecie... Z pozdrowieniami dla tych, którzy tę wiedzę ukrywają :)
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.


Wróć do „Programowanie AVR w C”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 6 gości