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

Pamięć MMC i Data Token. Odczytanie bloku danych.

marekos 10 Maj 2006 12:28 1901 8
REKLAMA
  • #1 2611344
    marekos
    Poziom 16  
    Posty: 140
    Pomógł: 14
    Ocena: 4
    Witam

    Mam taki problem chce się dobrać do pamięci mmc programuje w BASCOMie i do tej pory było wszystko ok, używam procedur zamieszczonych wcześniej na tym formu, uK AT MEGA 16 i sprzętowy SPI. Probelm mam z odczytem bloku danych. Po wysłaniu komendy CMD 17 z argumentem którego wartość jest równa Nr_bloku*blok_len zwrac poprawne potwierdzenie R1 ale nie wysyła Data tokena równego 0xFE tylko 0xFF. Natomiast jak wyśle argument komendy CMD17 równy tylko Nr_bloku to zwraca data token 0xFE i odczytuje 512 bajtów. Te 512 są jakimiś przypadkowymi liczbami nie są to ani 0x00 ani 0xFF. Załaczam procedury z mnożeniem Nr_bloku*blok_len. Chciałbym się dowiedzieć co robie nie tak bo wydaje mi się że poprawne adresowanie pamięci jest przez wybranie numeru bloku i pomnożenie go przez długość bloku.

    Mmc_cmd:
    Arg4 = Arg : Shift Arg , Right , 8
    Arg3 = Arg : Shift Arg , Right , 8
    Arg2 = Arg : Shift Arg , Right , 8
    Arg1 = Arg
    Cs = Active
    Odp = Spimove(rozkaz)
    Odp = Spimove(arg1)
    Odp = Spimove(arg2)
    Odp = Spimove(arg3)
    Odp = Spimove(arg4)
    Odp = Spimove(crc)
    Gosub Get_r1
    If Mmc_cmd_end = 1 Then
    Cs = Deactive
    Odp = Spimove(&Hff)
    End If
    Return

    Mmc_load:
    Mmc_cmd_end = 0
    Arg = Block_nr ' Block_len
    Rozkaz = Cmd17 : Gosub Mmc_cmd
    Gosub Get_dt
    For Block_count = 1 To 512
    Dat(block_count) = Spimove(&Hff)
    Next Block_count
    Odp = Spimove(&Hff)
    Odp = Spimove(&Hff)
    Cs = Deactive
    Odp = Spimove(&Hff)
    Return


    Get_dt:
    Do
    Dt = Spimove(&Hff)
    If Dt = &HFE Then Exit Do
    Data_error_token = Dt And &HF1
    If Data_error_token = 1 Then
    Err = 1
    Data_error_token = Dt
    Exit Do
    Else
    Data_error_token = 0
    End If

    Delay

    Loop

    Return
  • REKLAMA
  • #2 2611588
    migod
    Poziom 21  
    Posty: 462
    Pomógł: 29
    Ocena: 8
    też tak miałem. 0xFF to jest chyba oczekiwanie na dane..
    czytam w pętli tak długo, aż nie pojawi się SD_START_BLOCK (=0xFE). po chwili program rusza i zczytuje dane z karty..

    pozdrawiam,
    --
    migod
  • #3 2614360
    marekos
    Poziom 16  
    Posty: 140
    Pomógł: 14
    Ocena: 4
    Witam ponownie nie wiem w koncu co z tą moją kartą jest bo ona wcale nie zwraca data_tokena 0xFE. Użyłem takiej procedury do odczytu tokena:

    Get_dt:
    For I = 1 To 255
    Dat(i) = Spimove(&Hff)
    Next I

    For I = 1 To 255
    Cls
    Lcd "i: " ; I ; " 0x" ; Hex(dat(i))
    Waitms 200
    Next I

    Return

    i po zczytaniu w ten sposób otrzymuje 0xFF, 0xFF, 0xFF i dalej dane idą które wcześniej zapisałem na karte tylko z małym błędem.

    Najpierw wpisałem do tablicy takie dane do zapisu:
    For Block_count = 1 To 512
    Dat(block_count) = Block_count
    Next Block_count

    do zapisu użyłem tej procedury

    Mmc_save:
    Mmc_cmd_end = 0
    Arg = Block_nr * Block_len
    Rozkaz = Cmd24 : Gosub Mmc_cmd
    'Odp = Spimove(&Hff)
    Odp = Spimove(&Hff)
    Odp = Spimove(&Hfe)
    For Block_count = 1 To 512
    Odp = Spimove(dat(block_count))
    Next Block_count
    Odp = Spimove(&Hff)
    Odp = Spimove(&Hff)
    Odp = Spimove(&Hff)
    Data_response = Spimove(&Hff)
    Do
    Odp = Spimove(&Hff)
    If Odp <> 0 Then Exit Do
    Loop
    Cls
    Cs = Deactive
    Odp = Spimove(&Hff)
    Return

    i po odczycie dastałem 3x 0xFF a potem 0x00, 0x81, 0x01, 0x82, 0x02, 0x83, 0x03 itd.

    Czyli widać że coś się zapisało i odczytało prawie prawidłowo, prawie bo co drugi bajt. A bajty pomiędzy też mają tą wartość tylko powiększoną o 80. Niewiem co jest nie tak dlaczego pojawia się po odczycie prawidłowy bajt na co drugim miejscu i co w końcu z tym data_tokenem? Prosze o pomoc bo to jest dla mnie bardzo ważne, to jest część mojej pracy dyplomowej, z całą resztą sobie poradziłem tylka ta MMC jest jakaś oporna.

    Pozdrawiam
  • REKLAMA
  • Pomocny post
    #4 2614429
    migod
    Poziom 21  
    Posty: 462
    Pomógł: 29
    Ocena: 8
    Nie spotkałem się z takim zachowaniem. Przesunięcie o 0x80 to ustawienie najważniejszego bitu.. może coś nie tak z reprezentacją danych (bufory są bez znaku..?). Ale to raczej mało prawdopodobne. Bascoma nie używałem, więc wolę się nie wypowiadać.

    Teraz to w sumie nie wiadomo, czy błędnie działa zapis, czy odczyt. Jeśli masz dostęp do czytnika kart SD/MMC, to na Twoim miejscu wczytałbym jej zawartość jakimś programem, który wczytuje blok po bloku (w Linux jest fajny tool - dd się nazywa).
    Potem użyłbym swojego czytnika, żeby zczytać obraz karty. Na koniec jakieś porównanie toolem, który radzi sobie z binariami. I wtedy można coś wnioskować.

    A.. i jeszcze jedno - nie jestem pewny na bank, ale operacje zapisu mogą wymagać wyższych napięć..?

    pozdro,
    --
    migod
  • #5 2615225
    marekos
    Poziom 16  
    Posty: 140
    Pomógł: 14
    Ocena: 4
    Dzięki więlkie za pomoc Migod.

    Jestem coraz bliżej rozwiązania tej sprawy. Miałem błąd przy konfiguracji SPI i teraz mam taką konfiguracje:

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

    Wcześniej miałem Phase ustawiony na 1. Po tej zmianie zaczłem poprawnie zczytywać dane z karty, nawet pojawia się poprawny data_token, ale Przestał działać zapis. Działa jak ustawie Phase na 0. I tu moja prośba co powinien zmienić w tych procedurach zapisu i odczytu aby obie działay przy tej samej konfiguracji, bo zmiana konfiguracji SPI przy każdym wywołaniu tych procedur wydaje mi się mało elegancka. Dodam że komendy inicjujące karte działają przy obu ustawieniach i chyba ten BASCOM od czasu do czasu oszukuje.
  • #6 2615428
    migod
    Poziom 21  
    Posty: 462
    Pomógł: 29
    Ocena: 8
    A próbowałeś obniżyć prędkość transmisji?

    Nie wiem, z jakim zegarem to pracuje u Ciebie. U mnie dla 9600 baud nie ma problemów ani przy zapisie, ani przy odczycie (ale kod mam w 100% C).

    pozdro,
    --
    migod
  • REKLAMA
  • #7 2616284
    marekos
    Poziom 16  
    Posty: 140
    Pomógł: 14
    Ocena: 4
    Cały czas testowo pracuje na najniższej możliwej clockrate=128 ale próbowałem najwyzszej i chodziło bez problemowo oczywiście tylko to co udało mi się wcześniej uruchomić. W symulatorze sprawdze jeszcze ustawienia rejestrów sterujących może coś BASCOM przekłamuje, przez to MMC jakoś przestałem mu wierzyć.

    Pozdrawiam
  • #8 2663741
    marekos
    Poziom 16  
    Posty: 140
    Pomógł: 14
    Ocena: 4
    witam ponownie i znowu zwracam się o pomoc

    Myslałem że sobie poradziłem z tym MMC ale nie do końca. Wszystko ładnie działa poza zapisem. Na czas zapisu dodałem Spcr.2 = 1 to znaczy zmieniam faze sygnału. Wszystko było dobrze zapis zadziałał i ruszyłem dalej z projektem. Dzisiaj miałem go skończyć a tu zonk. Procedura zapisu działa ale tylko raz po kolejnym jej wywołaniu karta nie zwraca data response tylko same 0xFF sygnał busy i tak w nieskończoność, jest to podobno jakiś nie oczekiwany bład a potem karta nie rusza. Pomaga jedynie wyłączenie zasilania. Nie moge skorzystać z procedur zapisu większej ilości bloków na raz bo to wszystko chodzi na AT MEGA 16 tzn. mało RAMu i dane do zapisu nie przychodzą w tak szybkim tempie.

    A może ma ktoś rocedury zapisu napisane w asamblerze i da się to jakoś wkleić w tego Bascoma,.
  • REKLAMA
  • #9 2664510
    marekos
    Poziom 16  
    Posty: 140
    Pomógł: 14
    Ocena: 4
    witam ponownie po cięzkiej nocy, wszystko ładnie działa a to był mój ewidentny błąd, nie doczytałem karty katalogowej MMC do końca. Zapis mi nie działał dlatego że próbowałem ustawiać długość bloku na wartość inną niż 512. Odczyt działa przy różnych długościach bloku ale zapis tylko przy 512 bajtów.
    przepraszam za zaśmiecanie forum

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z odczytem i zapisem danych w pamięci MMC przy użyciu mikrokontrolera ATmega16 i programowania w BASCOMie z wykorzystaniem sprzętowego SPI. Głównym problemem był brak poprawnego data tokena 0xFE po wysłaniu komendy CMD17 z argumentem adresowym obliczanym jako Nr_bloku * długość_bloku, co skutkowało otrzymywaniem 0xFF zamiast oczekiwanego tokena. Okazało się, że adresowanie w MMC jest blokowe, więc należy podawać numer bloku bez mnożenia przez długość bloku (512 bajtów). Dodatkowo poprawna konfiguracja SPI (szczególnie faza sygnału) ma kluczowe znaczenie dla poprawnego odczytu i zapisu; zmiana fazy z 1 na 0 umożliwiła odczyt, ale utrudniła zapis. Zalecano testowanie prędkości transmisji i weryfikację zawartości karty za pomocą narzędzi zewnętrznych (np. dd w Linux). Problem z zapisem wynikał z próby ustawienia długości bloku innej niż 512 bajtów, co jest niezgodne ze specyfikacją MMC. Po dostosowaniu długości bloku do 512 bajtów zapis działał poprawnie. Wskazano również, że podczas zapisu karta może przejść w stan zajętości (busy) i wymaga resetu zasilania, jeśli operacja się zawiesi.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA