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

odpowiedz z MMC - dlaczegeo karta odpowiada inaczej?

Przemotv 20 Kwi 2008 00:38 1886 13
REKLAMA
  • #1 5055784
    Przemotv
    Poziom 12  
    Posty: 85
    Pomógł: 1
    Ocena: 5
    Witam!

    siedze i siedze i nie wiem dlaczego karta po inicjalizacji odpowiada inaczej niz powinna :

    
    $regfile = "M8def.dat"                                      'typ mikrokontrolera
    Dim Temp As Byte                                            'zmienna pomocnicza
    
    $hwstack = 64                                               'wartosc stosu
    $swstack = 64                                               'wartosc stosu
    $framesize = 64                                             'wartosc ramki
    
    Config Pinc.1 = Output                                      'konfiguracja linii PC.1 jako wyjsciowej
    
    Config Spi = Soft , Din = Pinc.3 , Dout = Portc.0 , Ss = Portc.1 , Clock = Portc.2
    
    
    Declare Sub Res_mmc                                         'procedura zerowania karty MMC
    Declare Sub Wysl_p_cykl(byval Ilosc As Byte)                'procedura wysylania zadanej ilosci pustych cykli
    Declare Sub Wysl_kom(byval Kom As Byte , Byval Argh As Word , Byval Argl As Word)       'procedura wyslania komendy
    Declare Sub Zak_kom                                         'procedura konczaca komunikacja z karta MMC
    
    
    Dim I As Word                                               'zmienna licznikowa
    Dim Odp As Byte                                             'zmienna przechowujaca odpowiedz z karty
    
    Cs Alias Portc.1                                            'zapis aliasu CS do linii PB.2
    Set Cs                                                      'ustawienie linii cs
    
    
    Spiinit                                                     'inicjacja interfejsu SPI
    Print "init"
    Call Res_mmc                                                'wywolanie procedury zerowanie MMC
    Print "Odczyt nazwy karty MMC"
    
    '...... itd
    
    
    Do                                                          'nieskonczona
    Loop                                                        'petla
    
    End                                                         'koniec programu
    
    
    
    
    
    
    
    
    Sub Res_mmc                                                 'procedura zerowania karty MMC
      Call Wysl_p_cykl(10)                                      'wyslanie 80 pustych cykli (8 * 10)
      Call Wysl_kom(0 , 0 , 0)                                  'wyslanie komendy zerowania karty MMC (numer komendy 0)
      Call Zak_kom
    
    Print Odp                                                 'tu powinna byc odpowiedz 1 a jest 3
    
    
      If Odp.0 <> 1 Then                                        'jesli bit 0 zmiennej odpowiedzi Odb rozny od 1, (karta nie jest w stanie IDLE), to
        Set Err                                                 'ustawienie zmiennej err
        Exit Sub                                                'wyjscie z procedury
      End If
      Do                                                        'poczatek petli
        Call Wysl_kom(1 , 0 , 0)                                'wyslanie komendy inicjacji karty MMC (numer komendy 1)
        Call Zak_kom
    
         Print Odp                                              ' a tu powinna byc odpowiedz 0 a jest 1
    
      Loop Until Odp = 0                                        'petla wykonywana az odb rozne od 0 (brak zajetosci karty)
    End Sub                                                     'koniec procedury
    
    Sub Wysl_p_cykl(byval Ilosc As Byte)                        'procedura wyslania pustych cyklii do karty MMC
      Do                                                        'poczatek petli
        Temp = Spimove(&Hff)                                    'wyslanie wartosci &HFF
        Decr Ilosc                                              'mniejszenie wartosci Ilosc o jeden
      Loop Until Ilosc <> 0                                     'petla wykonywana az Ilosc jest rozne od 8
    End Sub                                                     'koniec procedury
    
    Sub Wysl_kom(byval Kom As Byte , Byval Argh As Word , Byval Argl As Word)       'procedura wyslania komendy
      Reset Cs                                                  'zerowanie linii cs
      Temp = Kom + &H40                                         'dodanie do numeru wysylanej komendy wartosci &H40
      Spiout Temp , 1                                           'wyslanie numeru komendy
      Temp = High(argh)                                         'wyslanie bardziej znaczacej polowki argumentu argh
      Spiout Temp , 1                                           'wyslanie argumentu 1
      Temp = Low(argh)                                          'wyslanie mniej znaczacej polowki argumentu argh
      Spiout Temp , 1                                           'wyslanie argumentu 2
      Temp = High(argl)                                         'wyslanie bardziej znaczacej polowki argumentu argl
      Spiout Temp , 1                                           'wyslanie argumentu 3
      Temp = Low(argl)                                          'wyslanie mniej znaczacej polowki argumentu argl
      Spiout Temp , 1                                           'wyslanie argumentu 4
      Temp = &H95                                               'zapis sumy kontrolnej
      Spiout Temp , 1                                           'wyslanie stałej dla komendy o numerze 0 sumy kontrolnej
      For I = 1 To 10                                           'petla wykonywana 10 razy
      Odp = Spimove(&Hff)                                       'odczyt odpowiedzi z karty
      If Odp.7 = 0 Then                                         'jesli bit 7 zmiennej odp rowny 0, to brak zajetosci karty
        Reset Err                                               'zerowanie err
        Exit Sub                                                'wyjscie z procedury
      End If
      Next I                                                    'zwiekszenie o jeden I
      Set Err                                                   'ustawienie zmiennej err
    End Sub                                                     'koniec procedury
    
    Sub Zak_kom                                                 'procedura zakonczenia komunikacji z karta MMC
      Set Cs
      Call Wysl_p_cykl(1)                                       'wyslanie do karty 8 cykli
    End Sub                                                     'koniec procedury
    
    


    po podaniu 80 impulsow i CMD0 powinna odpowiedziec 1 a odpowiada 3
    a po CMD 1 odpowiada 1 a powinna 0
    bascom , oscylator 1 Mhz

    moze ktos podpowie co robie zle ..... dzieki
  • REKLAMA
  • #2 5056011
    migod
    Poziom 21  
    Posty: 462
    Pomógł: 29
    Ocena: 8
    Hej,

    moje doświadczenia dot. SD/SDHC/SDIO, ale MMC to pokrewna rodzina, więc..

    Zwykle CMD0 wysyła się wielokrotnie (np. 8 razy), za max. 2-3 razem karta odpowiada RESP = 1, po prostu musi mieć czas na zainicjowaine..

    To samo tyczy się pozostałych komend (z paroma wyjątkami, gdy powinna odpowiedzieć już za pierwszym razem). Jeśli karta zgłasza ewidentny błąd (ERR_CMD, PARAM itd.) to można przerwać, w przypadku IDLE, BUSY - należy ją dalej odpytywać wysyłając za każdym razem komendę.

    pozdro,
    --
    migod
  • #3 5056071
    Przemotv
    Poziom 12  
    Posty: 85
    Pomógł: 1
    Ocena: 5
    problem zaczyna sie juz gdy po podaniu 80 impulsow i CMD0 karta odpowiada 3 czyli B00000011 a nie 1. 2-gi bit w odpowiedzi ktory tu jest ustawiony to erase reset (czyli tak jakby karta miala za malo impulsow na poczatku) a pierwszy mowi ze karta jest w trakcie inicjowania. probowalem dac mu na poczatku wiecej impulsow przy cs = 1 ale za kazdym razem dostaje odpowiedz na CMD0 = 3. obojetnie czy jest to 10 , 80 , czy 200 impulsow karta sd zachowuje sie tak samo. nie wiem czy ma to zwiazek z tym ze kiedys mi to chodzilo, tylko na sprzetowym spi a teraz jest programowe. probowalem z mosi=1 , i z mosi= 0 (albo miso zawsze mi sie to myli- chodzi o ten ktory przesyla z procka do karty na pin2). sprawdzalem oscyloskopem koncowki i sygnaly wychodza. konwersja 5 na 3,3 tez jest ok bo mi to chodzilo ale na sprzetowym spi
  • REKLAMA
  • #4 5056077
    migod
    Poziom 21  
    Posty: 462
    Pomógł: 29
    Ocena: 8
    dorzuć jeszcze rozbiegówkę przed każdą komendą (0xff przy CS=0)
  • #5 5056092
    Przemotv
    Poziom 12  
    Posty: 85
    Pomógł: 1
    Ocena: 5
    rozbiegowke ? tzn ? karta przy oscylatorze 1 Mhz powinna smigac
    chodzi ci o to aby poczekac przed odpytaniem jakis czas ?

    Dodano po 12 [minuty]:

    kurcze dziwi mnie to najbardziej ze chodzilo mi to kiedys na sprzetowym spi a teraz na programowym nie gada. na sprzetowym mialem kwarc 4 mhz i podzial na 4 w ustawieniach wiec teraz dalem 1 mhz ale tak czy inaczej nie gada czy 4 czy 1 zachowuje sie tak samo. po wyjeciu karty mam caly czas FF wiec karta cos tam przetwarza. moze powinienem odpytujac sprawdzac czy odp = 1 a nie czy odp.0 = 1 wtedy sprawdza tylko 1 wszy bit . za godzinke bede w biurze to sprawdze
  • #6 5056379
    rusala
    Poziom 22  
    Posty: 475
    Pomógł: 44
    Ocena: 6
    jezeli mas ustawione 1MHz to napewno twoje programowe SPI nie chodzi na 1MHz a co najwyzej (ale to watpliwe) na 500kHz ale to nie powinno miec wiekszego znaczenia. Linia MISO - Master Input Slave Output, MOSI - Master Output Slave Input <- to powinno rozwiac twoje watpliwosci. Sprawdzales czy karta jest dalej ok?
  • #7 5056945
    Przemotv
    Poziom 12  
    Posty: 85
    Pomógł: 1
    Ocena: 5
    no wiec tak:
    probowalem roznych sztuczek , opoznien, kombinacji i za kazdym razem na CMD0 zamiast 1 odpowiada 3, a potem CMD1 zamiast 0 - 1
    w koncu przelutowalem karte (gniazdo) na koncowki sprzetowego interfejsu i karta chodzi elegancko. nawet podnioslem kwarc do 4Mhz i wywalilem parametr Clockrate = 4
    
    Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1       'konfiguracja sprzetowego SPI
    


    karta dziala super , tylko dlaczego nie dziala na programowym spi - ot zagadka ......
    dzieki rusala za podpowiedz MISO MOSI juz bede pamietal hehe
  • #8 5056969
    gothye
    Poziom 33  
    Posty: 2421
    Pomógł: 183
    Ocena: 60
    >> Przemotv
    jak zasilacz uklad ,karta napieciem 3,3V a uC 5V ,czy całość 5V :?:
  • REKLAMA
  • #9 5057186
    Przemotv
    Poziom 12  
    Posty: 85
    Pomógł: 1
    Ocena: 5
    procek 5v a pamiec przez 2 diody szeregowo z procka
    polaczenia pomiedzy prockiem a pamiecia poprzez drabinki rezystorowe(3k3 do masy i 1k8 do procka).
    z wyjatkiem DO bezposrednio do procka.

    karta smiga na sprzetowym spi a po przelutowaniu na inne nogi - zachowuje sie jak wyzej

    Dodano po 3 [minuty]:

    Cytat:
    procek 5v a pamiec przez 2 diody szeregowo z procka


    tzn z tych samych 5 V - na pamieci jest ok 3,4v dawalem elektrolit 47 uF do masy ale bez roznicy
  • #10 5535898
    Jacek54
    Poziom 11  
    Posty: 22
    Czy w opisanym przykładzie istnieje system plików. ?
  • #11 5536325
    gothye
    Poziom 33  
    Posty: 2421
    Pomógł: 183
    Ocena: 60
    Jacek54 napisał:
    Czy w opisanym przykładzie istnieje system plików. ?


    system plików zakładasz po zainicjowaniu karty
  • #12 5536563
    Jacek54
    Poziom 11  
    Posty: 22
    Czy mozesz mi odpowiedzieć na ponizsze pytania:

    1.Jak to się robi, w programie uP wpisuje się jakieś instrukcje ?
    2. Z Twojego postu mam rozumieć że te instrukcje umieszcza siepo wysłaniu komendy 0 ?
    3. Jakie sa te instrukcje dotyczace systemu plików (FAT16)
  • REKLAMA
  • #13 5546037
    Fyszo
    Poziom 37  
    Posty: 3987
    Pomógł: 223
    Ocena: 115
    Przemotv napisał:
    ...kurcze dziwi mnie to najbardziej ze chodzilo mi to kiedys na sprzetowym spi a teraz na programowym nie gada...

    Zobacz z dowolnym innym urządzeniem SPI, czy co to oprogramowanie dobrze działa. Dopiero wtedy szukaj problemu poza kontrolerem.
  • #14 6563805
    WOBI
    Poziom 19  
    Posty: 206
    Pomógł: 33
    Ocena: 8
    błąd jest w procedurze puste_cykle. O ile zawsze wyśle ona jeden pusty cykl niezależnie od podanedo parametru przed wejściem do tej procedury, więc karta bedzie działać ale reset juz sie nie wykona prawidłowo bo nie bedzie 80 cykli pustych a dlaczego... bląd petli!

    to jest Twoja zła procedura
    
    
    Sub Wysl_p_cykl(byval Ilosc As Byte)                        'procedura wyslania pustych cyklii do karty MMC 
      Do                                                        'poczatek petli 
        Temp = Spimove(&Hff)                                    'wyslanie wartosci &HFF 
        Decr Ilosc                                              'mniejszenie wartosci Ilosc o jeden 
      Loop Until Ilosc <> 0                                     'petla wykonywana az Ilosc jest rozne od 8 
    End Sub                                                     'koniec procedury 
    
    
    


    a to już poprawnie działajaca sprawdzona oscyloskopem

    
    
    Sub Wysl_p_cykl(byval Ilosc As Byte)                        'procedura wyslania pustych cyklii do karty MMC 
      Do                                                        'poczatek petli 
        Temp = Spimove(&Hff)                                    'wyslanie wartosci &HFF 
        Decr Ilosc                                              'mniejszenie wartosci Ilosc o jeden 
      Loop Until Ilosc = 0                                     'petla wykonywana az Ilosc  bedzie = 0 
    End Sub                                                     'koniec procedury 
    
    


    drugi błąd to procedura wyslij_kom , przy komendach 0, 1, i takich gdzie argument nie ma znaczenia procedura bedzie działać ale Argh i Argl nie są prawidłowo wystawiane na szynę SPI, można to sprawdzić wyswietlając np. na Lcd lub rs232 co tak naprawde wysyła Atmega. Nie wystawia napewno tego co podajesz przy wejściu do prodedury. Błąd kompilatora?

    to zła procedura
    
    Sub Wysl_kom(byval Kom As Byte , Byval Argh As Word , Byval Argl As Word)       'procedura wyslania komendy 
      Reset Cs                                                  'zerowanie linii cs 
      Temp = Kom + &H40                                         'dodanie do numeru wysylanej komendy wartosci &H40 
      Spiout Temp , 1                                           'wyslanie numeru komendy 
      Temp = High(argh)                                         'wyslanie bardziej znaczacej polowki argumentu argh 
      Spiout Temp , 1                                           'wyslanie argumentu 1 
      Temp = Low(argh)                                          'wyslanie mniej znaczacej polowki argumentu argh 
      Spiout Temp , 1                                           'wyslanie argumentu 2 
      Temp = High(argl)                                         'wyslanie bardziej znaczacej polowki argumentu argl 
      Spiout Temp , 1                                           'wyslanie argumentu 3 
      Temp = Low(argl)                                          'wyslanie mniej znaczacej polowki argumentu argl 
      Spiout Temp , 1                                           'wyslanie argumentu 4 
      Temp = &H95                                               'zapis sumy kontrolnej 
      Spiout Temp , 1                                           'wyslanie stałej dla komendy o numerze 0 sumy kontrolnej 
      For I = 1 To 10                                           'petla wykonywana 10 razy 
      Odp = Spimove(&Hff)                                       'odczyt odpowiedzi z karty 
      If Odp.7 = 0 Then                                         'jesli bit 7 zmiennej odp rowny 0, to brak zajetosci karty 
        Reset Err                                               'zerowanie err 
        Exit Sub                                                'wyjscie z procedury 
      End If 
      Next I                                                    'zwiekszenie o jeden I 
      Set Err                                                   'ustawienie zmiennej err 
    End Sub                                                     'koniec procedury 


    a to poprawiona, tylko zadeklarować trzeba dodatkową zmienna temp1 as word.

    
    
     Sub Wysl_kom(byval Kom As Byte , Byval Argh As Word , Byval Argl As Word)
    
      Reset Cs
    
      Temp = Kom
      Set Temp.6
      Reset Temp.7      ' lepiej ustawic bity niż dodawać 40hex bo bity komendy bit.6 zawsze = 1 ,bit .7 zawsze = 0
      Spiout Temp , 1
    
      Temp1 = Argh
      Temp = High(temp1)
      Spiout Temp , 1
    
      Temp = Low(temp1)
      Spiout Temp , 1
    
      Temp1= Argl
      Temp = High(temp1)
      Spiout Temp , 1
    
      Temp = Low(temp1)
      Spiout Temp , 1
    
      Temp = &H95
      Spiout Temp , 1
    
      For I = 1 To 16                                           '? 10 czy 16? lepiej 16 bo karta potrzebuje czasu 
                             'a przy szybkim SPI moze zabraknac cykli na oczekiwanie.
      Odp = Spimove(&Hff)
    
        If Odp.7 = 0 Then
    
           Reset Err
    
           Exit Sub
    
         End If
    
      Next I
    
       Set Err
    
     End Sub

Podsumowanie tematu

✨ Dyskusja dotyczy problemu z inicjalizacją karty MMC/SD za pomocą programowego interfejsu SPI, gdzie karta odpowiada nieprawidłowymi kodami (np. CMD0 zwraca 3 zamiast 1). Wskazano, że karta wymaga wielokrotnego wysyłania komendy CMD0 oraz odpowiedniej liczby impulsów zegarowych (minimum 80) z linią CS w stanie wysokim przed inicjalizacją. Problem może wynikać z błędnej implementacji procedury wysyłania pustych cykli (pętla w procedurze Wysl_p_cykl), co skutkuje niewystarczającą liczbą impulsów. Zalecane jest dodanie tzw. "rozbiegówki" (wysłanie 0xFF przy CS=0) przed każdą komendą. Różnice w działaniu między sprzętowym a programowym SPI mogą wynikać z błędów w konfiguracji lub synchronizacji sygnałów, a także z nieprawidłowego podłączenia linii MOSI/MISO. Poprawne działanie uzyskano po przełączeniu na sprzętowy interfejs SPI z parametrami: Master, Polarity Low, Phase 0, Clockrate 4 MHz. Dodatkowo omówiono kwestie poziomów napięć (5V uC, 3,3V karta) i stosowania dzielników napięć. Wskazano także na konieczność sprawdzenia działania oprogramowania SPI z innymi urządzeniami oraz na znaczenie prawidłowego rozpoznawania bitów odpowiedzi karty. W końcowej części podano poprawioną wersję procedury wysyłania pustych cykli, która zapewnia prawidłową inicjalizację karty MMC.
Wygenerowane przez model językowy.
REKLAMA