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

[ATEMGA32][BASCOM] Problem z kartą SD

medicb 22 Mar 2010 20:31 3939 17
  • #1 7867036
    medicb
    Poziom 28  
    Wykonałem z ciekawości płytkę do komunikacji z kartą SD bo jeszcze nie miałem z tym do czynienia. Zaopatrzyłem ją w procesor atm32, wyświetlacz od nokii 6100 aby mieć wieksze pole do popisu. Na płycie jest także podświetlenie wykonane na przetwornicy. Do procesora podłączone są linie do komunikacji z kartą po SPI. Lecz czego się spodziewałem karta milczy. Program działa do momentu gdy karta ma zwrócić odpowiedz w postaci &H01, zwraca zawsze &H00. Testowałem kilka kart. Proszę o podpowiedz. Wyskrobałem taki kod:

    [ATEMGA32][BASCOM] Problem z kartą SD [ATEMGA32][BASCOM] Problem z kartą SD

    
    $lib "lcd-epson.lbx"
    $include "nowa.font"
    
    $regfile = "m32def.dat"
    $crystal = 8000000
    
    Config Pinc.3 = Input                                       'Czujnik karty
    Config Pinc.4 = Input                                       'Czujnik WP
    Config Pind.2 = Output                                      'LED
    
    Config Pind.7 = Output                                      'MOSI
    Config Pinc.0 = Output                                      'CLK
    Config Pind.6 = Output                                      'CS
    Config Pinc.1 = Input                                       'MOSI
    
    Reset Portd.2
    Reset Portd.7
    Reset Portd.6
    Reset Portc.0
    
    Cs Alias Portd.6                                            'cs
    Clk Alias Portc.0                                           'clk
    Miso Alias Portc.1                                          'input
    Mosi Alias Portd.7                                          'output
    
    Dim Dat As Byte
    Dim Resp As Byte
    Dim I As Byte
    Const Msbl = 0
    
    Config Graphlcd = Color , Controlport = Porta , Cs = 3 , Rs = 0 , Scl = 2 , Sda = 1
    
    Const Blue = &B00000011
    Const Yellow = &B11111100
    Const Red = &B11100000
    Const Green = &B00011100
    Const Black = &B00000000
    Const White = &B11111111
    Const Brightgreen = &B00111110
    Const Darkgreen = &B00010100
    Const Darkred = &B10100000
    Const Darkblue = &B00000010
    Const Brightblue = &B00011111
    Const Orange = &B11111000
    
    Glcdcmd &H81
    Glcddata 42
    Glcddata 3
    
    Cls
    
    Box(0 , 0) -(132 , 132) , Black
    Wait 1
    
    Setfont Nowa
    
    If Pinc.3 = 0 Then
    Lcdat 5 , 5 , "Karta siedzi" , White , Black
    If Pinc.4 = 1 Then
    Lcdat 22 , 5 , "Karta WP" , White , Black
    End If
    Else
    Lcdat 5 , 5 , "Brak karty" , White , Black
    End If
    Wait 1
    
    Waitms 300
    Config Spi = Soft , Din = Pinc.1 , Dout = Portd.7 , Ss = Portd.6 , Clock = Portc.0
    Spiinit
    
    Set Cs
    For I = 1 To 10
    Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl
    Next I
    Reset Cs
    Resp = 255
    
    Cmd0:
    Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl
    Dat = &H40
    Shiftout Mosi , Clk , Dat , Msbl
    Dat = &H00000000
    Shiftout Mosi , Clk , Dat , Msbl
    Dat = &H95
    Shiftout Mosi , Clk , Dat , Msbl
    Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl
    
    Shiftin Miso , Clk , Resp , Msbl
    While Resp <> &H01
    Shiftin Miso , Clk , Resp , Msbl
    Wend
    Set Cs
    
    Lcdat 50 , 5 , "C0:" ; Hex(resp) , White , Black
    
    End
  • #2 7868439
    wader_669
    Poziom 28  
    Tez sie jeszcze nie bawilem kartami sd, ale na twoim miejscu sprawdzil bym co sie dzieje gdy odlaczysz wyswietlacz lub zamien karte sd na Hardware'owe SPI
  • #3 7870749
    medicb
    Poziom 28  
    Dzięki za zainteresowanie tematem kolego :) Też myslałem, że błąd może siedzieć w obsłudze softowego SPI. Choć do tej pory korzystałem z softowego i nie było z tym problemów. Tu akurat zastanawiałem się czy prędkość transmisji nie jest zbyt szybka a z tego co widzę prędkość SPI można regulować w bascomie tylko w sprzętowej wersji. Chciałbym jednak aby ktoś kto ma więcej praktyki z kartą SD zweryfikował schemat podłączenia i inicjacje karty zamim potnę ścieżki na płytce aby przerobić ją na sprzętowe SPI ... Odłączenie ekranu nic nie zmienia, program zatrzymuje się w tym samym momencie, weryfikowałem diodą LED :)
  • #4 7871205
    wader_669
    Poziom 28  
    Odłaczenie w sensie razem z kasowanie lcd w programie. Ten wyswietlacz tez dziala po spi. A uzywasz gotowej biblioteki i nie wiem czy to sie nie gryzie jak dodasz jeszcze nastepne software'owe spi. Takie jest moje zdanie, wystestowac nie zaszkodzi, a tak jak pisze moge sie mylic nie bawilem sie kartami sd i za duzo tym wyswietlaczem.
    Tak na marginesie jakas zrabana jest ta biblioteka do tego lcd, ma sporo bledow. Jak znajde troche wiecej wolnego czasu sam napisze obsluge.
  • #5 7871749
    medicb
    Poziom 28  
    Ok teraz zakumałem i postaram się dziś przetestować bez ekranu. Sama obsługa ekranu faktycznie wnosi błędy. Daleko nie szukać, programowa obsługa kontrastu pozostawia wiele do życzenia.
  • #6 7872078
    leon1313
    Poziom 15  
    Jeśli chcesz coś zapisywać na karcie, to polecam AVR-DOS. Niestety obsługa zżera ok 9kB FLASh i połowę ramu..
  • #7 7872386
    medicb
    Poziom 28  
    Leon wszystko możliwe :) apetyt zawsze rośnie. Chwilowo, rekreacyjnie chciałem skupić się na odczycie karty, tylko po SPI i umikając słów FAT ... choć pewnie nie takie to straszne jak sądzę. Zapodaj linka jeżeli masz coś sprawdzonego z tym dos-em, miejsca pod dostatkiem w procku. Za kilka minut potestuję co z tym wymazaniem ekranu z programu i napiszę.


    Dodałem o 23:48
    --------------------------------
    Kolego wader_669 zrobiłem jak proponowałeś z ekranem. Wywaliłem wszystko i uruchomiłem komunikację po uarcie, niestety bez zmian. Jutro wieczorem walczę dalej :) dziś już uciekam spać.
  • #8 7876391
    medicb
    Poziom 28  
    Przerobiłem całość na sprzętowe SPI, karta dalej milczy. Projektując płytkę korzystałem z dokumentacji producenta kart SD gdzie linie MOSI, MISO i CS są podciągnięte opornikami do plusa zasilania. Przegladając elektrodę na wszystkich schematach raczej nie spotykam wcale oporników podciągających (wszędzie tylko oporniki do wyrównywania poziomów napięć z 5V na 3V, u mnie to nie problem ponieważ zastosowałem atm32L). Widziałem jednak na elektrodzie gdzie te same oporniki jeżeli już występują są podciągnięte do plusa a na innych schematach do masy ... zdurniałem do reszty. Bez oporników też się nic nie zmienia. Monitując różnice w działaniu SPI softowego i sprzetowego można się wiele dowiedzieć. Softowe niestety nie ma regulacji prędkości (miernik częstotliwości na zegarze pokazuje dziwną wartość 145Hz(!), podczas gdy na sprzętowym ok 1Mhz przy podziale 4 i kwarcu 8MHz). Rzuciła mi się także w oczy pewna różnica w znalezionych w sieci programach co do konfiguracji "Polarity = Low/High" ale zamiana jednego na drugie nie daje efektu. Prawde powiem nie mam już pomysłów więc zacznę chyba od zera :)
    Pisząc program wzorowałem się na tej stronie:
    http://www.nawatt.org/pmwiki.php?n=Tutorials.MultiMediaCard
  • #9 7882307
    leon1313
    Poziom 15  
    Ja robiłem obsługe na EvB, na stronie są schematy itp.
    Temat jest tu.
  • #10 7904127
    medicb
    Poziom 28  
    Witam po przerwie. Uruchomiłem komunikację z kartą SD, skupiłem się na inicjacji karty i na danych które są pewniakami i można wyciągać je z karty. Karta pracuje obecnie na atmedze32 i sprzętowym SPI. Odczytuje swobodnie CID-a z każdej karty do 512Mb, takie miałem pod ręką. W tej chwili mam kolejny niespodziewany problem, program działa wyśmienicie ... ale tylko w chwili po zaprogramowaniu procesora. Do tych samych końcówek procesora podpięty jest programator USBasp oraz sprzetowo karta SD. Po zaprogramowaniu procka program rusza, mogę wtedy odpiąć programator i resetować procesor dowoli, program działa za każdym razem. Jeżeli jednak odepnę zasilanie i podłącze ponownie bez względu na to czy programator jest podłączony czy nie, procesor nie komunikuje się z kartą. Nie pomagają resety, nie pomaga podciąganie pinów SPI i plusa czy masy. Moze fusebity, sam nie wiem. Co myślicie?
  • #11 7904782
    gothye
    Poziom 33  
    pin reset procesora jak masz podłączony ? przez rezystor np. 10k podciągniętu do U+ ?
  • #12 7904819
    medicb
    Poziom 28  
    Szczerze powiem nie miałem, własnie podlutowałem ale objawy te same. Czekam na dalsze instrukcje :)
  • #13 7904837
    gothye
    Poziom 33  
    stawiam na problemy z zasilaniem ,może brak 100nF blisko nóżek zasilających uC ,ale trudno tak bez schematu kompletnego projektu ...
  • #14 7904917
    medicb
    Poziom 28  
    Schemacik moge zamieścić ale musze go narysować lub cyknąć fotkę. Zasilanie leci z dobrego zailacza 5V a na płycie jest niskoszumny stabilizator smd 3,3V o wydajności ok 300mA, układ pobiera podczas pracy ok 10mA. Przed i za stabilizatorem są małe pojemnosci rzędu uF ale przysłowiowych 100nF brakuje. Najdłuższa ścieżka na płycie nie ma więcej jak 20 - 25mm długości a sygnałowe 15mm. Przy SD slocie nie ma kondka na zasilaniu ... minutka robie w trakcie i zaraz odpiszę. Jedyne co mnie gryzie to fakt że płytka była projektowana pod softową obsługę karty SD, softowo gadac nie chciała więc teraz stare softowe piny są ustawione jako wejścia a karta podlutowana jest kynarkiem do sprzętowego SPI.
  • #15 7966571
    medicb
    Poziom 28  
    Jestem zmarnowany po 2 tygodniach dogadywania się z kartą ...
    Po pierwsze fakty i mity:
    1. Intryguje mnie bascom (mam wyrzuty do samego siebie z tego powodu, że go używam) i widzę jego niestabilność w działaniu. Ten sam projekt (jeżeli czasem już działa) na atm32 ... nie pracuje wcale na atm8. Ten sam program niekiedy działa lepiej na węwnętrzym oscylatorze 8MHz niż na jakimkolwiek kwarcu ... ale to też dzieło przypadku.
    2. W sieci jest wiele schematów podłączenia karty SD:
    - z opornikami do plusa (od producentów z racji "otwartego kolektora")
    - do masy (jak w przypadku mojego jednego pinu danych wychodzących z kary bo inaczej nic nie działa, gdzie inne idą do plusa).
    - bez oporników (większość projektów bascoma na avr z biblioteką mmc.lib, jak przypuszczam wykorzystane są wewnętrzne oporniki pull-up procka).
    3. Kolejna rzecz to niestabilność konfiguracji sprzętowego SPI w bascomie:
    Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 1 , Noss = 0 , Clockrate = 128
    Zmieniając te trzy ustawienia program raz działa a innym razem wcale. Programowe SPI milczy.
    4. Dodałem wg wcześniejszych zaleceń kolegów kondensatorki 100nF, zasilanie zostało dodatkowo odfiltrowane, na liniach danych kondensatorki 22pF do masy i tu niespodzianka bo kolega gothye miał rację z opornikiem na resecie. Bez opornika układ wariował z chwilą odpięcia programatora co sprawdziłem, opornik dodałem.
    5. Układ dalej działa tylko po zaprogramowaniu i z podpietym programatorem, czasem po trzecim lub czwartym zaprogramowaniu. Działa rewelecyjnie i tak jak oczekuję, mogę go wtedy resetować, mogę odpiąć nawet programator i działa nadal do momentu ... gdy odłącze zasilanie. Po podłączeniu zasilania bez względu na to czy programator jest podłączony czy nie układ wysyła inicjację do karty a karta zawsze odpowiada FF lub w skrajnym wypadku tylko w najstarszym bajcie 7F a reszta FF. Pomaga tylko ponowne zaprogramowanie.
    6. Ciąg dalszy nastąpi ...
  • #16 7966910
    ugh123
    Poziom 13  
    Witam wszystkich ;)
    Ja też jakiś czas temu dopiero zacząłem zabawe z kartami sd w bascom :D ja mialem na tyle szczescia ze udalo mi sie odrazu dobrac program tak ze mi dziala karta 512 mb i nawet widzi system plikow fat i fat32 ;D Probowałem z karta 2 GB ale tu sie pojawily problemu nie wiem dlaczego ale pomijajac to wydaje mi sie ze blad u ciebie tkwi w konfiguracji spi chodzi mi o ta linie
    Cytat:
    Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 1 , Noss = 0 , Clockrate = 128
    wydaje mi sie ze masz za duze CLOCKRATE ja mam ustawione na 4 i dziala na kwarcu 16 Mhz i lcd od 6100 tez mam na spi . Pozdrawiam Bartek ;D
  • #17 7968655
    medicb
    Poziom 28  
    128 to stopień podziału czyli w tym przypadku najwolniejszy zegar. Oczywiście ten parametr także zmieniam za każdym razem. Gdy ustawiony jest na 4 to różnice w działaniu niewielkie.
  • #18 8064890
    WOBI
    Poziom 19  
    Problem jest w deklaracji. Miałem ten sam proble że karty chodziły z podpietym programatorem a po odłączeniu już nie. Zmieniłem deklaracje na

     Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1
    


    tu masz post w ktorym poruszylem temat mmc
    Link
REKLAMA