FatFS na PIC32

Bez większych problemów wykorzystywałem bibliotekę FatFS na AVR-ach. Teraz eksperymentuję z PIC32 i zabrałem się za portowanie podstawowych bibliotek albo uruchamianie tych, które już zostały przeportowane. Na oficjalnej stronie FatFS nie ma co prawda wersji pod PIC32, jednak znalazłem kod, który został już przez kogoś zmodyfikowany:

formatting link
Dostosowałem go do swoich potrzeb i próbuję uruchomić. Niestety natrafiłem na pewien problem.

Funckja f_mount(0, &Fatfs), wywołana na początku main() zwraca FR_OK. Czyli wygląda na to, że biblioteka nawiązuje komunikację z kartą i znajduje na niej system plików. Działanie komunikacji po SPI potwierdza analizator stanów logicznych.

Potem, co pięć sekund w nieskończonej pętli uruchamiam następujący kod:

res1 = f_open(&file, "test.txt", (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW | FA_WRITE)); res2 = f_write(&file, "test", 5, &numwritten); res3 = f_close(&file);

I tutaj niestety coś już jest nie tak. res1 zawiera kod błędu FR_NO_FILESYSTEM, a res2 FR_INVALID_OBJECT.

Ktoś wie, gdzie może tkwić błąd?

Reply to
Atlantis
Loading thread data ...

Mi działa bez problemu ale zawsze podaję scieżkę "/test.txt" a nie "test.txt" jeśli plik ma być w głównym. O ile pamiętam w fatfs jest opcja "domyslnego katalogu" ale trzeba ją prawidłowo użyć (skonfigurować fatfs).

Reply to
Marek

A dodatkowo czemu aż tyle flag? Zdecyduj albo FA_CREATE_ALWAYS albo FA_OPEN_ALWAYS. Obie na raz to troche bez sensu....

Reply to
Marek

A i jeszcze jedno, czy na pewno fatfs jest skonfigurowana na write? Jeśli nie a tego pliku nie ma to zwróci błąd (bo fa_create_always oraz fa_open_always nie będą w stanie go utworzyć gdy go nie ma).

Reply to
Marek

W dniu 2015-12-30 o 22:03, Marek pisze:

Niestety nie pomaga. Spróbowałem wykonać operację otwarcia pliku, zapisu i zamknięcia pliku zaraz po f_mount.

O ile f_mount() zwraca FR_OK, to zaraz przy próbie otwarcia pliku dostaję FR_NO_FILESYSTEM. Próbowałem też na samym początku wykonać disk_initialize(0), chociaż AFAIK nie jest to konieczne, bo ta funkcja i tak jest wywoływana gdzieś w trakcie montowania systemu plików. W każdym razie ona także zwraca FR_OK.

Wydaje mi się to nieco dziwne, bo gdyby komunikacja po SPI nie działała, to dostałbym odpowiedni błąd, informujący o problemie z fizycznym nośnikiem.

Hmm... Mogę zostawić sterownik (mmc.c) a resztę plików podmienić z któregoś z działających projektów AVR?

Reply to
Atlantis

Przetestuj najpierw czy działa otwarcie na pewno istniejącego pliku z flagą FA_READ tylko. Jeśli nie zadziała to może być problem z mmc.c, np. użyłeś karty >2GB gdy być może ten mmc nie wspiera takich kart (jest różnica w obsłudze kart do 2GB i powyżej 2GB). Możesz użyć dowolny driver do kart byle by miał prymitywy sectorread/sectorwrite ktore podepniesz pod disk_read i disk_write w fatfs.

Reply to
Marek

W dniu 2015-12-31 o 00:19, Marek pisze:

