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.
|