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ęć AT45DB przez programowe SPI w C - co jest źle?

Fredy 21 Cze 2011 21:35 2833 15
REKLAMA
  • #1 9637634
    Fredy
    Poziom 27  
    Posty: 915
    Pomógł: 117
    Ocena: 28
    WItam;

    od kilkunastu dni męczę się z obsługą pamięci AT45DB041 . Pamięć ta posiada intefeace SPI , chciałem użyć programowego SPI .
    Napisałem program w którym działa ale tylko zapis do pamięci. Odczyt natomiast jest nieprawidłowy.
    Czy któryś z kolegów mógłby mi coś podpowiedzieć? Myślę że problem leży w procedurze Czytaj_znak lub w czasach .

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Napewno zapis do pamięci działa bo probowałem odczytać dane podobnym programem w Bascomie i działa super, problem dotyczy tylko odbioru.
  • REKLAMA
  • #2 9637813
    GSM
    Poziom 25  
    Posty: 543
    Pomógł: 72
    Ocena: 16
    Witam,

    nie podajesz jakichkolwiek możliwie istotnych informacji, takich jak:
    - schemat
    - pełen listing programu
    - środowisko programistyczne
    - etc...

    Ustawiłeś PD(któryś tam), jako wejście.
    Możliwe, że to co wkleiłeś nie trzyma się czasów wymaganych przez układ, ale nie można tego stwierdzić nie znając w/w szczegółów.

    Pomóż nam pomóc sobie.
    Wróżek ci u nas niedostatek. :roll:

    Pozdrawiam,
    GSM
  • REKLAMA
  • #3 9637877
    Fredy
    Poziom 27  
    Posty: 915
    Pomógł: 117
    Ocena: 28
    Ale pisalem ze zapis danych działa. W zwiazku z tym wszystkie pinologie są OK.
    Środowisko to CodeVision , ale to nie ma chyba większego znaczenia.
    Powiem tylko że próbowałem w tym samym układzie program w Bascomie i wszystko śmiga ,więc to nie jest problem sprzetowy.
  • #4 9638005
    GSM
    Poziom 25  
    Posty: 543
    Pomógł: 72
    Ocena: 16
    Fredy napisał:
    Powiem tylko że próbowałem w tym samym układzie program w Bascomie i wszystko śmiga, (...)


    To skoro tak zawzięcie chronisz tej wielkiej tajemnicy jaką jest twój "projekt" to spraw by zapis też jakoś magicznie zaczął działać C, bo przecież w BASCOMIE działa. :roll:

    Twoja uwaga, co do pinologii i zapisu danych jest co najmniej nie na miejscu.

    A tak przy okazji, czy po zapisie nie powinieneś podnieść pinu /CS ? Tak przynajmniej wynikałoby z noty katalogowej, której najwyraźniej nie przeczytałeś...

    Pozdrawiam,
    GSM
  • #5 9638132
    Fredy
    Poziom 27  
    Posty: 915
    Pomógł: 117
    Ocena: 28
    GSM napisał:


    To skoro tak zawzięcie chronisz tej wielkiej tajemnicy jaką jest twój "projekt" to spraw by zapis też jakoś magicznie zaczął działać C, bo przecież w BASCOMIE działa. :roll:
    GSM


    niczego nie chronie - wszystko jest przecież podane w listingu. Konfiguracji pinów nie wkleiłem bo po co zaciamniać sprawę?

    GSM napisał:

    Twoja uwaga, co do pinologii i zapisu danych jest co najmniej nie na miejscu.
    GSM


    nie wiem o co Ci chodzi?

    GSM napisał:

    A tak przy okazji, czy po zapisie nie powinieneś podnieść pinu /CS ? Tak przynajmniej wynikałoby z noty katalogowej, której najwyraźniej nie przeczytałeś...

    Pozdrawiam,
    GSM


    w końcu jakaś iskierka podpowiedzi. Spróbuje tak zrobić. Ale czy mam podnieść CS a potem mam go z powrotem obniżyć przed odczytem?

    Dodano po 17 [minuty]:

    I jeszcze jedno, czytałem datasheet już chyba z 20razy. Fakt z moim angielskim nie jest najlepiej , ale nigdzie nie znalazłem tego że trzeba podciągnąć CS przed odczytem.
    Uzywam tego datasheeta : http://www.datasheetcatalog.org/datasheets/151/131300_DS.pdf
  • #6 9638205
    GSM
    Poziom 25  
    Posty: 543
    Pomógł: 72
    Ocena: 16
    Fredy napisał:
    Konfiguracji pinów nie wkleiłem bo po co zaciamniać sprawę?

    Skoro używasz programowego SPI to jak najbardziej na miejscu jest podanie schematu i konfiguracji PORTów :!:

    Fredy napisał:
    Ale czy mam podnieść CS a potem mam go z powrotem obniżyć przed odczytem?

    Uznasz, że się powtarzam ale... nie czytałeś karty katalogowej :roll:
    Są tam ładne (i pełne informacji), a nawet precyzyjne opisy, warte przeczytania, a to zajmie ci zaledwie kilka minut. :wink:

    Swoją drogą samo zadanie takiego pytania świadczy o braku pojęcia o tym co robisz. :roll:

    Na zakończenie, pin /CS należy ściągnąć do masy przed dokonaniem odczytu, co gorsza (o zgrozo), trzeba go w tym stanie utrzymywać przez cały czas trwania owej procedury - Chip Select, czy ta nazwa ci coś mówi?

    Pozdrawiam,
    GSM
  • REKLAMA
  • #7 9638228
    michalko12
    Specjalista - Mikrokontrolery
    Posty: 3394
    Pomógł: 462
    Ocena: 321
    Nie rozumiem po co to jest:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    zdaje mi się że to jest zbędne.

    Edit.

    Ok potrzebne, najstarszy bit
  • #8 9638241
    Fredy
    Poziom 27  
    Posty: 915
    Pomógł: 117
    Ocena: 28
    michalko12 napisał:
    Nie rozumiem po co to jest:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    zdaje mi się że to jest zbędne.


    to musi być. Strony w tej pamięci są 264 bitowe, więc trzeba zrobić przesunięcia i jeden bit wywalić do górnego adresu.
  • REKLAMA
  • #9 9638256
    GSM
    Poziom 25  
    Posty: 543
    Pomógł: 72
    Ocena: 16
    Zastanawia mnie tylko jedna rzecz... Skoro program w BASCOM-ie działa, to czemu nie przepiszesz go "słowo-w-słowo" na C? :roll:

    Pozdrawiam,
    GSM
  • Pomocny post
    #10 9638261
    michalko12
    Specjalista - Mikrokontrolery
    Posty: 3394
    Pomógł: 462
    Ocena: 321
    Chyba już widze problem.
    Odczytujesz w trybie Inactive Clock Polarity Low a nie SPI
    Jak sie przypatrzysz dobrze to zobaczysz czym te 2 tryby różnią się .
    Inactive Clock Polarity Low wymaga 65 cykli zegara a SPI 64.
    Zmień komendę 0x52 na 0xD2
  • #11 9639613
    Fredy
    Poziom 27  
    Posty: 915
    Pomógł: 117
    Ocena: 28
    GSM napisał:
    Zastanawia mnie tylko jedna rzecz... Skoro program w BASCOM-ie działa, to czemu nie przepiszesz go "słowo-w-słowo" na C? :roll:

    Pozdrawiam,
    GSM


    włąsnie że przepisałem - różnica jest tylko taka, że w Bascomie mam gotowe komendy SPIOUT i SPIIN. Przepisałem wszystko prawie dokłądnie , ale te funkcje musiałem zastąpić . I mam wrażenie że właśnie w nich leży problem (głównie w funkcji czytającej znak po SPI- reszta jest praktycznie identyczna.

    Dodano po 1 [minuty]:

    michalko12 napisał:
    Chyba już widze problem.
    Odczytujesz w trybie Inactive Clock Polarity Low a nie SPI
    Jak sie przypatrzysz dobrze to zobaczysz czym te 2 tryby różnią się .
    Inactive Clock Polarity Low wymaga 65 cykli zegara a SPI 64.
    Zmień komendę 0x52 na 0xD2



    dzięki za pomysł - dziś wieczorem spróbuje to zrobić i powiem jakie były rezultaty.

    Dodano po 6 [minuty]:

    GSM napisał:


    Na zakończenie, pin /CS należy ściągnąć do masy przed dokonaniem odczytu, co gorsza (o zgrozo), trzeba go w tym stanie utrzymywać przez cały czas trwania owej procedury - Chip Select, czy ta nazwa ci coś mówi?

    Pozdrawiam,
    GSM


    przecież tak jest w programie, czy nie widzisz reset_cs na samym początku?
  • #12 9639835
    GSM
    Poziom 25  
    Posty: 543
    Pomógł: 72
    Ocena: 16
    Fredy napisał:
    przecież tak jest w programie, czy nie widzisz reset_cs na samym początku?

    Widzę, to była moja (lekko sarkastyczna) odpowiedź na twoje pytanie:
    Fredy napisał:
    Ale czy mam podnieść CS a potem mam go z powrotem obniżyć przed odczytem?

    Więc się nie przejmuj :wink:

    Jednym błędem było tak jak powiedziałem, nie podniesienie na chwilę /CS po zapisie - inicjujące zapis.
    Drugim jak mniemam (nie zagłębiałem się tak bardzo), to co wymienił kolega michalko12.
    Jeśli nie będzie działać, to będziemy szukać dalej, tylko daj wtedy aktualną wersję kodu. :roll:

    Pozdrawiam,
    GSM
  • #13 9640549
    Fredy
    Poziom 27  
    Posty: 915
    Pomógł: 117
    Ocena: 28
    Ufffffff...... chyba działa !!!!!!!

    Pomogło dodanie jednego impulsu zegarowego -nr 65.
    Dodałem przed procedurą odczytu :

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i teraz śmiga super :D
    PS. GSM - z sygnałem CS było wszystko w porządku.


    Wielkie dzięki dla Michałko :D
  • #14 9641765
    GSM
    Poziom 25  
    Posty: 543
    Pomógł: 72
    Ocena: 16
    Fredy napisał:
    PS. GSM - z sygnałem CS było wszystko w porządku.

    Racja, teraz spojrzałem jeszcze raz, na świeżo, widać coś mi się przywidziało :roll:

    Pozdrawiam,
    GSM
  • #15 10308610
    kkaminski
    Poziom 2  
    Posty: 3
    Witam,
    jestem początkujący a chciałem użyć tej pamięci. Czy możesz przesłać pełny listing wraz z metodami zapisu?
    Z góry dzięki.

    Krzysztof

Podsumowanie tematu

✨ Użytkownik zmagał się z problemem odczytu danych z pamięci AT45DB041 przy użyciu programowego interfejsu SPI w języku C. Zauważył, że zapis działa poprawnie, ale odczyt zwraca błędne dane. W odpowiedziach zasugerowano, że problem może leżeć w nieprawidłowym zarządzaniu sygnałem /CS oraz w różnicach między trybami SPI. Użytkownik dodał impuls zegarowy przed odczytem, co rozwiązało problem. W dyskusji podkreślono znaczenie dokładnego zapoznania się z dokumentacją techniczną oraz dostarczenie pełnych informacji o projekcie, aby uzyskać skuteczną pomoc.
Wygenerowane przez model językowy.
REKLAMA