Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 18 kwi 2025, o 15:52


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 
    Autor Wiadomość
    PostNapisane: 6 gru 2024, o 21:22 
    Offline
    Nowy

    Dołączył(a): 30 sie 2020
    Posty: 4
    Pomógł: 0

    Witam wszystkich forumowiczów.
    Próbuję zgłębić zasady komunikacji przez SPI i jedna rzecz nie daje mi spokoju. Z dokumentacji mikrokontrolera ATMega 328p (przeczytałem wiele razy)wynika że tylko master inicjuje transmisję i tylko w czasie transmisji do układu slave następuje transmisja zwrotna do układu master. Załóżmy że wysyłam bajt danych do slave który ma spowodować że slave ma odesłać jakieś dane w zalezności od tego co dostał. Ale skąd slave ma wiedzieć co dostanie skoro jeszcze tego nie dostał ? czy to oznacza że slave w czasie pierwszej transmisji odeśle jakieś przypadkowe dane. Na tym nie koniec , czy to oznacza również że aby otrzymać od slave odpowiedż w drugim kroku muszę wysłać do slave jakieś przypadkowe dane np same zera żeby uzyskać odpowiedż. Sprawa się komplikuje jeśli transmisja od mastera do slave to jeden bajt a slave ma odesłać 20 bajtów i żeby było ciekawiej nie wiadomo ile tych bajtów będzie. Będę wdzięczny za oświecenie mnie w tej materii. W bluebooku też na ten temat nic nie znalazłem.
    Jeśli umieściłem ten post w niewłaściwym miejscu przepraszam i pozdrawiam



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 7 gru 2024, o 00:34 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 23 paź 2014
    Posty: 1033
    Lokalizacja: Trójmiasto
    Pomógł: 190

    Aby zrozumieć zagadnienie komunikacji, obojętnie czy SPI czy innej, musisz zacząć odróżniać interfejs od protokołu.
    Tak jak w komunikacji międzyludzkiej, możesz porozumiewać się np. w mowie lub w słowie pisanym - to są interfejsy, natomiast ludzkość porozumiewa się w różnych językach np. polskim, angielskim itd. - to są odpowiedniki protokołu. To tak obrazowo.
    Interfejs SPI jest tylko układem do jednoczesnego, dwukierunkowego przesyłania 2 bajtów danych (po jednym bajcie w każdym kierunku), gdzie komunikacja jest 1 do 1 w trybie master-slave czyli jednocześnie mogą wymieniać dane 2 urządzenia, z czego zawsze jedno jest tym sterującym transmisją czyli masterem.
    I teraz, gdy chcesz skomunikować 2 urządzenia, to Ty jako konstruktor/programista musisz opracować sposób porozumiewania się poprzez SPI (oczywiście jeśli jesteś twórcą tych urządzeń, bo jeśli nie, to jego twórca zapewne o to zadbał i opisał to w stosownym dokumencie datasheet).
    A pomysłów na to jest wiele. Ale zasady są takie:
    Jeśli master zagada do slava, a ten jeszcze nie wie co master od niego chce, to po prostu nic nie umieszcza w rejestrze danych i master zassie same zera, ale przecież nie musi tak być, bo np. możesz chcieć by np. slave odesłał np swój id, albo status, a gdy otrzyma już właściwe zapytanie, dopiero zestaw danych. A tu z kolei albo ustalasz, że ten zestaw zawiera zawsze np. 20 bajtów, wówczas master po nadaniu rozkazu, inicjuje 20 razy przesłanie bajta by odczytać całość (wówczas np. nadaje do slave same zera lub też inne informacje), lub ustalasz, że rozkaz zawiera informację ile bajtów ma odesłać slave, albo sam rozkaz determinuje długość odpowiedzi. Możesz też ustalić specyficzną wartość bajtu wysyłanego przez slave, która przez mastera będzie odbierana jako end of transmission.
    Dodatkowo możesz też wybrać inny sposób komunikacji, master do mastera. Wówczas na obu urządzeniach ustawiasz tryb master z nasłuchem, a pin SS ustawiasz jako wejście. Dopóki SS jest w stanie wysokim master nasłuchuje, lub gdy ma potrzebę inicjuje transmisje wystawiając do drugiego mastera stan niski na SS, wówczas drugi master przestawia się w tryb slave.
    Musisz jeszcze zapamiętać że:
    - slave wymaga obsługi pinu SS, i nadzoruje go sprzętowo, czyli gdy na pinie stan wysoki, slave resetuje całą logikę SPI i czeka w uśpieniu, a gdy pojawi się stan niski to aktywuje SPI i odbiera/umieszcza dane w buforze w odpowiednich momentach determinowanych przez takty SCK.
    - master w trybie master do slava, SS ustawione jako wyjście, które sprzętowo NIE jest obsługiwane przez moduł SPI, jak coś chcesz nadać, sam musisz zadbać by ten pin ustawić na stan niski, a na koniec wysoki.
    - master do mastera, pin SS ustawiony jako wejście, trzeba je "ręcznie" przestawić na wyjście w stanie niskim do nadawania.
    - w trybie master do mastera, gdy na masterze zostanie wymuszony odbiór danych w trybie slave (czyli na jego wejściu SS pojawi się stan niski) taki master automatycznie przestawia się w tryb slave, po zakończeniu wymiany danych trzeba "ręcznie" przestawić go ponownie w tryb master.
    - jeśli masz mastera i kilka slavów, master musi mieć osobne wyjście SS dla każdego ze slavów. Jako że tryb master do slava sprzętowo nie obsługuje SS, to tym pinem może być każdy sterowalny pin uC, czyli programista/konstruktor ustala sobie ilość pinów jako SS, tożsamą z ilością układów slave, każdy ustawiony jako wyjście w stanie wysokim, wszystkie slavy połączone równolegle liniami SCK, MOSI, MISO, plus każdy ma osobną linię SS. Na masterze wybierasz z którym slavem chcesz gadać, poprzez ustawienie właściwego pinu SS na stan niski.

    To tyle, napisane tak na szybko, mam nadzieję że zrozumiale.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 7 gru 2024, o 13:20 
    Offline
    Nowy

    Dołączył(a): 30 sie 2020
    Posty: 4
    Pomógł: 0

    Dzięki Xentis
    Tak to właśnie sobie mniej więcej wyobrazałem ale potrzebowałem potwieredzenia. Teraz muszę sobie to wydrukować i jeszcze kilka razy przeczytać żeby wszystko dobrze zrozumieć i zapamiętać a potem napisać jakiś testowy program z wykorzystaniem tej wiedzy. Jeszcze raz dziękuję . Życzę miłego weekendu



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 8 gości


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO