Elektroda.pl
Elektroda.pl
X
Arrow Multisolution Day
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Pamięć FLASH M25P32 - Problem z komunikacją

czarusgg 05 Maj 2015 09:48 2415 53
  • #31 05 Maj 2015 09:48
    kamyczek
    Poziom 34  

    To jakieś czary nie możliwe żeby działy się takie rzeczy wygląda tak jak by pamięć miała problem z prawidłowym identyfikowaniem komunikacji spi i komend ,które otrzymuje czy oba układy mają zasilanie 3,3V ? możesz jeszcze dodać czas między zerowaniem linii CS a rozpoczęciem nadawania czasem to robi różnicę i problemy choć przy parametrach tej pamięci to raczej niemożliwe .

  • Arrow Multisolution Day
  • Arrow Multisolution Day
  • #33 05 Maj 2015 10:18
    czarusgg
    Poziom 12  

    Dzięki @Dondu. Oczywiście to sprawdzę, ale ostatnio zamieściłem cały kod oraz schemat, jest rezystor podciągający 10K na lini CS :)

    Ale ja już tyle rzeczy niemożliwych widziałem, że oczywiście sprawdzę i ten wątek dochodzenia :) Dopiero późnym wieczorem będę miał możliwość dalszych prób. Ale to co mówisz może być tym, czego szukam :)

    Dodano po 1 [minuty]:

    Cytat:
    Najpierw niech zrobi to co opisałem w poprzednim poście, bez żadnych dodatkowych kombinacji z dodawaniem opóźnień itp. Wykorzystuję te pamięci bez problemu i jakichkolwiek opóźnień.


    Ja na XMedze też nie miałem z nią żadnych problemów, poprostu ruszyła i normalnie działała :) Ale na XMedze, to programista martwi się o piny w ATMegach włączenie modułu przejmuje kontrolę nad współdzielonymi pinami, także trop Dondu narazie najbardziej obiecujący :) SPrawdzę wieczorem i oczywiście dam znać :)

    PS. Tymbardziej, że faktycznie w moim kodzie najpierw następuję włączenie SPI a później konfiguracja pinów i SS jako wyjście. Więc TAK w momencie włączania SPI pin PB4 (SS) jest wejściem, ale... ze stanem wysokim, co zapewnia rezystor PULLUP. "No chyba, że ATMEGA zasuwa tak szybko, że napięcie nie zdąży przez ten rezystor narosnąć i odczytywany jest stan niski" (to w cudzysłowie to żarcik taki miał być) :)

  • #34 05 Maj 2015 16:29
    kamyczek
    Poziom 34  

    Dondu czytałeś co pisałem w poście #26 . Ponoć to nic nie dało a ja bym sobie dał rękę obciąć ze tu jest problem . Miałem takie same objawy używając spi do wyświetlacza oled Jak Cs był w masterze na SS lcd był martwy , po zmianie pinu na inny wszystko ożyło .

  • #35 05 Maj 2015 16:43
    dondu
    Moderator Mikrokontrolery Projektowanie

    czarusgg napisał:
    Więc TAK w momencie włączania SPI pin PB4 (SS) jest wejściem, ale... ze stanem wysokim, co zapewnia rezystor PULLUP.

    ... ale dopiero wtedy, gdy go dodałeś, a jeśli dobrze zrozumiałem wcześniej go tam nie było, dlatego o tym napisałem. Generalnie wypunktowujemy ewentualne miejsca problemów, a Ty je załatwiasz w sposób jaki uznasz za stosowne.

    kamyczek napisał:
    Dondu czytałeś co pisałem w poście #26 . Ponoć to nic nie dało a ja bym sobie dał rękę obciąć ze tu jest problem . Miałem takie same objawy używając spi do wyświetlacza oled Jak Cs był w masterze na SS lcd był martwy , po zmianie pinu na inny wszystko ożyło .

    Czytałem :)
    Do tej pory nie miałem jednak z pinem SS problemów jakie opisujesz, dlatego nie odniosłem się bezpośrednio do Twojego postu #26.

  • #36 05 Maj 2015 23:02
    czarusgg
    Poziom 12  

    Witam wszystkich ponownie!

    Dzień walki z pamięcią kolejny :)

    Poczyniłem następujące kroki:

    1. Wymieniłem uC na inny egzemplarz.
    2. Wziąłem procedurę inicjującą SPI od Dondu (mały błąd Ci się wkradł do niej - ale nie istotny w tym przypadku).
    3. Od razu po uruchomieniu uC inicjuję USART by mieć możliwość jakiejkolwiek diagnostyki.
    4. Następną rzeczą jaką robię, to badam stan pinu PINB4, zanim cokolwiek pozmieniam w konfiguracji, by sprawdzić w jakim faktycznie jest stanie. Jest w stanie wysokim (1 linia z terminala).
    5. Po inicjalizacji SPI badam bit MSTR w celu sprawdzenia trybu pracy modułu SPI (3 linia na terminalu).
    Następnie próba dogadania się z pamięcią. Linia 8 z terminala to bajty wysłane do pamięci a linia 9 to bajty odebrane w tym samym czasie.

    A tutaj wynik działania programu na terminalu:

    Cytat:
    1: Sprawdzanie PINU B4 (SS): LO
    2: Init SPI...
    3: Badanie bitu MSTR w rejestrze SPCR: 1
    4:
    5: Czekamy 1s...
    6:
    7: CS -> LO
    8: >> 9f 00 00 00
    9: << ab 00 00 00
    10: CS -> HI


    Podsumpowując, niestety nadal nic :)

    Dodano po 8 [minuty]:

    A to ciekawostka piszę, że SS jest w stanie wysokim a do postu wkradł się "listing" ze stanem niskim :( Ponaciskałem więc kilka razy RESET i okazuje się, że linia CS "pływa", nie mniej w jakimkolwiek stanie by nie była, SPI zawsze pracuje w trybie MASTER (w każdej sytuacji w lini 3 mam wartość "1").

    Ponieważ stan PINB4 pływa, włączyłem podciągnięcie w uC, teraz za każdym razem mam stan HI i...

    ..nadal nic :(

    Zastanawia mnie natomiast ten pływający stan, który powinien być stabilny :( Może coś nie kontaktuje (układ uruchomiony na płytce stykowej z bazą w postaci platformy prototypowej - sprawdzonej już setki razy), tylko pamięć jest na płytce stykowej.

    Mam zrobić zdjęcie układu?

    Dodano po 16 [minuty]:

    Następną rzecz jaką zrobiłem, to znowu napisałem softwaerową realizację SPI, "by mieć wszystko pod kontrolą" :) I zgadnijcie co się stało...

    Nie zgadliście?

    No to wam powiem :) ...nadal efekt ten sam co na listingu z numerowanymi liniami z terminala :(

    Chyba się poddam...

  • #37 05 Maj 2015 23:43
    kamyczek
    Poziom 34  

    A ja się nie poddam :) przy następnym zamówieniu kupię sobie taką pamiątkę albo dwie i uruchomię . Poza tym ja bym zaryzykował i podłączył pamiątkę na pająka do atmegi możliwe że problemem jest pojemność wyprowadzeń płytki stykowej lub sama jakość tych podłączeń . Mam nadzieje że cały układ zasilasz jednym zasilaniem 3,3V

  • #38 06 Maj 2015 00:33
    czarusgg
    Poziom 12  

    Pamiętaj, że na ATXmedze ruszyło to od ręki :) Także, nie przewidywałbym tutaj problemów.

    Przeniosłem pamięć w drugi koniec płytki, szyny zasilające umieściłem w jednej sekcji, by styków było jak naj mniej. Wszytsko zasilane jest z programatora. napięcie na zaciskach VCC i VSS pamięci wynosi 3,28V.

    Zacząłem pisać program od nowa, bo w eksperymentalnym był już burdel :), zamieszczę wyjście z nowego programu :)

    Może przy napisaniu od nowa na "czysto" pójdzie lepiej :)

    Dodano po 1 [minuty]:

    Właśnie oglądam odcinek ElektroPrzewodnika o zakłóceniach :)

    Dodano po 42 [minuty]:

    I znowu nic z tego :(

    Oto wynik działania programu:

    Cytat:
    Start...
    Ustawiamy piny:
    B4 - Wyjscie SS
    B5 - Wyjscie MOSI
    B6 - Wejscie MOSI
    B7 - Wyjscie CLK

    DDRB |= (1 << PINB4) | (1 << PINB5) | (1 << PINB7);

    Ustawiamy linie PB4 (SS) w stan HI:
    PORTB |= (1 << PINB4);

    Inicjujemy SPI:
    SPSR = (1 << SPI2X);
    SPCR = (1 << MSTR) | (1 << SPE);

    Probujemy blagalnym tonem zapytac pamiec, jak sie nazywa:

    Aktywujemy pamiec poprzez wystawieniestawienie stanu LO na lini PB4 (SS):

    PORTB &= ~(1 << PINB4);
    Wysylamy polecenie RDID (0x9F):
    SPDR = 0x9F;
    Oczekujemy, az bajt polecenia zostanie nadany:
    while (!(SPSR & (1 << SPIF)));
    Odczytujemy "nieistotny odebrany bajt", by skasowac flage SPIF
    uint8_t DUMMY = SPDR;
    Odbieramy pierwszy bajt z tego, co pamiec ma nam do powiedzenia
    SPDR = 0;
    Oczekujemy, az bajt zostanie odebrany od (mam nadzieje gadatliwej tym razem pamieci):
    while (!(SPSR & (1 << SPIF)));
    Odczytujemy odebrany bajt, by skasowac flage SPIF i przechowujemy w pierwszej zmiennej
    uint8_t BAJT_A = SPDR;

    Odbieramy drugi bajt z tego, co pamiec ma nam do powiedzenia
    SPDR = 0;
    Oczekujemy, az bajt zostanie odebrany od (mam nadzieje gadatliwej tym razem pamieci):
    while (!(SPSR & (1 << SPIF)));
    Odczytujemy odebrany bajt, by skasowac flage SPIF i przechowujemy w drugiej zmiennej
    uint8_t BAJT_B = SPDR;

    Odbieramy trzeci bajt z tego, co pamiec ma nam do powiedzenia
    SPDR = 0;
    Oczekujemy, az bajt zostanie odebrany od (mam nadzieje gadatliwej tym razem pamieci):
    while (!(SPSR & (1 << SPIF)));
    Odczytujemy odebrany bajt, by skasowac flage SPIF i przechowujemy w trzeciej zmiennej
    uint8_t BAJT_C = SPDR;

    Zwalniamy umeczona pamiec poprzez podanie jej "usypiajacego" stanu HI na lini CS
    PORTB |= (1 << PINB4);Chwalimy sie calemu swiatu tym, co powiedziala nam pamiec:
    20 00 10


    A to sam program:

    Kod: c
    Zaloguj się, aby zobaczyć kod

  • #39 06 Maj 2015 00:50
    kamyczek
    Poziom 34  

    Zastanawiam się czy to aby na pewno poprawny zapis :

    DDRB |= (1 << PINB4) | (1 << PINB5) | (1 << PINB7);

    W rejestrze DDRB nie ma wyprowadzeń o nazwach PINBX za to są DDBX może to stanowi problem ;)

  • #40 06 Maj 2015 01:24
    czarusgg
    Poziom 12  

    No co Ty? PINB4 to symbol preprocesora i jest zamieniany przed kompilacją poprostu na "4", czyli zapis (1 << PINB6) to w efekcie końcowym (1 << 6), tyle tylko, że jest to po prostu czytelniejsze :)

  • #41 06 Maj 2015 10:16
    kamyczek
    Poziom 34  

    Jak kompiluje kompilator C nie mam pojęcia a w tym co piszę staram się stosować prawidłowe nazewnictwo rejestrów i bitów . Z ciekawości można tą pamięć kupić taniej niż za 8 pln ?

  • #42 06 Maj 2015 10:33
    czarusgg
    Poziom 12  

    Jeśli tylko rozwiążesz mi problem, to spokojnie mogę Ci podesłać swój komplet (uC + Pamięć) :)

    Ja kupiłem na AliExpress, jakieś 2zł / szt.

    Dodano po 4 [minuty]:

    Cytat:
    Jak kompiluje kompilator C nie mam pojęcia a w tym co piszę staram się stosować prawidłowe nazewnictwo rejestrów i bitów


    Ja generalnie posługuję się samymi cyframi i do tej pory stosowałem zapis (1 << 4), ale jeśli ktoś ma mi pomóc, to taki zapis (1<<PINB4), to niby to samo, ale od razu sugeruje intencję. Jest jakoby somodokumentujący się :). Chodzi mi tylko o wygodę tych co ewentualnie mogliby mi pomóc. Wszsycy tutaj wiedzą, że ustawiając jakiś bit rejestru PORTB albo wystawiamy na odpowiednim pinie stan wysoki, albo włączamy dla tego pinu podciągnięcie. Ale, gdybym użył zapisy symbolicznego np. do ustawienia zwiększonej prędkości SPI w postaci SPCR = (1 << PORTC0) oczywiście byłoby to poprawne, ale od razu zasugerowałoby innym, że z kontekstu wynika iż chciałem coś zrobić z pinem a nie zegarem dla SPI i łatwiej byłoby im wskazać mój błąd. Oczywiście, to może działać w drugą stronę :)

  • #43 06 Maj 2015 10:45
    dondu
    Moderator Mikrokontrolery Projektowanie

    kamyczek napisał:
    Zastanawiam się czy to aby na pewno poprawny zapis :

    DDRB |= (1 << PINB4) | (1 << PINB5) | (1 << PINB7);

    W rejestrze DDRB nie ma wyprowadzeń o nazwach PINBX za to są DDBX może to stanowi problem ;)

    Gdyby kompilator nie widział definicji wskazałby to w komunikatach.

    Plik: iom32a.h

    Kod: c
    Zaloguj się, aby zobaczyć kod


    czarusgg napisał:
    Dondu (mały błąd Ci się wkradł do niej - ale nie istotny w tym przypadku).

    Jaki?

    Zdjęcia? Czemu nie - zawsze to jakiś materiał do analizy.

    Reasumując. Jak już pisałem, nie mam problemów z komunikacją z pamięcią M25P80 (czyli wersja 8Mbit) i wykorzystaniem pinu SS - wszystko śmiga bez problemu. Może więc spróbuj odczytać jakiś bajt z pamięci, następnie zapisz go jakąś wartością i odczytaj ponownie. W ten sposób upewnisz się co do działania nie tylko rozkazu READ IDENTIFICATION.

  • #44 06 Maj 2015 10:54
    czarusgg
    Poziom 12  

    Zamiast włączać bit SPI2X zmieniasz preskaler dla SPI (nie ten rejestr zmieniasz co trzeba), ale tak jak napisałem, nie ma to w tym przypadku znaczenia.

    Co do próby odczytu i zapisania, oczywiście mogę ją wykonać i nawet się cieszyć, że zadziała (o ile zadziała) :) Ale nie mogę na tej podstawie zbudować żadnego urządzenia i martwić, się czy czasem aby pamięć nie zawiedzie i w kluczowym momencie i nie włączę np. domykania bramy zamiast włączyć jej hamulca, bo z pamięci przyszły losowe dane zamiast konkretnej kombinacji i zgnitę jakiemuś dziecku głowę tylko dlatego, że bit do silnika akurat tym razem przyszedł z jedynką, mimo iż w pamięci powinien być zapisany z zerem :)

    Wiem, to takie drastyczne, ale sam wiesz (choćby ze swojego bloga), że kompromis owszem, ale nie łut szczęścia :)

    No i zwróć uwagę, ze ten sam egzemplarz pamięci z ATXmegą poprostu zadziałał od ręki.

    PS. Mnie cały czas zastanawia pływanie stanu CS mimo podciągnięcia 10K do VCC.

    Wieczorem wrzucę zdjęcie :)

    Dodano po 3 [minuty]:

    Cytat:
    Reasumując. Jak już pisałem, nie mam problemów z komunikacją z pamięcią M25P80 (czyli wersja 8Mbit) i wykorzystaniem pinu SS - wszystko śmiga bez problemu.


    Ja do tej pory też nie miałem żadnego problemu, to pierwszy taki dziwny przypadek jaki mi się przytrafił.

  • #45 06 Maj 2015 10:59
    dondu
    Moderator Mikrokontrolery Projektowanie

    Chodziło mi tylko o to, by się upewnić, że nie dotyczy to tylko rozkazu READ IDENTIFICATION.

    czarusgg napisał:
    Zamiast włączać bit SPI2X zmieniasz preskaler dla SPI (nie ten rejestr zmieniasz co trzeba), ale tak jak napisałem, nie ma to w tym przypadku znaczenia.

    Faktycznie literówka w nazwie rejestru - dzięki że to zauważyłeś. :)

  • #46 06 Maj 2015 11:09
    czarusgg
    Poziom 12  

    Cytat:
    Faktycznie literówka w nazwie rejestru - dzięki że to zauważyłeś.


    Wiem, że literówka, a zauważyłem podejrzewam dlatego, że staram się dokładnie wszystko przeanalizować (bo nie działa), gdyby nie było problemów, to pewnie nie zwróciłbym na to uwagi :)

    Skoro przy układzie z ATXMegą działało bez problemu to nie sądzę, by tutaj problem dotyczył tylko rozkazu RDID, nie wiem, czy masz w głowie cały wątek, ale w pewnym momencie po sugestiach kamyczka podszedłem do tematu próbując pamięć obudzić (gdzie przy ATXmedze też to nie było potrzebne) i na ten rozkaz pamięć dalej kiepsko reagowała.

    Robiłem zresztą próby też z odczytywaniem rejestru statusu czy wykonywaniem polecenia zezwalającego na zapis i ponowny odczyt statusu, czy pozwolenie na zapis było skuteczne. W każdym przypadku kiszka.

    Zobacz też, że wczoraj wieczorem podszedłem do preblemu ponownie, przeniosłem kość w inny rejon płytki stykowej (na zasadzie, że może gdzieś nie łączy), zmieniłem troszkę zasilanie by było w jednej sekcji płytki stykowej i jak najbliżej pamięci a program zacząłem od kombinacji klawiszy [CTRL]+[A], [DEL], ostatni program wręcz wszystkie polecenia co robi wysyła echo na USARTA, zobacz listing. No już bardziej modelowy przykład nie przychodzi mi do głowy, jak mógłbym to jeszcze "czyściej" napisać, by nie było jakiś fragmentów, które może gdzieś coś mieszają...

    Po prostu głupi zaczynam być coraz bardziej od tego wszystkiego.

  • #48 06 Maj 2015 11:35
    czarusgg
    Poziom 12  

    Oczywiście, ze tak :) Może przyda się jako materiał na bloga ;) Może wpadnie Ci coś do głowy jak porobię zdjęcia :)

    W każdym bądź razie dzięki za pomoc dotychczasową.

    Szczerze mówiąc to już tylko mój upór, bo generalnie i tak przesiadam się na XMegi z Atmeg i Tin :)

    Projekt i tak zrealizuję na XMedze.

    Poza tym, trochę atmeg mi jeszcze zostało (raczej dużo niż mało), które w końcu wykorzystam...

  • #50 15 Maj 2015 10:48
    czarusgg
    Poziom 12  

    Rezultaty bez zmian niestety.

    Próbowałem jeszcze na ATMEDZE 644 i efekt ten sam.

    Mogę spróbować jeszcze na:

    ATMEGA8
    ATMEGA32
    ATMEGA328P

    Ale ATMEGI328P muszę przeprogramować wysokonapięciowo (czekam na DRAGONA) ponieważ przekalibrowałem im zegar i chodzą tak wolno, że żadnym programatorem poprzez ISP nie mogę się do nich dobrać :)

    Dzisiaj spróbuję na ATMEGA32 (ta jest dla mnie dostępna od ręki) i wieczorem dam znać razem z fotkami, które obiecałem dawno temu.

    A nie mam pomysłów na tyle, że gotów jestem np. do Ciebie wysłać komplet uC + pamięć, byś spróbował sam się do niej dobrać :)

    Dodano po 48 [sekundy]:

    Nie próbowałem jeszcze dobierać się do tej pamięci za pomocą USARTa w trybie SPI :) Także mogę jeszcze taki eksperyment wykonać :)

  • #51 15 Maj 2015 12:08
    dondu
    Moderator Mikrokontrolery Projektowanie

    Mogę Ci udostępnić bibliotekę i schemat podłączenia M25P80 do ATmega32, bo taki projekt gdzieś mam.
    Musiałbyś tylko na wszelki wypadek upewnić się w dokumentacji, że nie ma różnic między tymi pamięciami.

  • #54 15 Maj 2015 12:10
    czarusgg
    Poziom 12  

    OK, Będę na CIebie polował wieczorkiem :)