Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 9 kwi 2026, o 02:51


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 21 maja 2013, o 16:13 

Pomógł: 0

Witam!

Walczę! Ale coś wygrać nie mogę ;) Potrzebna jest pomoc kogoś kto ma bibliotekę FatFS w małym palcu.

Wstęp: biblioteka w wersji 0.9b ściągnięta ze strony projektu. Interfejs dla karty "doklejony" pomyślnie. Pierwsze próby zapisu i odczytu zakończone powodzeniem. Napisałem program testowy wczytujący obrazek na LCD. W wersji testowej była to pętla odczytująca 2B z karty (2B to dane o jednym pikselu, format RGB 565) i wrzucająca to na LCD. Wszystko działa super.

Rozwinięcie: wczytywanie takich małych porcji z karty zbyt szybkie nie jest, więc zacząłem to trochę poprawiać. Powstał więc "bufor" do którego wczytuję dane z karty. A potem hurtowo leci do LCD. Wszystko działa dobrze dopóki bufor jest <= 512B. Problem pojawia się przy próbie odczytania na raz więcej niż 512B danych z karty - pojawiają się przekłamania. Tzn FatFS nie zwraca żadnych błędów, liczba odczytach bajtów (przez f_read) się zgadza, ale dane już nie do końca.
Trochę powalczyłem i problem występuje, gdy spełniony jest warunek "if(cc)" w 2488 linijce pliku ff.c:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Za każdym razem gdy program wejdzie w obsługą tych instrukcji (cc!=0), występują przekłamania w odczytanych danych. Na wyświetlaczu objawia się to np. "tęczą" w jednym wierszu pikseli. Próbowałem dojść do tego o co tu chodzi, ale obawiam się, że bez zrozumienia systemu FAT i przeanalizowania połowy biblioteki nic nie wymyślę ;/.
Próbowałem skorzystać z starszych wersji FatFS ale bez zmian. Co ciekawe, gdy "unieszkodliwiam" ten warunek zamieniając bezczelnie "if(cc)" na "if(0)" to ... uwaga !! tadadam!! wszystko działa dobrze, nawet i z buforem 10kB ;/ Tylko boję się, że toto może być jednak do czegoś potrzebne i takie gmeranie na chybił trafił się na mnie zemści.

Zakończenie: pomocy :) Przydadzą się wszelkie informacje: czy ktoś spotkał podobny problem, może udało się rozwiązać? Czy to może być wina karty/systemu plików na niej? Może formatowanie jej pomoże? Ew. może ktoś zna FatFS i wie za co "po ludzku" odpowiada ten warunek?

Pozdrawiam!



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 21 maja 2013, o 16:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 21 cze 2012
Posty: 171
Pomógł: 5

Witam,
widzę, że to nie jest tylko mój problem :D. Ostatnio też bawię się arm i tft. Ja odczytuję pliki bmp 24bit z karty gdzie odczytuję trzy bajty a następnie robię konwersję 565 i do wyświetlacza. Ja też w celu zwiększenia prędkości stworzyłem bufor, najpierw mały i było trochę szybciej więc zrobiłem duży i dupa. Objaw jest jak u ciebie.
Na razie nie mam czasu do tego usiąść i przeanalizować o co chodzi ??. Jak to testowałem to pomyślałem, że jakiegoś babola zrobiłem i dałem sobie spokój (z braku czasu) ale teraz widzę, że to coś innego.
Jak na coś wpadniesz to daj znać.

Pozdrawiam
R.L.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 maja 2013, o 17:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 03 lip 2012
Posty: 238
Pomógł: 5

wwojtek napisał(a):
wczytywanie takich małych porcji z karty zbyt szybkie nie jest, więc zacząłem to trochę poprawiać. Powstał więc "bufor" do którego wczytuję dane z karty. A potem hurtowo leci do LCD. Wszystko działa dobrze dopóki bufor jest <= 512B. Problem pojawia się przy próbie odczytania na raz więcej niż 512B danych z karty - pojawiają się przekłamania. Tzn FatFS nie zwraca żadnych błędów, liczba odczytach bajtów (przez f_read) się zgadza, ale dane już nie do końca.
Trochę powalczyłem i problem występuje, gdy spełniony jest warunek "if(cc)" w 2488 linijce pliku ff.c:


a poszukaj może #define _MAX_SS 512 w pliku ffconf.h .

...tam coś napisane jest odnośnie porcjowania danych, nie mam jak sprawdzić teraz ani później ale to może być to :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 maja 2013, o 18:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 21 cze 2012
Posty: 171
Pomógł: 5

xbary napisał(a):
a poszukaj może #define _MAX_SS 512 w pliku ffconf.h .

...tam coś napisane jest odnośnie porcjowania danych, nie mam jak sprawdzić teraz ani później ale to może być to


To chyba nie to :(
Kod:
#define   _MAX_SS      512      /* 512, 1024, 2048 or 4096 */
/* Maximum sector size to be handled.
/  Always set 512 for memory card and hard disk but a larger value may be
/  required for on-board flash memory, floppy disk and optical disk.
/  When _MAX_SS is larger than 512, it configures FatFs to variable sector size
/  and GET_SECTOR_SIZE command must be implememted to the disk_ioctl function. */



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 mar 2014, o 13:08 

Pomógł: 0

Ostatnio wróciłem do zabawy i poniekąd rozwiązałem problem. Może komuś się przyda. Błąd oczywiście nie tkwił w samym FatFS tylko w sprzętowej/niskopoziomowej warstwie programu. Wadliwie działała funkcja czytająca kilka bloków z karty na raz. Unieszkodliwienie warunku, które opisałem w pierwszym poście nie naprawiło problemu tylko go zamaskowało. FatFS z "modyfikacją" z pierwszego posta cały czas odczytywał dane po jednym bloku. Działał przez to "poprawnie" tylko zdecydowanie wolniej :)



Góra
  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 8 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO