RTV forum PL | NewsGroups PL

Integracja FatFS z PIC32: Rozwiązania dla błędów FR_NO_FILESYSTEM i FR_INVALID_OBJECT

FatFS na PIC32

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Integracja FatFS z PIC32: Rozwiązania dla błędów FR_NO_FILESYSTEM i FR_INVALID_OBJECT

Atlantis
Guest

Wed Dec 30, 2015 8:09 pm   



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:

http://www.microchip.com/forums/m563218.aspx

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?

Marek
Guest

Wed Dec 30, 2015 10:03 pm   



On Wed, 30 Dec 2015 20:09:14 +0100, Atlantis <marekw1986NOSPAM@wp.pl>
wrote:
Quote:
res1 = f_open(&file, "test.txt", (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS
|
FA_CREATE_NEW | FA_WRITE));

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).

--
Marek

Marek
Guest

Wed Dec 30, 2015 10:27 pm   



On Wed, 30 Dec 2015 20:09:14 +0100, Atlantis <marekw1986NOSPAM@wp.pl>
wrote:
Quote:
res1 = f_open(&file, "test.txt", (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS
|
FA_CREATE_NEW | FA_WRITE));

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

--
Marek

Marek
Guest

Wed Dec 30, 2015 10:31 pm   



On Wed, 30 Dec 2015 20:09:14 +0100, Atlantis <marekw1986NOSPAM@wp.pl>
wrote:
Quote:
res1 = f_open(&file, "test.txt", (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS
|
FA_CREATE_NEW | FA_WRITE));

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).

--
Marek

Atlantis
Guest

Wed Dec 30, 2015 11:03 pm   



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

Quote:
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).

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?

Marek
Guest

Thu Dec 31, 2015 12:19 am   



On Wed, 30 Dec 2015 23:03:48 +0100, Atlantis <marekw1986NOSPAM@wp.pl>
wrote:
Quote:
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ć

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.

--
Marek

Atlantis
Guest

Thu Dec 31, 2015 8:44 am   



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

Quote:
Przetestuj najpierw czy działa otwarcie na pewno istniejącego pliku z
flagą FA_READ tylko.

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.

Quote:
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).

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ł. Wink
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...

Atlantis
Guest

Thu Dec 31, 2015 8:45 am   



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

Quote:
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).

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

Marek
Guest

Thu Dec 31, 2015 9:46 am   



On Thu, 31 Dec 2015 08:44:30 +0100, Atlantis <marekw1986NOSPAM@wp.pl>
wrote:
Quote:
Dokładnie ta sama sytuacja.

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?

--
Marek

Atlantis
Guest

Thu Dec 31, 2015 10:10 am   



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

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

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? Wink

Marek
Guest

Thu Dec 31, 2015 10:22 am   



On Thu, 31 Dec 2015 10:10:04 +0100, Atlantis <marekw1986NOSPAM@wp.pl>
wrote:
Quote:
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


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.

--
Marek

Marek
Guest

Thu Dec 31, 2015 10:26 am   



On Thu, 31 Dec 2015 10:10:04 +0100, Atlantis <marekw1986NOSPAM@wp.pl>
wrote:
Quote:
Któryś PIC32 ma sprzętowy interfejs SDIO? Wink

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.

--
Marek

platformowe głupki
Guest

Sat Jan 02, 2016 9:40 am   



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ź...

elektroda NewsGroups Forum Index - Elektronika Polska - Integracja FatFS z PIC32: Rozwiązania dla błędów FR_NO_FILESYSTEM i FR_INVALID_OBJECT

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map