Dokładnie ta sama sytuacja. W międzyczasie dałem inną wersję biblioteki - ta, z której korzystałem do tej pory była oparta na jakimś starym wydaniu sprzed kilku lat. Na stronie FatFS-a dostępny był przykład dla PIC24, oparty na kodzie sprzed kilku miesięcy. Nie podmieniałem mmc.c, ale dostosowałem go do swoich potrzeb w oparciu o ten posiadany. Modyfikacje dotyczyły głównie funkcji obsługujących SPI. Nowa wersja posiada zmodyfikowaną funkcję f_mount(). Zamiast f_mount(0, &FatFS) wywołuje się f_mount(&FatFS, "", 1). Drugi parametr (jeśli dobrze rozumiem) jest łańcuchem identyfikującym dysk. Można podać numer albo znakową reprezentację. W przypadku jednego napędu daje się pusty (tak jest w dołączonym przykładzie). Trzeci parametr określa, czy funkcja ma podjąć próbę zamontowania systemu plików natychmiast, czy jedynie wstępnie wszystko ustawić i zostawić to na potem, gdy podjęta zostanie operacja otwierania pliku.

Na AVR-ach nigdy nie miałem problemu z obsługą kart większych niż 2GB, a używałem starszej wersji biblioteki, która była pożyczona z przykładu dołączonego do książki, zawierała modyfikacje autora i kilka moich. Wychodziłem z założenia, że jeśli coś działa, to nie będę tego zmieniał. ;) Co ciekawe, miałem kilka razy problem z kartami <=2GB, ewentualnie jakimiś "dziwnymi" i tanimi kartami od Chińczyków. Nie debugowałem problemu i nie mam pojęcia, co mogło go spowodować. Przyszło mi nawet do głowy, że mogą nie obsługiwać transmisji po SPI...

Reply to
Atlantis

W dniu 2015-12-30 o 22:31, Marek pisze:

Tak. Zresztą AFAIR jest to domyślne ustawienie.

Reply to
Atlantis

Na pewno używasz najnowszwj fatfs i _WORD_ACCESS w ffconf.h na pewno masz 0?

w disk_initialize() karte inicjujesz na pewno w bloku case ATA: (to domyślny blok dla NO_MULTIPARTITION)? Podejrzewam, że jednak f_mount nie działa prawidłowo i zawraca błąd tylko coś źle interepretujesz. No chyba że ten fs jest uszkodzony, fsck się nie czepia?

Reply to
Marek

W dniu 2015-12-31 o 09:46, Marek pisze:

Hmm... Wszystko zaczęło działać, gdy podłączyłem linię wykrywającą włożenie karty i odkomentowałem właściwego ifa w disk_timerproc(). Na AVR-ach taka sztuczka działała, tutaj (w nowszej wersji FF) najwyraźniej coś zmieniono. Generalnie w AVR-ach wykrywane włożenia karty stosowałem tylko w tych przypadkach, gdy w projekcie przewidziane było kluczowanie zasilania karty celem zapewnienia stabilnego startu po jej włożeniu.

Obecnie stosuję nową wersję biblioteki - plik z przykładami z którego została wyciągnięta jest oznaczony datą 5 września 2015. Co ciekawe karty, które nie działały z moimi starymi projektami ciągle nie działają. Zaczynam podejrzewać, że one naprawdę nie obsługują SPI. Któryś PIC32 ma sprzętowy interfejs SDIO? ;)

Reply to
Atlantis

Nie widzę związku, f_mount albo zadziała albo nie, wygląda na to że jednak wtedy nie zadziałał i zwrócił błąd a Ty dalej usilnie próbowałeś wywoływać f_open itd. bez upewnienia się czy fat został prawidłowo zainicjowany.

Reply to
Marek

Nie kojarzę, ale w czym problem użyć? Gdzieś widziałem bibliotekę do ssdio. Co do niedzialających spi to mam taką kartę, gdzie sdio nie działa, a działa tylko po spi.

Reply to
Marek

dwie sprawy, nie chciałbyś opisać jak stosuje się we własnych projektach tą bibliotekę? ważniejesz, czy mógłbyś sprawdzić czy i jak działa w niej seek? czy można "latać" po pliku przy odczycie, ale też i przy zapisie? co się dzieje gdy zapisujemy w połowie pliku? czy czasem nie ucina pliku w miejscu zapisania? będę wdzięcznyc za odpowiedź...

Reply to
platformowe głupki

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.