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

[ATtiny2313] ATtiny2313: Problemy z odczytem danych z pamięci AT45DB321D-TU przez SPI

IRFP640 25 Mar 2012 19:02 1571 8
REKLAMA
  • #1 10718511
    IRFP640
    Poziom 11  
    Witajcie.
    Od jakiegoś czasu, niestety długiego, próbuje się dogadać z wyżej wymienioną pamięcią. Wysyłam polecenie np. odczytu rejestru statusowego, otrzymuję poprawne zdaje się dane 0xF7. Próby odczytu danych z bufora kończą się źle - ale kiedy zapiszę w buforze powiedzmy 10 bajtów, a odczytam 20, widać, że ostatnie są zupełnie losowe. Podejrzewam - ale to tylko taka nadzieja - że zapis jest ok ale z odczytem mam problemy.
    Tak wysyłam dane:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Tak próbuję odbierać dane z pamięci:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    To chyba wszystko gdzie mogłem popełnić błąd.
    Pamięć: Link
    Odebrane dane wysyłam na RealTerm przez FT232RL, a w połączeniu z mkAVRcalculator programuję.
    Jeśli ktoś może wskazać co robię źle będę wdzięczny.
    Pozdrawiam, życzę miłego dnia.
  • REKLAMA
  • #2 10719165
    michalko12
    Specjalista - Mikrokontrolery
    W pierwszej kolejności zacznij od uruchomienia 8 bitowej transmisji. Teraz masz 7 bitową.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #3 10719613
    IRFP640
    Poziom 11  
    Dzięki.
    Faktycznie.
    Poprawiłem to. Dodałem po każdej zmianie stanu SPCK instrukcję nop.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Tak wyglądają dane odebrane z pamięci, po wysłaniu polecenia odczytu rejestru statutowego:
    [ATtiny2313] ATtiny2313: Problemy z odczytem danych z pamięci AT45DB321D-TU przez SPI
    Bajty powinny być ciągle takie same, tu widać jak jedno zbocze sobie wędruje.
    Nie wiem jak temu zapobiec, co robię źle?
    Pozdrawiam
  • REKLAMA
  • Pomocny post
    #4 10720367
    michalko12
    Specjalista - Mikrokontrolery
    No to teraz nad tym popracuj
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #5 10723765
    IRFP640
    Poziom 11  
    Do głowy mi by nie przyszła pewna rzecz. Fakt, iteracja powinna zaczynać się od 7 do 0. W Devie dla C pętla
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    wykonała się 8 razy, od 7 do 0 włącznie. W programie dla AVR zmienna i była typu unsigned char i pętla wykonywała się 7 razy. Zmiana i na short int rozwiązała problem.
    Teraz funkcje wyglądają tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Wysyłam 0xD7, następnie 0x00 - za pierwszym razem odczytuje same jedynki. Za drugim razem są już poprawne dane, nic się nie przesuwa ani nie zmienia.
    (10110100 10110100 10110100 10110100).
    Dane odebrane po komendzie 0x9F też są poprawne - na pewno pierwsze 3 bajty - zgodnie z notą.
    (00011111 00100111 00000001).
    Dzięki wielkie za pomoc :)
    Może ktoś początkujący jak ja skorzysta sobie z działającego kodu i nie będzie musiał go szukać.
    Pozdrawiam
  • #6 10723776
    tadzik85
    Poziom 38  
    a po co zmiana typu zmiennej i?
  • REKLAMA
  • #7 10723823
    IRFP640
    Poziom 11  
    Jeszcze jedna rzecz:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Ta funkcja poprawnie inicjuje SPI, tak, że w odpowiedzi od pamięci otrzymuje poprawne dane od razu. Zdaje się, że trzeba ustawić jednocześnie CS i SPCK, później z ustawionym CS wyzerować SPCK - zegar dla układu slave.
    Poprzednio pętla była taka jak widać. Dodanie znaku równości spowodowało, że pętla się nie kończyła - zamiast zwracać return od razu wysyłałem dane na terminal, ten został zsypany danymi. Zmieniłem typ zmiennej i z unsigned char na short int i ta sama pętla zaczęła działać zgodnie z oczekiwaniami.
    Czemu? Nie wiem. Jakoś mnie tak podkusiło.
  • Pomocny post
    #8 10725347
    tadzik85
    Poziom 38  
    wystarczyło zrobić signed a nie zaraz typ zmieniać na short int
  • #9 10740692
    IRFP640
    Poziom 11  
    Tak, wystarczyło.
    Zanim to wszystko ogarnę trochę głupot narobię. Ale inaczej się nie nauczę.
    Dzięki za pomoc.
REKLAMA