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

Podwójne SPI w STM32F0DISCOVERY - dziwne zachowanie pinu NSS

matti0010 29 Maj 2017 13:12 1257 16
REKLAMA
  • #1 16500974
    matti0010
    Poziom 11  
    Posty: 319
    Pomógł: 8
    Ocena: 25
    Witajcie,

    Mam taki dziwny problem, chcę aby jeden SPI wysyłał dane (liczby, jako master) do drugiego SPI (slave, na tym samym DISCOVERY). Drugi SPI ma odsyłać sumę danych jakie otrzymał w pojedynczej ramce danych. Gdy NSS z SPI1 wisi w powietrzy to dane z SPI1 są wysyłane a pin NSS zachowuje się tak jak powinien. Gdy podepnę go do NSS w SPI2 lub do dowolnego innego pinu to mam ciągle stan niski i nic nie działa... Szczerze powiedziawszy pomysły mnie się już skończyły. Pewnie gdzieś w RM lub erracie coś jest ale nic nie znalazłem. Transmisja danych jest 8-bitowa więc zrobiłem rzutowania (w RM jest przykład). Ma ktoś jakiś pomysł?

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


    W funkcji SPI_read_write() odbieranie chyba też nie działa, ale nie mam pewności więc chcę początkowo "pokonać" problem NSS.
  • REKLAMA
  • Pomocny post
    #2 16501052
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Zwróć uwagę na bit FRXTH w SPI2, bity SSI i SSM w SPI1 i odczyt z SPI2 (też 8 bit).
  • #3 16501101
    matti0010
    Poziom 11  
    Posty: 319
    Pomógł: 8
    Ocena: 25
    Tego bitu FRXTH nie widziałem, jak rozumie on ustala mi rozmiar bufora RX.
    Bity SSI i SSM ustawiam na "1" jeżeli chcę generować programowo sygnał SS układem master to tak chyba muszę te bity ustawić? Przynajmniej na tyle doczytałem, ale mogłem coś pomieszać.
    Po resecie rejestr CR2 ma wartość 0x0700 co daje bitom DS wartość 0111 czyli 8-bitów (przynajmniej według RM tak pisze). Na coś jeszcze powinienem spojrzeć?
  • Pomocny post
    #4 16501142
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Tak, na bit FRXTH - musi być jedynką przy 8-bitowych danych.
  • REKLAMA
  • REKLAMA
  • #6 16501247
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    "//dla pewnosci zeruje cale AFR by miec pewnosc ze alternatywa zerowa jest"

    Dla pewności zresetowałeś więc w obydwóch przypadkach nie tą połówkę co trzeba.

    Odczytaj w programie rejestry statusowe SPI2 i SPI1 - pewnie wyskakuje jakiś błąd. Konfiguruj najpierw slave'a, potem mastera. Użyj debuggera żeby zobaczyć gdzie się wiesza.
  • #7 16501289
    matti0010
    Poziom 11  
    Posty: 319
    Pomógł: 8
    Ocena: 25
    Freddie Chopin napisał:
    "//dla pewnosci zeruje cale AFR by miec pewnosc ze alternatywa zerowa jest"

    Dla pewności zresetowałeś więc w obydwóch przypadkach nie tą połówkę co trzeba.

    Odczytaj w programie rejestry statusowe SPI2 i SPI1 - pewnie wyskakuje jakiś błąd. Konfiguruj najpierw slave'a, potem mastera. Użyj debuggera żeby zobaczyć gdzie się wiesza.


    Racja, mój błąd. Nie wiem czemu odwrotnie skasowałem AFR...
    Podglądałem rejestr SR obu SPI i nic sensownego nie pokazał. Tylko tyle, że SPI2 ma bity FTLVL ustawione na 10 czyli, że jest pół FIFO.
    Zamieniłem kolejnością i najpierw slave inicjuje, nic to nie dało.
    Wiesza się gdy wchodzi do funkcji SPI_read_write(), wskakuje wtedy do pliku startup (korzystam z SW4STM32) i zatrzymuje się w liniach:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #8 16501302
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    W funkcji wpisującej cokolwiek do SPIx->DR powinno być oczekiwanie na informację o tym, że rejestr TX jest pusty - trzeba więc sprawdzać flagę TXE.

    Rzutowanie powinno być na "volatile uint8_t*".

    Wrzuć cały aktualny kod. Wrzuć informację o tym jaka jest zawartość rejestrów SR obydwóch SPI w momencie wystąpienia problemu.

    "__attribute__((interrupt))" jest całkowicie zbędne.
  • REKLAMA
  • #11 16501433
    matti0010
    Poziom 11  
    Posty: 319
    Pomógł: 8
    Ocena: 25
    Tak. Nim tu napisałem to próbowałem debugować, sprawdzałem kilka razy czy nie podłączyłem źle itd... Niestety :( Sprawdzę jeszcze raz (a może...) jednak efekt jest taki, że w momencie zwarcia PA0 z PB12 ustala mi się na tym połączeniu wartość 0 i wskakuje do default handler. Z tego co widzę to ta wartość 0 ustala się tylko dla tego, że wcześniej sam mu to ustalam by rozpocząć transmisję, która niestety nie działa nagle.

    Dodano po 3 [minuty]:

    Co ciekawsze, jak zmienię PB12 na PB11 to efekt jest taki sam (mogę podpinać w dowolne miejsce PA0 i nic, ale jak podepnę do PB11 to się wiesza). Podejrzewam więc, że mam coś skopane w inicjalizacji PB12. Próbowałem na różne sposoby, pull-up dałem ale nic nadal.
  • #13 16501521
    matti0010
    Poziom 11  
    Posty: 319
    Pomógł: 8
    Ocena: 25
    W takim momencie człowiek poznaje jak bogate ma słownictwo (te, które nie nadaje się do "towarzystwa")... Tyle czasu stracić z powodu takiego błędu... To chyba standard w programowaniu :(

    Teraz chodzi, nie do końca tak jak bym chciał ale działa już coś. To co odsyła slave jest jak gdyby opóźnione i mam dwa rodzaje ramek jakie otrzymuje:

    - jedno gdzie mam dwa razy zero na początku a powinno wystąpić tylko raz Podwójne SPI w STM32F0DISCOVERY - dziwne zachowanie pinu NSS

    - drugie gdzie powinno być to co wyżej ale przesunięte o "jeden bajt" w lewo
    Podwójne SPI w STM32F0DISCOVERY - dziwne zachowanie pinu NSS

    Będę jeszcze szukał, ale może ktoś widzi z czego to wynika (takie przesunięcie)?
  • #14 16501717
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Zawsze będzie o jeden bajt opóźnione. To że masz opóźnione o dwa bajty musi wynikać z jakichś operacji zapisu do rejestru DR. Przykładowo zauważ, że wszystkie operacje typu "SPI2->DR = 0;" powodują wysłanie DWÓCH bajtów.

Podsumowanie tematu

✨ Użytkownik zgłosił problem z komunikacją między dwoma interfejsami SPI na płytce STM32F0DISCOVERY, gdzie SPI1 działa jako master, a SPI2 jako slave. Problemy pojawiają się, gdy pin NSS z SPI1 jest podłączony do pinu NSS w SPI2, co skutkuje ciągłym stanem niskim i brakiem transmisji. Użytkownicy zasugerowali sprawdzenie bitów FRXTH, SSI i SSM oraz rejestrów statusowych SPI. Po kilku próbach i błędach, w tym błędnej inicjalizacji pinów, użytkownik zdołał uruchomić komunikację, jednak zauważył opóźnienia w przesyłanych danych. Ostatecznie rozwiązano problem z rzutowaniem danych, co poprawiło działanie transmisji.
Wygenerowane przez model językowy.
REKLAMA