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

AVR i karta SD - niby zapisuje a jednak nie

dlugiiii 11 Lip 2011 21:51 3281 15
REKLAMA
  • #1 9707118
    dlugiiii
    Poziom 13  
    Mam program na którym 2 karty SD 512 Mb firmy KINGSTON i 1 karta mikro SD 1Gb (bez firmy) normalnie zapisuje dane. Na jednej karcie mikroSD 1Gb firmy KINGSTON już nie chce zapisywać. Za każdym razem zwraca dobre potwierdzenie ,a nic nie pojawia się na karcie . Tak samo mam z kartą MMC(po włożeniu przechodzi inicjalizacja ,zwraca dobre potwierdzenia i nic nie pojawia się na karcie ).Karta MMC to inna bajka,ale niby powinna działać patrząc na potwierdzenia.W czym może być problem ?
  • REKLAMA
  • #2 9707382
    drzasiek
    Specjalista CNC
    Problem jest w karcie albo w programie. Na tyle informacji ile podałeś tyle można powiedzieć.
    A może zdradzisz co to za tajemniczy program? W C czy w innym mutancie? Darmowa biblioteka czy Twojego autorstwa?
  • REKLAMA
  • #3 9707484
    dlugiiii
    Poziom 13  
    Jasne ,że zdradzę ,bo nie mam nic do ukrycia . Myślałem,że problem tkwi w wiadomym miejscu :)
    Program jest przeze mnie modyfikowany,ponieważ na oryginalnych bibliotekach\źródłach książkowych i z forum nie działa mi z żadną kartą :/

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    [/img]
    Bez delay 10ms w zapisie na kartę w ogóle wyrzuca błąd karty ,a przecież w żadnym źródle nie widziałem,aby tam był delay :(
  • #4 9707782
    Mundi1970
    Poziom 24  
    Wydaję mi się (choć mogę się mylić :)) że po wysłaniu tych 512 bajtów przez SPI, powinieneś czekać na zakończenie operacji. Jeżeli zwracane jest 0 to karta jest zajęta i czytasz dalej. Jeżeli odczytasz coś innego niż zero to karta jest gotowa na przyjęcie następnej komendy.

    Link
    Link
  • #5 9709323
    INTOUCH
    Poziom 30  
    Jaką maksymalnie dużą kartę pamięci może obsłużyć 8 bitowy procesor lub mikrokontroler?
  • REKLAMA
  • #6 9709410
    piotrva
    VIP Zasłużony dla elektroda
    To zależy od biblioteki z jakiej korzystasz. Te biblioteki z których ja korzystałem (w C, Bascom, Arduino) radziły sobie ze zwykłymi kartami (micro)SD (NIE SDHC!) do 2GB (takie testowałem). Wiem że niektóre biblioteki na 100% nie obsługują SDHC, lub obsługują tylko niektóre modele posiadające interfejs SPI. Wszystko zależy też od formatowania karty - innymi słowy mówiąc - ograniczenia nie ma po stronie mikrokontrolera, ale po stronie dostępnych bibliotek i w ich dokumentacjach powinny być dostępne dane o obsługiwanych kartach.
  • #7 9711562
    dlugiiii
    Poziom 13  
    Poprawiłem dodając warunek sprawdzenia statusu poprawnie otrzymanych danych i warunek czekania do czasu kiedy karta jest w stanie busy .Dalej nie działa :/ _delay_ms od tak umieściłem ,bo czasami pomaga,a nie potrzebuję szybkiego zapisu.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #8 9711649
    Mundi1970
    Poziom 24  
    Tak dla pewności jakim programem sprawdzasz czy ci dane zapisało?
    Jest różnica między dyskiem logicznym, a fizycznym :)
  • #9 9713628
    Mundi1970
    Poziom 24  
    Odrazu przepraszam że piszę pod własnym postem :). Znalazłem fajny przykład, niestety /POCZĄTEK PROWOKACJI w znienawidzonym przez wszystkich Basicu /KONIEC PROWOKACJI. ;) Link

    Według tego przykłady (KokkeKat_FAT-free_SD_lib_code.bas od lini 570), to powinno wyglądać tak:

    SS stan niski
    
    Wysyłamy $FF    ' 8 tyknięć zegara
    Wysyłamy $58adressektoraFF   ' CMD24 write
    
    Oczekujemy na odpowiedź 0 jeżeli się nie doczekamy to timeout
    
    wysyłamy $FE    ' token początek bloku
    wysyłamy 512 bajtów danych
    Wysyłamy $FFFF   ' obojętnie jakie CRC (?? pewnie jakąś inną komendą  włączamy sprawdzanie CRC)
    
    oczekujemy na odpowiedź inną niż $FF jeżeli się nie doczekamy to timeout
    
    wykonujemy operacje odpowiedz AND $0F
    wynik:
    $05     ' Data accepted
    $0B     ' Data rejected due to a CRC error
    $0D     ' Data rejected due to a Write Error
    
    jeżeli data accepted
    
    oczekujesz odpowiedzi $FF   ' Poczekaj, aż karta nie będzie już zajęta. Chyba w dokumentacji pisało żeby oczekiwać na bajty inny niż 0.						
    
    Wysyłamy $FF     ; 8 tyknięć zegara
    
    SS stan wysoki
    

    Nie wiem czy cała operacja nie powinna być wykonana przy stanie niskim SS. W twoim przykładzie tak nie jest.
  • #10 9713770
    dlugiiii
    Poziom 13  
    Sprawdzam przy pomocy WinHex na czytniku kart.
    Dzięki za przykład, ale chyba stan niski dopiero uaktywnia się podczas przesyłania danych właściwych.Stosując się do twojego kodu wyrzuca mi błąd odpowiedzi poprawności przyjęcia danych.Wcześniej niby odpowiada idealnie ,a nic nie widać .
  • #11 9714180
    Mundi1970
    Poziom 24  
    W specyfikacji ładnie pisze :).
    "Po operacji zakończeniu programowania, gospodarz powinien sprawdzić wyniki programowania za pomocą polecenia SEND_STATUS (CMD13)."
    Komenda zwraca 2 bajty (R2). Dowiesz się dokładnie jaki jest błąd. Opis R2 znajdziesz na 130 stronie (142 według Acrobata).
  • #12 9765808
    dlugiiii
    Poziom 13  
    Chwilowo nie odczytałem tego rejestru ,ale zauważyłem jedną rzecz : Kiedy wpiszę początek sektora 1000 to zapisuje mi od 758(242 sektory niżej) .Jak wpiszę początek 242 to zaczyna od 0 . Dlaczego 3 karty dobrze dekodują adres początku sektora ,a ta karta posiada przesunięcie ?

    Teraz testuję kartę MMC na tym samym programie i przy 242 sektorze początkowym zapisuje mi od 14 sektora :/
  • #13 9766661
    Mundi1970
    Poziom 24  
    Hmmm... kłopoty z adresowaniem mogły by być jeżeli jedna z tych kart była by kartą SDHC, wtedy numer sektora nie mnożysz przez 512. Ale to chyba nie dotyczy tych kart. Mam wrażenie że ty oglądasz dane na dysku logicznym, a nie fizycznym i stąd to zamieszanie z numeracją sektorów. Wypróbuj darmowy programik HxD Link . W menu Dodatkowe -> Otwórz dysk.... wybierz dysk fizyczny (nie literkę napędu jako dysk logiczny).
  • #14 9769121
    dlugiiii
    Poziom 13  
    Zgadza się .W WinHex wybieram literę dysku (logical drive) ,bo jak wybiorę Physical Media w ogóle nie odczytuje z karty danych (po wyjęciu karty z czytnika nie zgłasza błędu i brak jakiejkolwiek danej zapisanej).W drugim programie w ogóle nie odczytuje karty :/ Co robię źle ?:(
  • Pomocny post
    #15 9769428
    Mundi1970
    Poziom 24  
    Czyli programy używasz pod Windows Vista lub 7 (+ te wszystkie chore zabezpieczenia ;)), bo nie uwierzę że pod XP. Spróbuj uruchomić programy jako administrator, wyłącz antywirusa. Jeżeli masz Windows 7 Professional lub Ultimate możesz zainstalować XP Mode Link. Ja HxD używam pod Win7 z wyłączonym antywirusem i UAC, uruchomiony jako administrator i odczyt z dysku fizycznego działa.
  • #16 9770032
    dlugiiii
    Poziom 13  
    Posiadam windows 7 i wystarczyło załączyć programy w trybie administratora(chore te systemy :P ).Teraz widoczne są dyski fizyczne i pokazuje dokładnie pod tymi sektorami,które zapisuje :)
REKLAMA