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

[ATMega168/C] Obsługa kart SD bez pinu CS

04 Gru 2011 16:26 2321 9
  • Poziom 30  
    Witam,
    Czy sterowanie pinem CS jest absolutnie konieczne do "rozmowy" z kartami SD?
    Próbowałem to zrobić bez CS ale jakieś głupoty mi zwraca już zaraz po komendzie CMD0 (chodź powtarzalne).
    80 cykli zegarowych które podobno trzeba przesłać na starcie generuje z włączonym CS (na stałe ten pin do masy zwarłem), może zaraz po uruchomieniu karty nie trzeba generować koniecznie tych cykli i od razu przesłać CMD0?

    Nie posiadam kontroli nad CS ponieważ zabrakło mi pinów w kontrolerze i zwarłem go do masy.

    Pozdrawiam
  • Tektronix
  • Tektronix
  • Poziom 17  
    Mozesz multipleksowac jakis pin i uzywac go jako CS - jest on konieczny do poprawnego dzialania.
  • Poziom 30  
    aaadamw napisał:
    jakby CS nie był potrzebny, to raczej by go tam nie było...?

    W pamięciach także jest CS a jakoś nie trzeba go używać bo służy tylko do wyboru układu, nie bierze udziału w komunikacji. Multum wyświetlaczy także tak ma i inny układów scalonych, dlatego zadałem to pytanie czy przypadkiem tak tutaj nie jest.

    Mam do wykorzystania jedynie 3 piny i teraz tak myślę jak wykombinować... ile chyba nic sensownego nie wykombinuję bez wykorzystania dodatkowego µC. :|

    --------------------------------------------------------------------------

    Trochę pozmieniałem rzeczy w projekcie.
    Czy karta SD nie powinna wystawić stanu wysokiego na pinie DO? Pin ten podłączyłem do MISO.

    Sprawdziłem oscyloskopem jak wyglądają przebiegi i ku mojemu zdziwieniu odkryłem że wystarczy dać niewielki opór na pinie MISO mikrokontrolera i momentalnie napięcie spada do 0.
    Rejestry DDRB i PORTB mam prawidłowo dla niego ustawione (jako wejście i podciągnięty).
    [ATMega168/C] Obsługa kart SD bez pinu CS
    Mam identycznie podłączoną kartę do mikrokontrolera jak w schemacie powyżej, różnica jest tylko w dzielniku napięcia, ja mam rezystory 2kΩ oraz 1kΩ.

    Może należy podciągnąć ten pin do zasilania jakimś zewnętrznym rezystorem czy karta SD powinna to zrobić?
  • Pomocny post
    Poziom 39  
    ADI-mistrzu napisał:
    Może należy podciągnąć ten pin do zasilania jakimś zewnętrznym rezystorem czy karta SD powinna to zrobić?

    Karta to zrobi. Nie podciąga ale w momencie wysyłania "1" do Master łączy przez tranzystor MOSFET wyjście MISO z +3,3V
  • Poziom 30  
    To dziwnie, w takim razie nic mi nie zwraca.
    Sprawdzałem na oscyloskopie i cały czas jest masa, jutro sprawdzę jeszcze złącze karty SD, ale raczej jest ok. Karta także się nie uszkodziła, sprawdzałem ją w komputerze.
  • Poziom 30  
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Na starcie wysyłane jest 80 taktów zegara, następnie komenda CMD0.
    Jeśli 12 razy się to nie uda, program od początku wysyła 80 taktów zegara i znowu próbuje uzyskać prawidłową odpowiedź na CMD0.

    Sprawdziłem przed chwilą połączenia między mikrokontrolerem a karta i jest dobrze.
  • Poziom 39  
    Z tego co ludziska piszą na forum często problem wynika ze złęgo doboru dzielnika rezystorowego. Spróbuj do dzielnika użyć mniejszych oporności.
  • Poziom 30  
    [ATMega168/C] Obsługa kart SD bez pinu CS
    Przebieg ten wszystko tłumaczy...
    Na górze jest linia danych DO, na dole sygnał zegarowy. Każdy wysłany bajt oddzieliłem krótką przerwą aby było to ładniej widoczne na przebiegu.

    Początkowy stan 0 na DO to inicjacja (80 cykli zegarowych w czasie gdy CS jest w stanie wysokim).
    Następnie widać kolejne rozkazy (0x40, 4x 0x00, oraz CRC) a za nimi na 7 bajcie są same 1 zamiast potwierdzenia. Widocznie SD nie była gotowa i dopiero w następnym bajcie nadchodziło potwierdzenie.

    Czyli błąd był w programie, zamiast ciągle próbować wysyłać rozkaz i od razu domagać się odpowiedzi prawidłowej, wystarczyło kilkukrotnie po prostu prosić o odpowiedź...