sobota, 8 grudnia 2018

FatFs - implementacja biblioteki dla PIC32MM

W artykule zajmiemy się implementacją znanej biblioteki FatFS dla PIC32MM. Inspiracją do zajęcia się tym zagadnieniem był fakt posiadania czytnika kart SD w wyświetlaczu ILI9163 do którego tworzyliśmy bibliotekę jakiś czas temu.
Szkoda aby czytnik marnował się w wyświetlaczu nie używany. Tym bardziej , że wyświetlacz ten znajdziemy w  moim najnowszym projekcie płytki developerskiej dla PIC32MM. Zatem bierzemy się niezwłocznie do roboty. Na początek należy zdobyć  kartę SD. Fajnie abyśmy mieli dostęp do czytnika w PC, mnie udało się taki znaleźć w moim  laptopie. Trzeba było go tylko uaktywnić w BIOS-ie.

Kartę SD jaką wygrzebałem na strychu to microSD, znalazłem również dla niej adapter. Sumarycznie wygląda to dokładnie jak poniżej :


Karta była już sformatowana w FAT32, więc jedna czynność mniej. Do testów posłużę się moją pierwszą wersją płytki developerskiej z wyświetlaczem firmy EA model DOGM162E-A :



Czytnik kart osadzony w wyświetlaczu ILI9163 wygląda jak poniżej :
Biblioteka FatFs jest kobylastym tworem, który umożliwia praktycznie wszystko jeśli chodzi o karty SD. To rozbudowanie biblioteki jest wadą i zaletą jednocześnie. Na stronie projektu znajdują się przykłady dla różnych platform sprzętowych m.in dla PIC24 (16-bitowych) i to będzie moja baza do implementacji. Przykład obsługi biblioteki jaki jest zaserwowany na stronie projektu jest trochę nadmiernie skomplikowany bo wprowadza dodatkową abstrakcję w postaci sterowania za pomocą terminala PC i połączenia  UART. Zaserwowany przez autorów biblioteki przykład jest na pewno sporym utrudnieniem dla osób początkujących i z pewnością barierą nie do przejścia. Dlatego aby innym było łatwiej postanowiłem ten przykład zrobić po swojemu czyli tak jak sam bym oczekiwał tego od autorów biblioteki.

Jak widać na zdjęciu do sterowania czytnikiem SD , producent płytki z wyświetlaczem ILI9163 nie przewidział dwóch pinów do diagnostyki stanu karty WP i CD . Czyli nie mamy tutaj pinu informującego czy karta jest w slocie CD i pinu informującego o blokadzie zapisu WP. Biblioteka FatFS uwzględnia w swoich działaniach te piny, więc musiałem ich obecność zasymulować w programie a zrobiłem to prostą definicją :

#define MMC_CD        (1)   /* Card detected   (yes:true, no:false, default:true) */
#define MMC_WP       (0)   /* Write protected (yes:true, no:false, default:false) */

Do sterowania czytnikiem kart użyłem SPI2 w PIC32MM, na tym numerku SPI mamy możliwość prawie dowolnego przyporządkowania pinów do peryferium.
Piny jakie wykorzystałem w projekcie to :

Required connections for LCD:
     - E     -  RB11
     - RS  -  RB10
     - D7  -  RD0
     - D6  -  RC5
     - D5  -  RC4
     - D4  -  RC3
  
 Required connections for SD card:
     - SCK    - RA0
     - MISO  - RA1
     - MOSI  - RA3
     - CS      - RB3

Do konfiguracji sprzętowej projektu wykorzystałem plugin do MPLABX-IDE w postaci MCC. Czyli sprzętowy szablon projektu został utworzony automatycznie. W tym punkcie najmniej się napracowałem bo wszystko zostało wyklikane na uroczych i czytelnych obrazkach. W konfiguracji ustawiłem SPI2 , Timer1 (1ms + przerwanie) , piny sterujące wyświetlaczem DOGM162W-A. Wtyczka MCC została jak widzę ładnie ostatnio podrasowana przez Microchipa i obecnie sygnalizuje czytelnie drobne błędy konfiguracyjne takie jak np. brak ustawienia pinu jako wyjście dla peryferium wymagającego takiego ustawienia etc., wydzielono widzę również plik osobny dla zegara co zwiększa czytelność kodu. Wygląda na to , że idzie dobra zmiana w Microchipie :). 

Ciekawostka przyrodnicza :
Microchip zwiększył przychody o 40 % w stosunku do analogicznego kwartału w roku poprzednim a do poprzedniego kwartału o 18 %. Microchip będzie płacił rekordową dywidendę ok 36 centów na akcje. Można na tej podstawie wysnuć wniosek, że Microchip rozkwita finansowo i globalnie mamy jakiś bum na produkty Microchipa. Dla porównania wykresy za 3 lata cen akcji Microchipa i STM:



Obecnie mamy na spółkach technologicznych korektę wzrostów z poprzednich lat. Microchip za 1 rok spadek ceny akcji na poziomie - 16 % 
Zerknijmy teraz na STM :


