Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Proc ATmega16 + karta SD lub MMC

20 Mar 2007 17:00 7696 20
  • Poziom 24  
    Witam.
    Zabieram się dzisiaj do podłączenia karty SD do mojego Atmel'ka :D Chcę uzyskać kilka informacji, a z czasem będę używał tylko tego postu do pisania o problemach zwąznych z podłączeniem tej karty.

    1. W jaki sposób można uszkodzić kartę? Czy tylko podając za duże napięcie zasilania? Wysyłane do niej komendy czy spadki napięć nie mają na to wpływu?
    2. Kiedyś widziałem dobrę dokumentację w necie do kart SD ... może ktoś zna jakąś? Chodzi mi o komendy, przesył danych, timingi itp.
    3. Czy schemat podłączenia zapewni maksimum bezpieczeństwa dla karty SD? http://www.captain.at/electronic-atmega16-mmc-schematic.png. Czy może lepiej zasilić(z 3,3V) bufor do konwersji napięcia z TTL?
    4. Czy do obsługi standardu FAT wystarczy odpowiednio analizować dane na karcie czy wymaga to jakiegoś specjalnego dekodowania?
    5. Jak w strukturze danych bajtowych wygląda plik tekstowy TXT? W jaki sposób "napisać" plik tekstowy w bajtach i gdzie go umieścić, żeby można było odczytać jego treść na WIN'dzie? Potrzebne są jakieś deklaracje miejsca pliku gdzieś w karcie?
  • Specjalista - oświetlenie sceniczne
    tez powoli podchodze do tematu kart, tak że zbieraj informacje- przydasz mi się ;P

    Tu masz trochę ciekawych informacji na temat SD
    http://kju.wemif.net/mmc/
    Schematy podłaczenia karty są na ecle, musisz tylko odpalić szukajke. Choc wg mnie to wystarczy jej tylko dac odpowiednie zasilanie, 5V od strony procka (pull up) nie powinno jej zabić. To nie jest wielki prąd. Podłaczałem w ten sposób kilak rzeczy i wszytsko działa- nadwyżka napięcia jest znakomicie prze nie wchłaniana :)
    Jeśli chcesz być pewny, to na SPI karty zakładasz dzielnik 5/3.3V

    mam jakąś dokumenatcje (daj meila to wyśle kilka rzeczy), z tego co się orientuje to najgubsza była SANDISK'a
  • Poziom 24  
    mariuszlorenc(malpa)wp.pl W necie jest dużo, ale potrzebuje sprawdzone informacje.
  • Poziom 18  
    Kiedys podlaczalem do M16 MMC wedlug tego schematu i działało bez problemu z czestotliwoscia SCK=4MHz.
    Proc ATmega16 + karta SD lub MMC
    Przedwczoraj musiałem uruchomic karte na M128 i pokusilem sie o wykorzystanie tranzystorow w ukladzie dopasowania poziomow napiec. Zmontowalem uklad jak na schemacie:
    Proc ATmega16 + karta SD lub MMC
    Proc ATmega16 + karta SD lub MMC
    Po wielu wulgaryzmach i pewnych modyfikacjach ukladu udalo sie nawiazac dialog z karta ale przy czestotliwosci SCK=125kHz! Wrzucilem ponownie dzielnik napiecia i smiga jak burza. Karte zasilam ze stabilizatora LE33 i rozwazam uzycie MAX3002 jako konwerter poziomow logicznych. Osobiscie nie pokusilbym sie o bezposrenie podanie TTL na wejscia karty. Cytat z ostatniego numeru EP:
    Moga one byc zasialne napieciem od 2,7V do 3,6V, pzry czym nie mozna ich bezposrednio podlaczyc do mikrokontrolerow zasilanych napieciem 5V. Przy zasilaniu 5V nalezy dodatkowo zastosowac odpowiedni konwerter poziomow logicznych.

    Do FAT polecam strony:
    http://perso.orange.fr/pierrelib/filesystems/fat16.html
    http://www.maverick-os.dk/FileSystemFormats/FAT16_FileSystem.html
    http://www.myplace.nu/mp3/files/fat32_documentation.pdf
    oraz PDF z zalacznika. Po opanowaniu FAT budowe TXT mozna zrozumiec ogladajac TXT programem np. WinHex.

    Pozdrawiam

    P.S.
    Moze sie Wam tez przydac konfiguracja SPI dla karty: Mode 0, MSB first.
    Załączniki:
  • Poziom 21  
    Karty może nie uwalisz napięciem 5V podanym przez pull-up'y ale na pewno bedzie się ona wieszać. Miałem ten problem że ni daje się z nią gadać na maksymalnych prędkościach bo gubi się i potrafi wejść w taki stan że jedynie odpięcie na chwilę zasilania pomaga.
  • Poziom 24  
    Witam, schemat podłączenia ze strony http://www.captain.at/electronic-atmega-mmc.php jest poprawny i napisana tam obsługa jest prawidłowa.

    Mam jednak mały problem z dylematem. Do zapisu przez tego pana używana jest wartość 0x58 co daje 88, a w innej bibliotece nie ma takiej wartości, a co za tym idzie zapis jest realizowany przez wartość 24 - o co chodzi?

    I jeszcze jedno: czy przedstawiona przez tego pana funkcja na zapis jako drugi i trzeci argument podaje się adres miejsca początku i końca zapisu? Jeżeli nie to co należy podać do niej, aby określone dane zostały zapisane w wybranym przez nas miejscu?

    A ... i czy ROOT na partycji FAT32 będzie zawsze pod tym samym adresem na karcie SD czy ten adres jest w jakimś wcześniejszym sektorze zawarty? Bo mam książkę o FAT32, ale dla HDD i jest duża rozbierzność.
  • Poziom 2  
    To ja sie moze podepne ;)

    Podpinam Atmega8L (zasilam ja 3,5V), czy moge spokojnie podlaczyc bezposrednio uP i MMC (bez rezystorow)?
  • Poziom 24  
    Możesz mieć problemy z zawieszaniem karty(z innego postu cytat). Karta może wytrzymać podobno 5V, ale będzie się zawieszała i będzie wolniejsza. Lepiej oblicz rezystorki, lub poprostu dobierz je szeregowo w magistrale ;)
  • Specjalista - oświetlenie sceniczne
    0,2V jej ała nie zrobi. Cytat tyczył się zasilania z 5V
  • Poziom 24  
    Bolek - lepiej napisz mi jak to z tym FATem na karcie jest, bo sobie rady nie daje.
  • Poziom 2  
    spoko, jesli chodzi o poziom napiecia powinna wytrzymac, a funkcja pull-up?
  • Specjalista - oświetlenie sceniczne
    Ja w FAT wnikać nie chce :) dla mnie ważny jest tylko zapis i odczyt danych, wg mojego formatu.

    Znajomy twierdził że implementacja FAT jest bardzo prosta. Choc to na pewno zalezy też jak bardzo procedura ma być uniwersalna. Z tego co wiem, to nie ważne co jest nośnikiem- FAT jest FAT. Z czym masz problem dokładnie?
    ---------
    jeśli chodzi i pull-up to skoro będa włączone w procku, zewnetrzne oporniki nie bedą potrzebne
  • Poziom 24  
    Mam książkę o FAT32 na HDD, ale na karcie jest jakoś inaczej, albo nie ma możliwości odczytu BOOT sektora - napewno jest, ale nie wiem jak tego dokonać.
  • Poziom 18  
    Chcesz odczytać boot sector uC czy PC? W uC po prostu odczytujesz odpowiedni blok i po problemie (nie jest to pierwszy blok karty. W pierwszym bloku jest MBR-Master Boot Record). W PC, jak podglądniesz kartę w np. WinHEX, to BOOT sector będzie widoczny jako pierwszy sektor (nie ma możliwości podejrzenia MBR). Nie wiem czy dobrze zrozumiałem Twój problem. Zobacz jeszcze tutaj:
    https://www.elektroda.pl/rtvforum/viewtopic.php?t=288215&highlight=
    Tam dokładniej wyjaśniłem to, co napisałem powyżej.
  • Poziom 24  
    Moj błąd. MBR mi wyszedł z głowy.

    Mam inny problem dotyczący obliczenia początku klastra 2.

    W WinHex wartość początkowa klastra 2 to 1976 sektor. Do obliczenia tej wartości w książce powinny posłużyć wzory:

    Adres pierwszego = LiczbaZarezerwowanych(36) + (LiczbaFATów[2] * MaxSektorów[498176])

    Wynikiem tego nie jest dana wartość, ani odpowiednik jej w pamięci.

    Jak mam obliczyć prawidłowo początek drugiego klastra?

    PS. Nie piszcie, że mam użyć wartości z WinHex'a bo chcę zrobić uniwersalne procedurki.
  • Poziom 17  
    Witam.
    Czyli rozumiem, że wystarczy podłączenie karty poprzez rezystorki, tak? A co wtedy z pull-upami?
    Czy może jednak lepiej jest zastosować konwerter poziomów, jeśli tak to który?
  • Poziom 33  
    mariuszlorenc napisał:

    Jak mam obliczyć prawidłowo początek drugiego klastra?


    Code:
    Sektor_2go_Klastra=Liczba_Zarezerwowanych_Sektorow+(Liczba_Kopii_FAT*Liczba_Sektorow_NA_FAT)+ Liczba_sektorow_katalogu_glownego;


    :wink:
  • Poziom 38  
    Jesli zasilasz proca napieciem wyzszym niz 3.3V to najlepiej podlaczyc przez bufor w stylu 74LVC245, rezystory tez moga byc... ale nie spisuja sie najlepiej przy szybszych transmisjach....
  • Poziom 17  
    Dzięki za informacje tplewa.
    Na razie i tak zastosowałem rezystory a dopiero gdy okażą sie nie wystarczające zastosuje bufor. Niestety nie mogłem nigdzie znaleźć wersji LVC, za to wyczytałem że można zastosować LCX, czy to prawda?
  • Poziom 32  
    mariuszlorenc napisał:
    .

    Mam jednak mały problem z dylematem. Do zapisu przez tego pana używana jest wartość 0x58 co daje 88, a w innej bibliotece nie ma takiej wartości, a co za tym idzie zapis jest realizowany przez wartość 24 - o co chodzi?


    Komenda zapisu na kartę to własnie 88 taka wartosc jest wysyłana fizycznie, a dlaczego? bo 24 + 64 =88 (czyli bit 6 musi bic ustawiony na '1' przed wysłaniem komendy do karty.

    Zasilanie karty można zrealizować poprzez diodę LED. Dodatkową zaletą jest to że "widać transmisję" lub inaczej pobór prądu. Szczególnie przydatne przy próbach, od razu widac co sie dzieje i czy nie wisi.

    Dodano po 8 [minuty]:

    Aby umożliwić współpracę SPI karty i programatora oraz osiagnąć maksymalny transfer trzeba sygnał z karty DO podpiac poprzez rezystor. To samo trzeba zrobic z sygnałem z programatora opornik nalezy umiecic jak najblizej ukladu. Po takim podłaczeniu pomimo wpietego programatora mozna osiagnąc transfer 8M/s. (Uwaga nie dotyczy wszystkich atmeg)

    Dodano po 2 [minuty]:

    Aby umożliwić współpracę SPI karty i programatora oraz osiagnąć maksymalny transfer trzeba sygnał z karty DO podpiac poprzez rezystor. To samo trzeba zrobic z sygnałem z programatora opornik nalezy umiecic jak najblizej ukladu. Po takim podłaczeniu pomimo wpietego programatora mozna osiagnąc transfer 8M/s. (Uwaga nie dotyczy wszystkich atmeg)
  • Poziom 11  
    Witam!

    W moim przypadku potrzebuje odczytac jedynie pojedyncze sektory z karty jednak po uzyciu ponizszego kodu do zczytywania danych okazalo sie ze dane sa zapisane dopiero na ostatnich 64 bajtach sektora :| Czy faktycznie tak jest czy tez mam zle napisana funkcje? Prosze o pomoc!

    Code:
    unsigned int sd_readsector(unsigned long int lba)
    
     {
        unsigned int i;

        // send read command and logical sector address
        sd_send_command(17,(lba>>7) & 0xffff, (lba<<9) & 0xffff);
     
        if (sd_datatoken() != 0xfe)    // if no valid token
        {
           sd_clock_and_release();    // cleanup and 
            return -1;                  // return error code
         }
     
         for (i=0;i<512;i++) {            // read sector data
            tab[i]=spi_byte(0xff);
          
     }

        spi_byte(0xff);                 // ignore dummy checksum
         spi_byte(0xff);                 // ignore dummy checksum
     
        sd_clock_and_release();        // cleanup
     
         return 0;                       // return success       
     }