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

[C][AVR] SD , FAT32 - parę pytań

megaman123 19 Lip 2009 11:49 2751 12
REKLAMA
  • #1 6796304
    megaman123
    Poziom 13  
    Witam ,

    Otóż miałbym parę pytań do kolegów . Nie rozumiem do końca zasady "działania" systemu plików FAT32 więc stwierdziłem ,że napiszę obsługę kart SD , sformatuję kartę w tym systemie plików a następnie i będe uczyć się teoretycznie i praktycznie w jednej chwili . A więc :

    1 ) Karta SD przechodzi poprawnie reset ( zwracane są odpowiednie odpowiedzi . Odczyt sektora działa , ale tu pojawia się pytanie : Pierwsze 512b to same zera . Czy tutaj po sformatowaniu nie powinien być MBR ? Kartę przylutowałem goldpinami , więc nie bardzo chcę to teraz odlutowywać . Nie chcę również sprawdzać zapisu , bo to uszkodzi już stworzony system plików zgadza się?

    2) Zassałem program WinHex . Gdzieś doczytałem ,ze w nim mozna potrenować umiejętność "czytania" FAT'a . W jaki sposób to robić ?

    Dzięki bardzo za wszelkie podpowiedzi
  • REKLAMA
  • #2 6798951
    K_o_n_r_a_d
    Poziom 23  
    megaman123 napisał:
    1 ) Karta SD przechodzi poprawnie reset ( zwracane są odpowiednie odpowiedzi . Odczyt sektora działa , ale tu pojawia się pytanie : Pierwsze 512b to same zera . Czy tutaj po sformatowaniu nie powinien być MBR ?

    Hmm... a skąd wiesz, że odczyt sektora działa? Skoro same zera to chyba raczej coś nie działa :)
    megaman123 napisał:
    Kartę przylutowałem goldpinami , więc nie bardzo chcę to teraz odlutowywać . Nie chcę również sprawdzać zapisu , bo to uszkodzi już stworzony system plików zgadza się?
    Myślę, że jednak powinieneś odlutować i zainwestować w gniazdko.
    Cytat:
    2) Zassałem program WinHex . Gdzieś doczytałem ,ze w nim mozna potrenować umiejętność "czytania" FAT'a . W jaki sposób to robić ?
    Otwierasz w nim dysk (kartę lub dowolny inny) i masz podgląd na każdy bajt od pierwszego po ostatni a dodatkowo różne narzędzia pomagające np. odczytywać szybko wartości wielobajtowe itp.

    Odlutuj kartę, kup gniazdko a i krok po kroku pomagając sobie WinHEXem dojdziesz do wszystkiego.
  • #3 6800100
    megaman123
    Poziom 13  
    Dzięki za odpowiedź :)

    W tej chwil , jestem zbyt daleko od jakiejkolwiek cywilizacji , żeby zakupić gniazdo , a mam trochę czasu więc postanowiłem właśnie poeksperymentować na płytce uniwersalnej . A więc jest trochę postępów :

    Zapisanie i odczyt jednego sektora działa poprawnie . Odczytałem MBR ,a z niego LBA z wartością 0x81 ( czyli to powinien być adres pierwszego sektora partycji , tak ? ) . Kolejno ściągając 512b właśnie z tego adresu mam same zera , a odczytując 512b spod adresu 0x80 mam dane identyczne jak sektor MBR . Jest ktoś w stanie powiedzieć coż to się dzieje ?
  • #4 6800228
    AlphaX
    Poziom 12  
    Wpis dotyczacy pierwszej partycji zaczyna sie pod adresem 0x1BE (w MBR, 16 bajtów). Tam znajdziesz informacje gdzie znajduje sie pierszy sektor pierwszej partycji.
  • REKLAMA
  • #5 6800246
    megaman123
    Poziom 13  
    Oczywiście wiem :)

    Do tego dochodzi 8 bajtowy offset po którym pobieram 4 bajty symbolizujące adres sektoru . I właśnie pod tym adresem mam same 0 , co najbardziej mnie dziwi.

    	
    
    //sDBufor - bufor trzymajacy pojedynczy sektor 
    
    lbaB = sDBufor[457];
    				
    lbaB <<= 8 ;
    
    lbaB |= sDBufor[456];
    
    lbaB <<= 8 ;
    
    lbaB |= sDBufor[455];
    
    lbaB <<= 8 ;
    
    lbaB |= sDBufor[454];
    


    Tak wygląda odczyt , chyba poprawnie prawda ?
  • #6 6800274
    AlphaX
    Poziom 12  
    A nie lepiej użyć wskaznika do struktury? W AVR chyba nie ma problemu z wyrównywaniem zmiennych w pamięci. Zreszta struktura partycji w MBR wygląda na dobrze "dopasowana".
  • #7 6800570
    megaman123
    Poziom 13  
    Racja , zastosowałem się do pomysłu ze strukturami :)

    Przeszukałem już chyba wszystkie możliwe kody , strony i poważnie nie mam pojęcia co robię źlę. Adres jak sektora , to jak nic 0x81 , przesyłając 0x81<<9 zwracane są same zera . Może ktoś mia pomysł , inny niż użycie WinHex'a ? Nie chcę uszkodzić karty przy rozlutowywaniu .
  • #8 6800581
    AlphaX
    Poziom 12  
    Wrzuc moze odczytana zawartosc MBR.
  • REKLAMA
  • #9 6800609
    megaman123
    Poziom 13  
    00 02 04 00 0B 13 F3 C7 81 00 00 00 7F C3 1D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA


    Ciąg bajtów rozpoczynający partition entry . Przed nim , występują same 0.
  • REKLAMA
  • #10 6802711
    AlphaX
    Poziom 12  
    Z podanego MBR wynika ze jest tak jak mowisz i partycja zaczyna sie od adresu 0x81. Moze problem jest z argumentem komendy odczytujacej sektor z karty? Powinna wygladac tak: 0x51, 0x00, 0x01, 0x02, 0xff. Boot record partycji tez konczy sie bajtami 0x55, 0xaa.
  • #11 6806042
    megaman123
    Poziom 13  
    Dzięki bardzo , okazało się ,że rzeczywiście tam tkwi błąd.

    Wszystko się teraz zgadza , sygnatura jest wporządku , dodatkowo moja karta była dziwnie sformatowana bo 512b klastry są ( czyli 1 klastr per 1 sektor ). Mam jeszcze jedno pytanie , jeśli można . Doczytałem się ,że w systemie FAT32 , nie ma root directory . Czy to znaczy ,że mam rozpocząć czytanie zaraz za dwoma tablicami FAT? Dziwna właśnie sprawa , bo używając wzoru , ze początek danych
    LBR + REZERWOWE + ILOSC_FAT*SEKTOROW_NA FAT , zwraca mi w zasadzie numer sektora ( bo 1s na 1 klaster ) , a ten adres przesłany blokuje SPI , na petli odczekujacej potwierdzenia ( while(!(SPSR & (1<<SPIF))); )

    Mógłbyś poradzić ?
  • #12 6806107
    zdebel
    Poziom 15  
    Ja tylko jedno pytanie bym miał, a nie będę zakładać oddzielnego tematu, czy zamiast dzielnika opornikowego można celem dostosowania napięcia sygnału zastosować diodę zenera 3v3? (mcu na 5V oczywiscie)
  • #13 7280921
    Lutobor14
    Poziom 10  
    Mam pytanie a nie będę zakładał osobnego tematu. Gdzie znajduje się LBA Begin? Odczytałem pierwszy sektor MBR i z opisu systemu plików FAT32 wyczytałem, że to 32 bitowa liczba i znajduje się pod adresem od 505 do 502 (dla bufora 512 B). Odczytana liczba przeze mnie to 0xAC 00 0A 0D. I co ona oznacza, nr sektora czy adres sektora? Gdzie znajduje się tablica FAT i gdzie rozpoczyna się Root Directory?
REKLAMA