logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Rozwiązano] [SD + ChanFAT] Błędny format FAT na STM32F103 i zaniżona pojemność SD

bartosz.tarnowski 21 Lut 2018 12:21 1440 4
REKLAMA
  • #1 17052803
    bartosz.tarnowski
    Poziom 17  
    Posty: 418
    Pomógł: 26
    Ocena: 30
    Istnieje problem zaniżania pojemności kart SD.
    Tematów na ten temat jest sporo w działach zajmujących się PC tabletami telefonami, ale tutaj nie znalazłem
    Napotkałem taki problem i w gruncie rzeczy jestem blisko wyjaśnienia problemu.
    Wygląda na to że wszystko rozchodzi się o prawidłowy odczyt i prawidłowe przetworzenie "rejestru" CSD ma on 16 bajtów a w nim pole C_SIZE.

    Biblioteka na podstawie informacji o pojemności karty wybiera odpowiedni FAT może to być:
    FAT12
    FAT16
    FAT32

    Mój problem wygląda tak że urządzenie STM32F103 instaluje FAT na karcie, jednak błędnie, samo może zapisać dane i korzystać z karty, pojemność karty jest zaniżona a na komputerze PC karta ma niepoprawny format i wymaga formatowania. WindowsExplorer nie korzysta z rejestrów karty SD do wyznaczenia jej pojemności tylko z MBR i FAT i tu się pojawia zdziwienie po otwarci karty na kompie ze ma o wiele mniejszą pojemność .

    Jakie Wy forumowicze macie z tym doświadczenia?
    Jak rozwiązaliście podobny problem?
    Pozdro :)

    Dodano po 4 [godziny] 49 [minuty]:

    Zrobiłem testy wyniki w tabeli.
    Na czerwono zaznaczyłem ewidentnie niepoprawne wyniki
    Na pomarańczowo ostrzeżenia
    Zielone - OK
    żółte to coś nietypowego ale niesie pewna praktyczna informację - teraz nie bede opisywał tego.

    [SD + ChanFAT] Błędny format FAT na STM32F103 i zaniżona pojemność SD
    Odczytane rejestry przedstawione w tabeli realizowane w czasie inicjalizacji karty

    Z kartami 2GB jest mniejszy problem one nawet działają.
    Nie mam problemu w ogóle z kartą 64MB. wszystko działa jak trzeba na urządzeniu i na komputerze
    Z kartami 4GB jest problem bo sformatowanie ich pod windows w FAT32 powoduje ze urządzenie nie czyta tych kart.
    A sformatowanie karty 4GB przez urządzenie powoduje redukcję pojemność do 435MB i zależnie od ustawień to Windows nie rozpoznaje systemu plików ale rozmiar 435MB widzi poprawnie.

    Zauważyłem też przy kartach 4GB problem w sektorze MBR ale to jeszcze raz muszę zbadać,
    Inicjalizacja karty i odczyt CSD CID OCR dla SPI CLK <400kHz
    Oto funkcja do odczytu CSD, co z nią nie tak że błędnie czyta karty ?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 17055213
    Sareph
    Poziom 24  
    Posty: 638
    Pomógł: 65
    Ocena: 378
    bartosz.tarnowski napisał:

    Z kartami 2GB jest mniejszy problem one nawet działają.
    Nie mam problemu w ogóle z kartą 64MB. wszystko działa jak trzeba na urządzeniu i na komputerze
    Z kartami 4GB jest problem bo sformatowanie ich pod windows w FAT32 powoduje ze urządzenie nie czyta tych kart.
    A sformatowanie karty 4GB przez urządzenie powoduje redukcję pojemność do 435MB i zależnie od ustawień to Windows nie rozpoznaje systemu plików ale rozmiar 435MB widzi poprawnie.
    Jakie masz rozmiary klastrów w każdym z tych przypadków?
  • REKLAMA
  • #3 17055527
    Marico
    Poziom 20  
    Posty: 409
    Pomógł: 28
    Ocena: 60
    bartosz.tarnowski napisał:
    Mój problem wygląda tak że urządzenie STM32F103 instaluje FAT na karcie, jednak błędnie


    Dlaczego uważasz, że błędnie? Skoro urządzenie ma wbudowany mkfs, to znaczy, że umie czytać tylko taki fs, który sam utworzy.
    Pomniejszony odczyt dostępnych sektorów może być tutaj działaniem celowym by zachować kompatybilność wsteczną, szczególnie gdy chodzi o karty HC (większe niż 2GB), one wymagają troszkę innej komunikacji niż te <=2GB, być może urządzenie nie wspiera w pełni kart HC.
  • REKLAMA
  • #4 17055580
    bartosz.tarnowski
    Poziom 17  
    Posty: 418
    Pomógł: 26
    Ocena: 30
    Już tak nie uważam :)
    Biblioteka jest ok.

    W kodzie do odczytu CSD który umieściłem w pierwszym poście zastosowałem funkcje biblioteki HAL.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Zastosowanie tej funkcji powoduje błędny odczyt CSD z karty SDHC, dla kart SD pracuje dobrze. Widocznie chodzi o zależności czasowe.
    Poza tym CSD dla karty SDHC się nieco różni, pole C_SIZE ma 22 bity zamiast 12

    Zamiast tego umieściłem pętle jak poniżej i teraz czyta ładne wartości
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dodano po 19 [minuty]:

    Cytat:
    Jakie masz rozmiary klastrów w każdym z tych przypadków?


    Rozmiar sektora, liczbę sektorów i BlockSize biblioteka otrzymywała na podstawie CSD które było błędne.
  • #5 17058022
    bartosz.tarnowski
    Poziom 17  
    Posty: 418
    Pomógł: 26
    Ocena: 30
    Doczytałem dokumentacje itp, problem rozwiązałem
    Bazowałem na bibliotekach dostarczonych do książki: Karty SD/MMS w systemach mikroprocesorowych z 2009 roku.
    Kod ten nie obsługuje blokowych kart SD czyli kart w wersji V2-HC

    Zaniżona pojemność karty dla kart SDSC była powodem nie uwzględnienia ze są karty o blokach 1024.
    Akurat takie mam i ilość sektorów kod mnożył przez 512 zamiast 1024.
    W przypadku kard HC jak już napisałem wcześniej był problem z odczytem CSD
REKLAMA