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

Inicjowanie karty SD, ATmega32, nie działa inicjowanie.

mgradzki 07 Cze 2009 21:08 1209 1
  • #1 07 Cze 2009 21:08
    mgradzki
    Poziom 16  

    Witam, zaczynam walczyć z tematem karty SD - używam procesora ATMEGA32 z oscylatorem 16Mhz i karty KINGSTON mikroSD(z adapterem do rozmiaru SD) 1GB.

    Znalazłem w sieci kilka kodów, które sobie przeglądam, napisałem procedurę inicjowania karty, ale nie działa.
    Wygląda to tak:

    Wysyłanie komendy (na razie bardzo uproszczone - odbiera tylko odpowiedź R1, ale do inicjacji powinno wystarczyć)

    Code:

    unsigned char Command(char befF, uint16_t AdrH, uint16_t AdrL, char befH )
    {
       SPI(0xFF);
       SPI(befF);
       SPI((uint8_t)(AdrH >> 8));
       SPI((uint8_t)AdrH);
       SPI((uint8_t)(AdrL >> 8));
       SPI((uint8_t)AdrL);
       SPI(befH);
       SPI(0xFF);
       return SPI(0xFF);
    }


    i sama inicjacja:
    Code:

    int SD_Init(void) { // init SPI
       char i;
       PORTB |= (1 << 4);

       for(i=0; i < 10; i++) SPI(0xFF); //  80 cykli
       PORTB &= ~(1 << 4);

       if (Command(0x40,0,0,0x95) != 1)
       {
         USART_Transmit(48); //kontrolnie wyślij 0 na UART
         return 0;
                     }
       
       unsigned char tmp=Command(0x41,0,0,0xFF);     ///W TYM MIEJSCU ZWRACA MI 1!
       if (tmp !=0)
       {
          USART_Transmit(tmp);
          return 1;
       }
    USART_Transmit(50);
    return 2;
    }


    Żeby wiedzieć co się dzieje to sobie w pewnych miejscach wypycham coś na UART.
    Problem jest w tym, że po wysłaniu komendy: 0x41 zwraca mi 0x01.
    Nie wiem, czy to jest spowodowane moim błędem, czy też w procedurze wysyłania komendy powinienem wstawić kilka milisekund opóźnienia, żeby dać czas karcie na wykonanie instrukcji.

    Jeśli ktoś ma jakiś sprawdzony i działający (przypadkowych programów, co do których nie mam pewności ściągnąłem sobie kilka) kawałek kodu w C, służący do obsługi kart SD to prosiłbym o podesłanie.

    Wiem, że w Elektronice Praktycznej na przełomie 2007/2008 była seria artykułów o kartach SD, jeśli ktoś czytał, to prosiłbym o opinie, czy warto wysyłać SMSa, żeby sobie to ściągnąć, czy też odpuścić sobie te artykuły.


    Z góry dzięki za wszelkie informacje.

    0 1
  • #2 07 Cze 2009 21:23
    _Robak_
    Poziom 33  

    Widze ze jest to kod ze strony captaina. U mnie dzialal znakomicie, na roznych kartach. A inicjacja to wiesz jaka jest ... ;) Karte mozesz zainicjalizowac ;) Ja te artykuly sobie sciagnalem i za ta cene sa wporzadku ;]

    A co do problemu, zostaw wyslanie komendy SEND_OP_COND w petli, bo ten czas odpowiedzi moze byc rozny, na pewno nie bedzie karta gotowa po tych kilku cyklach.
    Jesli nie chcesz czekac wiecznosc zrob tak

    Code:
    uint8_t tick
    
    while((Command(SEND_OP_COND,0,0xFF) !=0) && (tick++<50));

    0