Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Obsługa FATfs z CubeMX w STM32f103

Rafal_777 11 Feb 2019 17:29 2544 57
Tespol
  • #1
    Rafal_777
    Level 5  
    Chcę zrobić obsługę FAT w STM32f103 za pomocą CubeMX i HAL-a. Zabrałem się więc za modyfikowanie plików do obsługi FATfs według strony jaras.com.pl
    Nie zmodyfikowałem tylko pliku fatfs.c dla zadeklarowania zmiennej VolToPart:
    Code: c
    Log in, to see the code

    ponieważ chcę korzystać tylko z jednej partycji na karcie SD.

    Jednak po f_mount:
    Code: c
    Log in, to see the code
    otrzymuję res=11.

    Czego tu jeszcze brakuje aby zainicjować kartę?
  • Tespol
  • #2
    ex-or
    Level 27  
    FF_MULTI_PARTITION w ffconf.h ustawiłeś oczywiście na 0?

    Kod błędu 11 to:
    Code: c
    Log in, to see the code

    czyli wiadomo, że coś jest nie tak z drugim argumentem f_mount. Wg mnie na pewno nie powinno być tam slesza "/" bo nie wchodzi on w skład numeru logicznego napędu lecz jest częścią ścieżki.
    Sprawa nr dwa to wątpliwość czy "1:" jest prawidłowym numerem tj. czy rzeczywiście masz dwa "napędy".
  • Tespol
  • #3
    Rafal_777
    Level 5  
    _MULTI_PARTITION mam ustawiony na 0.
    Gdy zmienię na: f_mount(&fs, "0:", 1); to res=3 a po ponownym sprawdzeniu bez wyłączenia pojawia się res=1.

    Nie jestem pewien, czy kod wygenerowany przez CubeMX generuje procedurę zmiany z SDIO na tryb SPI przez wysłanie co najmniej "74 impulsów"? A przynajmniej nie znalazłem tego w tym gąszczu bibliotek HALa.
  • #4
    ex-or
    Level 27  
    Na stronie, na którą się powołujesz stoi nasmarowane: " CubeMX tworzy projekty, w których FatFs jest już skonfigurowany i gotowy do użycia, lecz niestety nie dla SD połączonej przez SPI." Tak więc wygląda na to, że niskopoziomowe funkcje musisz sobie napisać samemu albo skorzystać z opublikowanych na wspomnianej stronie. Albo spisać sobie ze strony ELMChan.
  • #5
    -XantiO-
    Level 21  
    Tak jak kolega ez-or napisał. Z Cuba wygenerujesz jedynie obsługę kart w SDIO i to w dodatku tylko w trybie 1bit. Resztę trzeba skonfigurować/dopisać ręcznie.

    Dodatkowo CubeMX miał przez jakiś czas błąd z obsługą detekcji karty co zostało poprawione chyba w wersji 5.0
  • #6
    Rafal_777
    Level 5  
    Też mi się tak wydawało, że CubeMX nie oferuje obsługi karty przez SPI. Tylko dlaczego tamten artykuł omawia połączenie przez SPI, a pomija opis konieczności dopisania części kodu do tego...
    Czy jest gdzieś dokładny opis krok po kroku od CubeMX do uruchomienia karty z dokładnym opisem?
  • #7
    ...KUBA...
    Level 24  
    Rafal_777 wrote:
    Tylko dlaczego tamten artykuł omawia połączenie przez SPI, a pomija opis konieczności dopisania części kodu do tego...

    Cześć, również jestem na etapie konfigurowanie SD ale ja wybrałem STM z SDIO. Czytałem też trochę o połączeniu SD przez SPI, jeśli zechcesz to wygrzebię inne artykuły na ten temat. Autor przytoczonego artykułu w pierwszej linijce tekstu wskazał inny artykuł któy dotyczy konfigurowania FATFS i SPI. W CubeMX nie zaznaczasz SDIO, tylko sam FATFS i zaznaczasz User-defined.
  • #8
    Rafal_777
    Level 5  
    Jak możesz to podeślij te artykuły. Zawsze to można znaleźć jakieś nowe informacje :)

    Dodałem funkcję:
    Code: c
    Log in, to see the code


    Jednak rezultatem jest 1 (spi error), niezależnie czy jest włożona karta czy nie.
    Choć widać, że pin CS poprawnie zmienia się na 1.
  • #9
    Rafal_777
    Level 5  
    Czy w STM32 przewody sygnałowe do karty SD trzeba jakoś specjalnie podciągać rezystorami, czy w dokładać jakieś w szereg do niektórych przewodów, aby był poprawny i pewny odczyt?
  • #10
    ...KUBA...
    Level 24  
    Ja wzorowałem się schematem Eval Borda, albo Discovery, wszędzie praktycznie spotkałem Pull Up 47K lub 10K NA LINIACH DANYCH i CMD (bez CLK) i kondensator 100nF przy VDD. Spotkałem się też z szeregowo dodanymi rezystorami 22Ohm na liniach danych, ale nie znalazłem wytłumaczenia czemu służą, zabezpieczenie pinów przed prądem??
  • #11
    User removed account
    Level 1  
  • #12
    Rafal_777
    Level 5  
    Czyli dla świętego spokoju najlepiej podciągnąć wszystkie linie przez rezystory 10k i szeregowo małe 22R?

    Spotkałem też schemat w którym wszystkie linie były podciągnięte włącznie z CLK Link. Czy to jest poprawne?
  • #13
    ...KUBA...
    Level 24  
    Marek_Skalski Dziękuję za to wyjaśnienie, rozświetliło mi spojrzenie, bardzo przyda się ta wiedza ;) Właśnie walczę z uruchomieniem karty SD ale przez SDIO z jedną linią danych z rezystorami pull-up bez podłączonych szeregowo rezystorów. I mam taki problem, że jak ustawię częstotliwość taktowania dla SDIO większą niż 4MHz, to nie da się już dogadać z kartą (próbowałem różne kart 512MB, 4GB, 8GB) ;/ A niby powinna pracować do 48MHz. Może dlatego, że na razie układ mam złożony na kabelkach na "pająka", ale spróbuję zobaczyć oscyloskopem co dzieje się na wyprowadzeniach karty.
  • #14
    Freddie Chopin
    MCUs specialist
    ...KUBA... wrote:
    A niby powinna pracować do 48MHz.

    Karta pracuje domyślnie na max 25 MHz. Aby przełączyć ją na wyższe zegary trzeba wykonać zmianę trybu przy użyciu stosownej komendy, której numeru teraz oczywiście nie pamiętam
    ...KUBA... wrote:
    Switch Function" (dobra, sprawdziłem - CMD6).

    [quote="...KUBA..."]I mam taki problem, że jak ustawię częstotliwość taktowania dla SDIO większą niż 4MHz, to nie da się już dogadać z kartą (próbowałem różne kart 512MB, 4GB, 8GB) ;/

    Zegar dla samego SDIO powinien wynosić 48 MHz. Zegar dla karty regulujesz dzielnikiem. Podczas inicjalizacji zegar ustawiasz na max 400 kHz.

    Generalnie akurat piszę swój driver dla kart SD przez SDMMC i moje osobiste zdanie jest takie, że działa to zdecydowanie lepiej niż przez SPI, gdzie cały czas trzeba robić jakieś dziwne czary i kombinacje.
  • #15
    marycyś
    Level 12  
    Witam, piszę obsługę SD według tej samej strony jaras.com.pl co autor tego tematu.

    Gdy karta jest wyjęta to pojawia się błąd niemożności zainicjowania karty =1 z funkcji:
    Code: c
    Log in, to see the code

    i to jest OK, jednak jak karta jest włożona to z tej funkcji zwracane jest 3. Jak to trzeba interpretować i naprawić?
  • #16
    Rafal_777
    Level 5  
    Witam ponownie. Mam trochę czasu więc zająłem się kontynuowaniem obsługi FATfs.

    Gdy po inicjalizacji karty wysyłam:
    f_mount(&ff, "", 0);
    to otrzymuje =0, czyli OK

    Jednak jak wysyłam:
    f_open (&File,"plik.txt", FA_CREATE_ALWAYS);
    otrzymuje = 3

    Co może powodować taką reakcję?
    Czy karta jest poprawnie zainicjowana skoro otrzymuje po f_mount reakcję =0?
  • #17
    -XantiO-
    Level 21  
    Radzę spojrzeć czy karta jest rzeczywiście zamontowana
    Code: c
    Log in, to see the code

    nie znaczy, że to jest wykonane
    Code: c
    Log in, to see the code


    A więc spróbuj opcji:
    Code: c
    Log in, to see the code

    I dopiero podaj co zostanie zwrócone
    ------------------------------
    EDIT
    ------------------------------
    A najlepiej wstaw kod
  • #18
    Rafal_777
    Level 5  
    Otrzymuję wtedy takie wyniki:
    f_mount(&ff, "", 1) = 3
    f_open (&File,"plik.txt", FA_CREATE_ALWAYS) = 1
    f_close (&File) = 9

    Jak powtórzę te czynności (bez restartu mikrokontrolera) to zmienia się tylko:
    f_mount(&ff, "", 1) = 1

    -----------------------------------
    Przy okazji zauważyłem, że gdy wyjmę kartę to wyniki są identyczne, z wyjątkiem:
    SDSPI_Init(&hspi3) = 1
    gdy karta jest to =0;
    -----------------------------------

    Inicjalizację karty wykonuje przez:
    SDSPI_Init(&hspi3); (piszę teraz pod innym STM32)

    Korzystam z pośrednika pokazanego w załączniku.
  • #19
    -XantiO-
    Level 21  
    A więc spróbujmy to przeanalizować:
    Code: c
    Log in, to see the code



    f_mount zwraca 3 a to oznacza, że masz źle coś ustawione lub karta nie jest widoczna.
    f_open zwraca 1 i to jest tu ok bo nie masz dysku zamontowanego.
    f_close zwraca 9 bo co niby ma Ci zamknąć? Okno w pokoju :)?

    Czy w projekcie posiadasz plik fatfs_platform.c?
    Ogólnie wstaw całe drzewo projektu, to mi trochę ułatwi.
  • #20
    Rafal_777
    Level 5  
    -XantiO- wrote:

    f_close zwraca 9 bo co niby ma Ci zamknąć? Okno w pokoju :)?


    Miałem to testowane, więc wpisałem dla ideii ;)

    -XantiO- wrote:

    Czy w projekcie posiadasz plik fatfs_platform.c?
    Ogólnie wstaw całe drzewo projektu, to mi trochę ułatwi.


    Nie, jest tylko: fatfs.c
  • #21
    LChucki
    Level 31  
    Rafal_777 wrote:
    Gdy po inicjalizacji karty wysyłam:
    f_mount(&ff, "", 0);
    to otrzymuje =0, czyli OK

    Przeważnie, zwraca OK, gdy jest wystarczająca ilość RAM, kara może nawet nie byc podłączona. Nie wiem, czy każdy FS tak robi, ale ten co kiedyś próbowałem (z CubeMX) tak miał.
  • #22
    -XantiO-
    Level 21  
    Dokładie jest tak jak mówi kolega @LChucki. Dlatego poprosiłem o wymuszenie montowania dysku. Niestety kolega autor nie używa FSa z Cuba a ze strony podanej w pierwszym poście.
    Code: c
    Log in, to see the code

    I pokwiedz co Ci to zwróci
  • #23
    Rafal_777
    Level 5  
    -XantiO- wrote:
    Niestety kolega autor nie używa FSa z Cuba a ze strony podanej w pierwszym poście.

    Chyba udało się poprawnie skonfigurować FATfs z Cuba, ale pojawił się problem. Pliki zapisuje na SD, ale z niepoprawną datą (starą).
    Gdzie trzeba to zmienić, aby zapisywał z datą aktualną?

    PS. RTC odlicza poprawną datę.
  • #24
    Rafal_777
    Level 5  
    Dodatkowo zauważyłem, że ponowna próba zapisu pliku (gdy ten już jest) powoduje w (f_mount(&ff, "", 0)) błąd=1.

    Za każdym razem używam:
    Code: c
    Log in, to see the code

    Dlaczego tak się dzieje?
  • #26
    Rafal_777
    Level 5  
    Ale mi to działa bezproblemowo za każdym razem, jeśli jednocześnie mam: f_mount()

    Teraz dokładniej zobaczyłem problem i widzę, że gdy zapisuję do pliku ( nawet gdy za każdym razem jest f_mount()) to jest OK, ale gdy wyjmę kartę i ją włożę to powstaje błąd=1.
    Dopiero gdy zrestartuje procka to wszystko jest znowu OK.

    Czy FATfs trzeba jakoś resetować, aby nie trzeba było restartować procesor?
  • #27
    Freddie Chopin
    MCUs specialist
    Rafal_777 wrote:
    Czy FATfs trzeba jakoś resetować, aby nie trzeba było restartować procesor?

    Może trzeba skorzystać z analogii i skoro masz funkcję f_mount(), to rozejrzeć się za funkcją f_unmount()?

    Rafal_777 wrote:
    Ale mi to działa bezproblemowo za każdym razem, jeśli jednocześnie mam: f_mount()

    A dziadek wujka ze strony brata palił 3 paczki papierosów bez filtra dziennie i żył 95 lat, a umarł bo go samochód przejechał! Jeśli wielokrotnie montujesz system plików, a nigdy go nie odmontowałeś, to sorry, ale dowolny problem jaki masz może właśnie z takich dziwnych pomysłów wynikać. System plików montuje się RAZ - po włożeniu karty. Jak karta zostaje wyjęta, to należy go RAZ odmontować.
  • #28
    Rafal_777
    Level 5  
    Poszukałem w internecie i nic nie znalazłem na temat odmontowania karty SD w FATfs.
    Macie sposoby na ten problem?
  • #30
    Rafal_777
    Level 5  
    Niestety już próbowałem z pomocą tej strony przez:
    Code: c
    Log in, to see the code

    i dalej jest to samo.