Spadek cen akcji na STM za 1 rok to -37% !!!!, co prawda dynamika wzrostu cen akcji z poprzednich lat była większa (bum na ARM-y) ale nie zmienia to faktu, że inwestycja w akcje STM jest obarczona moim zdaniem znacznie większym ryzykiem niż w akcje Microchipa. Warto tu też mieć na uwadze, że architektura ARM może nie długo zostać wyparta przez RISC-V a tę ostro wspiera Microchip za pomocą swojej spółki Microsemi. Dla przypomnienia architektura ARM jest własnościowym produktem czyli producent jeśli chce ją wykorzystać w swoich produktach musi bulić haracz , architektura RISC-V jest open source czyli za free. Moim zdaniem RISC-V jest w stanie całkowicie wyprzeć ARM-a z systemów embedded. Idą ciekawe czasy .

koniec ciekawostki przyrodniczej

Jak wspominałem bazą do implementacji biblioteki dla PIC32MM była jej wersja dla PIC24 , ściągnieta z oficjalnej strony FatFs.
Moja ingerencja była drastyczna jeśli chodzi o przykład w pliku main.c, samo core biblioteki nie tykałem, więc wszystkie funkcje powinny chodzić bez problemu. A jakie funkcję mamy do dyspozycji i co robią  to jest ładnie opisane  na stronie projektu FatFs. ja tej wiedzy nie będę powielał. Poniżej tylko skrót typowych komend bibliotecznych :


Kilka plików z oryginalnej biblioteki wywaliłem związanych z PIC24. Z pliku ffunicode.c wypierniczyłem czcionki Chińskie, Japońskie i Koreańskie. Przepraszam z góry obywateli tych państw za niedogodności. Biblioteka na starcie wykorzystuje blok czcionki o numerze 437 (US) teoretycznie resztę można by było wywalić . Ale PIC32MM z 256 kB Flash i 32 kB RAM nawet tego nie zauważy. Do analizy został mi jeszcze wątek czasowy w bibliotece, związany z RTC bo widzę niepotrzebne marnowanie zasobów w tym kontekście np tykanie co 1 ms Timera. Biblioteka przy zapisie potrzebuje tego czasu ale nam to na grzyba potrzebne raczej.

Teraz po krótce napiszę co robi przykład w pliku main.c.

1. Inicjalizuje kartę, jeśli nastąpi jakis błąd np . brak karty w slocie to zostanie wyświetlony komunikat o błędzie a w drugim wierszu numer kodu błędu.

2. Utworzenie pliku na karcie o nazwie plik.txt

3. Zapis do utworzonego pliku stringa Hello I'm write

4. Odczytanie z pliku plik.txt zawartości czyli napisu z pkt.3, dane są zapisane do bufora Buff

5. Wyświetlenie na LCD zawartości bufora Buff gdzie znajdują się dane odczytane z pliku plik.txt.

Jeśli wszystkie operacje się powiodą zobaczymy na wyświetlaczu napis Hello I'm write i w drugim wierszu ALL OK !
Przykład jest tak prosty jak tylko się dało :) i pokazuje najprostsze operacje na karcie SD przy użyciu biblioteki FatFs. Fajnie jest zobaczyć na własne oczy zapisany plik i zawartość na czytniku w PC.Bo wtedy jest efekt Łał !!!. Jeśli nie mamy do dyspozycji wyświetlacza DOGM162W-A to bez problemu można sobie przerobić przykład na popularne HD44780

Projekt z GitHuba ściągamy za pomocą opcji Clone , którą znajdziemy w Team-->Remote w MPLABX-IDE . A tak na marginesie z GitHubem warto się zaprzyjaźnić to jest naprawdę genialny wynalazek. Wiedzę można zdobyć z neta lub z książki np. tej : Git Rozproszony system kontroli wersji. Włodzimierz Gajda. Nawet jak nam się wydaje , że to jest zbędne bo nasze projekty są zbyt proste i nie pracujemy np. w grupie, to uważam , że warto bo ta wiedza wcześniej czy później zaprocentuje i przyczyni się m.in do komfortu pracy z kodem.

Pozdrawiam
picmajster.blog@gmail.com


Linki :

FatFS - oficjalna strona
Biblioteka na GitHub

6 komentarzy:

  1. Czekam jak święta się skończą i potestuje

    OdpowiedzUsuń
  2. Rozumien , że Żona do roboty zagoniła przed świetami :) Witek jak ogarniesz Wiznet W5500 to krzyknij czy się udało. Bo tak mi trochę smaka narobiłeś na ten wynalazek.

    OdpowiedzUsuń
  3. tak. Najpierw muszę zlutować tą płytkę ewal. i do niej podłączyć moduł , poprzednia wersja na uniwersalnej płytce się rozpadła i nie mam siły ją naprawiać

    OdpowiedzUsuń
  4. Czyli wypadałoby zrobić moduł PICbus z WZ5500. Ale patrz Mikroeletronika ma już gotowy :
    https://www.mikroe.com/eth-wiz-click ,do moich płytek można go zaaplikować.

    OdpowiedzUsuń
  5. https://www.tme.eu/pl/details/wiz850io/moduly-ethernet/wiznet/ ja mam ten i na uniwersalnej podłączyłem do pic32mm064 w dip 28 , działał kiedyś , ale teraz już nie

    OdpowiedzUsuń
  6. Ja stykówki na strych wyniosłem. Ten etap swojego życiorysu już mam za sobą :) a przynajmniej staram się mieć za sobą. Moduły W5500 takie jak dałeś link są u nas do dostania po 35 zeta, ale może w tej cenie są jakieś problemy z ich oryginalnością.

    OdpowiedzUsuń