Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

stm32 - fatfs - SPI - Nie zmienia rozmiaru pliku przy zapisie i lseek'u

rafz 01 Oct 2013 19:49 2469 7
  • #1
    rafz
    Level 12  
    Witam!

    Mam problem z fatfs 0.09b (najnowsza; wersja 0.07 też nie działa) pod stm32f103vet6. Komunikacja SPI. Maksymalny prescaler SPI do debug'u. (Na każdej prędkości to samo).
    Disk timer proc na SysTick'u (działa).
    Karta formatowana na różne jednostki alokacji, FAT, FAT32 zawsze to samo. Nie korzystam z LFN. Strona kodowa 852, 125x, 1 (ANSI) bez znaczenia.
    PLL 72MHz, bez PLL (8MHz HSI) nie ma znaczenia.
    Korzystam z przykładu Freddiego Chopina. Stos zwiększony do 4kB+4kB.
    Nie używam biblioteki stm32stdp..


    Plik mmc.c (konfiguracja SPI i funkcje SPI);

    Code: c
    Log in, to see the code


    Program nie może zmienić rozmiaru pliku. Odczytuje, tworzy pliki bez problemu. Zapis działa częściowo - zapisuje tylko tyle bajtów ile ma otwarty plik. Nowo utworzony plik o długości 0 bajtów nie może zostać przedłużony próbowałem też tak:

    Code: c
    Log in, to see the code



    l_seek (512) zwraca błąd 1 a kolejny 2; fclose zwraca mi jedynkę nawet jak próbuję zapisać bez lseeka.
    Wygląda na to, że program nie może zmodyfikować wpisu dot wymiaru pliku bo sprawdzając kartę na PC dane z fwrite są zapisane (sprawdzałem programem HxD) ale plik nie ma zwiększonego rozmiaru.

    Proszę o pomoc.
  • #3
    rafz
    Level 12  
    Jeżeli chodzi o ffconfig.h to próbowałem różnych ustawień a z desperacji ;) nawet zupełnie kosmicznych ich kombinacji. Jeżeli chodzi o ustawienia kompilatora to -O0 -> prawie najnowszy bleeding edge toolchain. Przed każdym buildem robię clean'a.

    Dodam, że dzieje się to na dwóch różnych kartach. Próbowałem też z różnymi typami zmiennych a uchwyt systemu pliku i zmienna FIL są static global (na lokalnych to samo...)

    Zaczynam się zastanawiać czy odpowiednio zmodyfikowałem skrypt linkera z przykładu (stm32f103xB) bo te cuda które się dzieją wskazują raczej na problemy ze stosem. Wszyskie 'break i watch pointy' wykasowane.

    Goły kod bez dodatków. FatFs + main + systick handler + rtc (bez rtc też problemy);

    Ustawiłem spory stos na wszelki wypadek. Z racji tego że f103VET6 ma 512k flash i 64k ramu zmieniłem skrypt tak:

    
    __main_stack_size = 0; -> 4096
    __process_stack_size = 1024; -> 4096 
    
    (...)
    
    MEMORY
    {
    	rom (rx)	: org = 0x08000000, len = 128k -> 512k
    	ram (rwx)	: org = 0x20000000, len = 20k   -> 64k
    }
    


    Może się mylę ? ale adresy są takie same.
  • #4
    Freddie Chopin
    MCUs specialist
    rafz wrote:
    Zaczynam się zastanawiać czy odpowiednio zmodyfikowałem skrypt linkera z przykładu (stm32f103xB) bo te cuda które się dzieją wskazują raczej na problemy ze stosem.

    Objawem problemów ze stosem są "losowe" zawieszenia programu lub tzw. "pójście w maliny". To że jakaś funkcja nie działa raczej nie ma nic wspólnego ze stosem...

    Modyfikacje skryptu linkera są OK, choć stos dla przerwań raczej sporo za duży [;

    Czy sprawdzasz wartości zwracane przez f_mount() i f_open()? Czy jeśli nie wykonujesz lseek() to wszystko działa jak trzeba?

    4\/3!!
  • #5
    rafz
    Level 12  
    W maliny nie idzie chociaż czytałem na forum FatFs, że wspomniane błędy pojawiają się przy problemach z alokacją pamięci i ew nadpisywaniem zmiennej FIL.

    f_mount muszę jeszcze raz sprawdzić. Podłączyłem tft i sprawdzam wszystkie wartości na bierząco - oprócz tej...

    Kiedy plik ma wielkość np 1 bajtu. f_open, f_lseek, f_write zwracają 0 a dopiero f_close zwraca 1. Nie sam f_lseek jest problemem. Bo dane fizycznie są zapisywane tam gdzie f_lseek ustawi wskaźnik (sprawdzane hex editem). Najdziwniejsze jest to że kiedy tworzę nowy plik wszystko wygląda na ok tj. nazwa oraz czas utworzenia. Plik się otwiera a PC nie stwierdza błędów na karcie. Za to rozmiar pliku w tablicy alokacji jest niezmieniony.

    Stos ustawiłem profilaktycznie na duży bo już tracę pomysły jak to ugryźć...

    .... No i sprawdziłem f_mount zwraca 0. Dane na karcie się pojawiają a na PC plik pusty....

    edit:
    Teraz mam tak: sprawdzałem wielkość pliku f_size(&fp) i do momentu f close wszystko gra. f_write zwraca tyle bajtów ile ma zapisać (i zapisuje) f_lseek powiększa plik do zadanej wielkości i ... problem pojawia się przy funkcji f_sync. f_sync jest częścią f_close stąd f_close też daje błąd nr 1. Poniżej fragment kodu f_sync'a zwracający błąd 1.

    Code: c
    Log in, to see the code


    edit 2013-10-02
    Pojawiła się właśnie nowa wersja FatFs 0.10 -> bez zmian.

    edit 2013-10-04
    Przepisałem wszystko od nowa bez przerwań i systicka. Przeprowadziłem próby na innych kartach, na SPI1,SPI2,SPI3. Nie działa.

    Ma ktoś jakiś inny pomysł ?
  • #6
    rafz
    Level 12  
    Piszę post pod postem bo nie mogę dodać załącznika edytując poprzedni. Moderatora proszę o scalenie postów.

    Załączam pełny kod źródłowy (Pod bleeding-edge-toolchain). W ramach możliwości proszę o sprawdzenie u siebie. Ja ciągle mam błędy z f_sync/f_close/f_write gdy plik ma wielkość 0.
  • #8
    rafz
    Level 12  
    Dzięki wielkie!

    wałkowałem to ładne parę dni a takiej głupiej pomyłki nie zauważyłem ;) za to poznałem dość dobrze kod fatfs ;)

    ... oprócz zapisu TRZEBA także odczytać rejestr SPI...