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

Wprowadzenie do interfejsu SPI

ghost666 10 Lut 2019 15:10 1647 10
  • Interfejs SPI (Serial Peripheral Interface – ang. szeregowy interfejs peryferiów) jest jednym z najszerzej stosowanych interfejsów cyfrowych, wykorzystywanych do łączenia peryferiów z układami, takimi jak mikrokontrolery. Interfejs SPI znajdziemy w rozmaitych sensorach przetwornikach analogowo-cyfrowych (ADC) i cyfrowo-analogowych (DAC), rejestrach przesuwnych, pamięci SRAM i wielu innych elementach.

    Poniższy artykuł ma za zadanie opisać w skrócie interfejs SPI, przedstawiając podstawowe informacje na temat samego interfejsu, sposobu jego podłączania i komunikacji z jego wykorzystaniem. Wszystko to uzupełnione zostanie przykładem wykorzystania w realnej aplikacji interfejsu SPI do komunikacji z przełącznikami elektronicznymi i multiplekserami, które umożliwiają istotne zredukowanie ilości potrzebnych w naszym systemie wyprowadzeń GPIO procesora.

    SPI to synchroniczny interfejs cyfrowy, pracujący w trybie full-duplex (tj. posiadający dwie osobne linie do komunikacji w dwie strony) i architekturze master-slave (tzn. że w systemie jest – zazwyczaj – jeden master, czyli układ kontrolujący transmisję i co najmniej jeden, lub więcej, układy typu slave, które odpowiadają na zapytania urządzenia master). Interfejs SPI występuje najczęściej w dwóch implementacjach – trzy- lub czteroprzewodowej. W tym materiale skupimy się na popularniejszej wersji z czterema liniami sygnałowymi.

    Wprowadzenie do interfejsu SPI
    Rys.1. Przykładowa konfiguracja układów master oraz słabe w systemie.


    Czteroprzewodowy interfejs SPI, jak pokazano na rysunku 1 posiada następujące linie:
    * Zegar (SPI CLK, SCLK);
    * Chip select – wybór układu (CS);
    * Linia danych wychodzących z mastera i wchodzących na slave – master out, slave in (MOSI);
    * Linia danych wchodzących na mastera i wychodząca z slave – master in, slave out (MISO).

    Za generowanie sygnału zegarowego – SCLK – odpowiedzialny jest układ master, który nadzoruje transmisję. Dane na liniach MISO i MOSI są zsynchronizowane do tego zegara. Może on mieć różną częstotliwość, ale zazwyczaj są to wartości istotnie wyższe niż w przypadku układów z interfejsem I²C. Na rysunku 1 pokazano, jak połączone są odpowiednie piny układów w interfejsie SPI.

    Linia chip select (CS) służy do aktywacji wybranego układu slave przez mikrokontroler. Zwyczajowo CS aktywowany jest stanem niskim (logika odwrotna), a gdy CS podciągnięty jest do zasilania, to dany układ odłączany jest od interfejsu. Dla uproszczenia przyjmijmy w tym artykule, że wszystkie układy korzystają z takiej logiki.





    Każdy slave musi mieć swój indywidualny sygnał CS. Pozostałe linie są wspólne dla wszystkich układów.

    Linie MISO i MOSI to synchroniczne linie danych w trybie full-duplex. MOSI transmituje dane z mastera do układów slave, a MISO w drugą stronę.

    Transmisja danych

    Aby rozpocząć transmisję, master musi wysłać sygnał zegarowy i wybrać układ, ściągając do masy odpowiednią linię CS. Interfejs SPI jest dwukierunkowy, co oznacza, że w danym momencie oba układy – master i slave – mogą wysyłać do siebie nawzajem dane poprzez linie, odpowiednio, MOSI i MISO.

    Podczas transmisji dane są synchronicznie przenoszone na linię MOSI i czytane z linii MISO. Synchronizują je zbocza zegara SCLK. Interfejs jest dosyć elastyczny i pozwala między innymi na konfigurację, na którym zboczu zegara dane mają być przenoszone z/do linii danych. Wybrać możemy, oczywiście, pomiędzy zboczem opadającym i narastającym.

    Polaryzacja i faza linii zegarowej

    Zegar SCLK pracować może z różną polaryzacją i fazą, konfigurowalną w układzie master. Za konfiguracje tą odpowiadają zazwyczaj dwa bity – CPOL, który kontroluje polaryzację, czyli poziom logiczny w jakim znajduje się zegar pomiędzy transmisjami (gdy linie CS są w stanie wysokim) oraz CPHA, który steruje fazą zegara, to jest konfiguruje, czy dane są próbkowane/wysyłane na zboczu opadającym czy narastającym zegara.

    Master musi być skonfigurowany tak, jak wymagają tego układy slave, z którymi chce się komunikować – inaczej transmisja nie zostanie poprawnie przezeń odebrana. W zależności od konfiguracji bitów CPOL i CPHA SPI pracować może w jednym z czterech trybów. Opisane są one w poniższej tabeli:

    Tryb SPICPOLCPHAPolaryzacja zegara w stanie IdlePolaryzacja zegara wykorzystywana do próbkowania i/lub przesuwania danych
    000Logiczny niskiDane próbkowane na zboczu narastającym, a przenoszone na zboczu opadającym
    101Logiczny niskiDane próbkowane na zboczu opadającym, a przenoszone na zboczu narastającym
    211Logiczny wysokiDane próbkowane na zboczu opadającym, a przenoszone na zboczu narastającym
    310Logiczny wysokiDane próbkowane na zboczu narastającym, a przenoszone na zboczu opadającym


    Na rysunkach 2 – 5 zaprezentowano przykładową komunikację w każdym z czterech trybów działania SPI, uzależnionych od konfiguracji bitów CPOL oraz CPHA. W poniższych przykładach na liniach MOSI oraz MISO zaprezentowano przykładowe przebiegi z danymi. Początek transmisji oznaczony jest zieloną, przerywaną linią. Zbocze, na którym następuje próbkowanie sygnału oznaczono przerywaną pomarańczową linią, a zbocze, na którym dane są przesyłane na linie interfejsu oznaczono przerywaną linią w kolorze niebieskim.

    Pamiętajmy, że pokazane poniżej przebiegi są abstrakcyjnymi przykładami, a te w realnych aplikacjach mogą się istotnie różnić. Aby poznać konkretne przebiegi, skonsultować musimy się z dokumentacją (np. kartą katalogową) układu, z którego korzystamy. Oprócz samego kształtu przebiegu w dokumentacji znajdziemy także zależności czasowe pomiędzy poszczególnymi zboczami na wszystkich liniach. Ich zachowanie jest krytyczne, aby interfejs poprawnie i bezawaryjnie działał transmitując w obie strony dane.

    Na rysunku 2 zaprezentowano przebieg danych w trybie 0 - to jest, kiedy polaryzacja (CPOL) i faza zegara (CPHA) ustawione są na zero. Zegar domyślnie, pomiędzy transmisjami, jest w stanie niskim. CPHA = 0 oznacza, że dane są próbkowane przez układy w momencie, gdy na linii zegarowej występuje zbocze narastające (oznaczone pomarańczową linią), a wysyłane z układów w momencie, gdy w zegarze obecne jest zbocze opadające (oznaczone linią niebieską).

    Wprowadzenie do interfejsu SPI
    Rys.2. SPI w trybie 0, CPOL = 0, CPHA = 0: CLK jest domyślnie w stanie niskim, dane są próbkowane na zboczu narastającym, a przesyłane na zboczu opadającym.


    Na rysunku 3 zaprezentowano przebieg danych w trybie 1 - to jest kiedy polaryzacja (CPOL) ustawiona jest na zero, a faza zegara (CPHA) na jeden. Zegar domyślnie, pomiędzy transmisjami, jest w stanie niskim. CPHA = 1 oznacza w takiej sytuacji, że dane są próbkowane przez układy w momencie, gdy na linii zegarowej występuje zbocze opadające (oznaczone pomarańczową linią), a wysyłane z układów w momencie, gdy w zegarze obecne jest zbocze narastające (oznaczone linią niebieską).

    Wprowadzenie do interfejsu SPI
    Rys.3. SPI w trybie 2, CPOL = 0, CPHA = 1: CLK jest domyślnie w stanie niskim, dane są próbkowane na zboczu opadającym, a przesyłane na zboczu narastającym.


    Na rysunku 4 zaprezentowano przebieg danych w trybie 2, to jest kiedy polaryzacja (CPOL) i faza zegara (CPHA) ustawione są na jeden. Zegar domyślnie, pomiędzy transmisjami, jest w stanie wysokim, a dane są próbkowane przez układy w momencie gdy na linii zegarowej występuje zbocze opadające (oznaczone pomarańczową linią), a wysyłane z układów w momencie, gdy w zegarze obecne jest zbocze narastające (oznaczone linią niebieską).

    Wprowadzenie do interfejsu SPI
    Rys.4. SPI w trybie 2, CPOL = 1, CPHA = 1: CLK jest domyślnie w stanie wysokim, dane są próbkowane na zboczu opadającym, a przesyłane na zboczu narastającym.


    Na rysunku 5 zaprezentowano przebieg danych w ostatnim z przedstawianych trybów - 3, to jest kiedy polaryzacja zegara (CPOL) ustawiona jest na jeden, a faza zegara (CPHA) ustawiona jest na zero. Zegar domyślnie, pomiędzy transmisjami, jest w stanie wysokim. CPHA = 0 oznacza, że dane są próbkowane przez układy w momencie, gdy na linii zegarowej występuje zbocze narastające (oznaczone pomarańczową linią), a wysyłane z układów w momencie, gdy w zegarze obecne jest zbocze opadające (oznaczone linią niebieską).

    Wprowadzenie do interfejsu SPI
    Rys.5. SPI w trybie 3, CPOL = 1, CPHA = 0: CLK jest domyślnie w stanie wysokim, dane są próbkowane na zboczu narastającym, a przesyłane na zboczu opadającym.


    Konfiguracja systemu z wieloma urządzeniami slave

    W przypadku interfejsu SPI dosyć często spotykamy się z sytuacją, gdy do jednego mastera dopiętych jest więcej niż jedno urządzenie typu slave. W takiej sytuacji linie interfejsu połączone mogą być w dwojaki sposób – równolegle (często nazywane po prostu jako normalne połączenie) lub szeregowo (tzw. konfiguracja ‘daisy-chain’).

    Zwykła konfiguracja SPI

    Wprowadzenie do interfejsu SPI
    Rys.6. Typowa architektura interfejsu SPI z wieloma układami slave.


    W przypadku typowej konfiguracji SPI, w momencie, gdy CS przyjmie stan niski (układ zostanie aktywowany) przez mastera, zegar oraz dane na liniach MOSI i MISO udostępniane są wybranemu układowi slave. Jeśli w jednym momencie stan niski przyjmie kilka linii CS, to dane na linii MISO będą niepoprawne – nadawać będzie kilka układów slave naraz. Przez to master nie będzie w stanie rozpoznać, który układ transmituje dane.

    Jak widzimy na rysunku 6, gdy rośnie liczba układów podłączonych do mikrokontrolera, rośnie też liczba linii potrzebnych do ich obsłużenia. W ten sposób szybko wzrosnąć może liczba linii potrzebnych do komunikacji z potrzebnymi nam urządzeniami. Istnieje szereg sposobów, które pozwalają zredukować ich liczbę, na przykład multipleksowanie linii CS.

    Konfiguracja ‘Daisy-Chain’

    Wprowadzenie do interfejsu SPI
    Rys.7. Wiele układów slave z połączonymi szeregowo (‘daisy-chain’) liniami danych.


    W trybie tzw. ‘Daisy-chain’ układy połączone są ze sobą szeregowo. Wszystkie linie CS połączone są ze sobą równolegle do jednego GPIO w mikrokontrolerze, a linie MISO i MOSI połączone są jedna za drugą – wszystkie układy tworzą swoisty łańcuch, gdzie procesor jest na pierwszym miejscu. Każdy układ retransmituje dane wejściowe dalej – to co pojawia się na linii MOSI układu slave, przekazywane jest dalej, na wyjście MISO, podłączone z kolei do MOSI kolejnego układu slave etc.

    W opisanej powyżej architekturze dane propagują od jednego układu slave do drugiego. Liczba cykli zegara potrzebnych, aby dane dotarły na miejsce, jest proporcjonalna do pozycji układu w łańcuchu. W przykładzie pokazanym na rysunku 7, jeśli przesyłamy 8-bitowe dane, to do trzeciego układu w łańcuchu dotrą one po 24 cyklach zegara – normalnie byłoby to tylko osiem cykli.

    Na rysunku 8 zaprezentowano przebiegi na poszczególnych liniach w układzie. Widać na nich, jak dane propagują się przez poszczególne układy.

    Pamiętać należy, że nie wszystkie układy scalone, wyposażone w interfejs SPI, wspierają połączenia szeregowe tego rodzaju. Bliższe informacje na ten temat odnaleźć można w ich kartach katalogowych.

    Wprowadzenie do interfejsu SPI
    Rys.8. Propagacja danych w topologii ‘daisy-chain’.


    Analogowe przełączniki i multipleksery z interfejsem SPI

    Nowa generacja przełączników z interfejsem SPI, jaka pojawiła się w ofercie firmy Analog Devices, pozwala na istotne oszczędzanie na wielkości układu i redukcję poziomu jego skomplikowania – wszystko to bez poświęcania poziomu precyzji sygnałów analogowych. W tej części artykułu prześledzimy na przykładach, jak wyposażone w interfejs SPI przełączniki i multipleksery mogą przyczynić się do uproszczenia projektu całego systemu.

    Układ ASG1412 to poczwórny przełącznik SPST (monostabilny, dwupozycyjny), który do kontrolowania potrzebuje czterech linii GPIO – każda linia kontroluje pojedynczy przełącznik i umożliwia jego połączenie i rozłączenie. Na rysunku 9 pokazano połączenia pomiędzy pojedynczym ADG1412 i mikrokontrolerem.

    Wprowadzenie do interfejsu SPI
    Rys.9. Linie GPIO mikrokontrolera jako sygnały kontrolne dla przełączników.


    Wraz ze zwiększaniem się liczby przełączników w systemie, lawinowo rośnie liczba potrzebnych do ich obsłużenia linii GPIO. Na przykład, jeśli konstruujemy aparaturę testową lub pomiarową, często istnieje konieczność komutowania dużej liczby linii analogowych. W systemie, gdzie macierz komutacji ma rozmiar 4 x 4 potrzebne są cztery układy ADG1412, czyli aż 16 linii mikrokontrolera. Istotnie ogranicza to wybór układu, gdyż 16 linii GPIO to już dosyć duża liczba. Na rysunku 10 pokazano uproszczony schemat obrazujący tą sytuację.

    Wprowadzenie do interfejsu SPI
    Rys.10. Liczba linii GPIO mikrokontrolera potrzebna do obsłużenia wielu przełączników bardzo szybko rośnie.


    Jednym z możliwych do wykorzystania podejść, redukujących popyt na linie GPIO w systemie, jest wykorzystanie konwertera szeregowo-równoległego. Układ taki na wejście przyjmuje dane w postaci szeregowej, a na wyjście podaje je w postaci równoległych linii. Tego rodzaju układy często wyposażone są, po stronie szeregowej, w interfejs SPI. Jakkolwiek eleganckie, to takie rozwiązanie ma wadę w postaci konieczności dodania jeszcze jednego układu do systemu.

    Wprowadzenie do interfejsu SPI
    Rys.11. Wiele przełączników sterowanych z wykorzystaniem konwertera interfejsu z szeregowego na równoległy.


    Alternatywnym podejściem jest wykorzystanie przełączników ze zintegrowanym interfejsem SPI. Dzięki nim możemy istotnie zmniejszyć liczbę potrzebnych GPIO – w naszym przypadku z szesnastu linii do siedmiu. Na rysunku 12 pokazano tego rodzaju architekturę, wykorzystującą cztery układy ADG1412.

    Wprowadzenie do interfejsu SPI
    Rys.12. Dedykowane multipleksery z interfejsem SPI pozwalają oszczędzić na liniach GPIO.


    Aby jeszcze bardziej zoptymalizować nasz układ i zmniejszyć ilość potrzebnych linii GPIO procesora, możemy połączyć ze sobą przełączniki w ‘daisy-chain’. W ten sposób konieczne będzie jedynie wykorzystanie czterech linii mikrokontrolera, oczywiście kosztem szybkości transmisji (co w przypadku analogowego multipleksera nie jest w ogóle zauważalną wadą). Tego rodzaju system zaprezentowano na rysunku 13.

    Wprowadzenie do interfejsu SPI
    Rys.13. Dzięki szeregowemu połączeniu linii danych pomiędzy multiplekserami można jeszcze bardziej zoptymalizować wykorzystanie linii GPIO.


    Rysunek 13 pełni tylko rolę uproszczonej demonstracji. Karta katalogowa układu ADGS1412 rekomentuje, aby na pinie SDO dodany był rezystor podciągający ją do zasilania. Więcej informacji znaleźć możemy w dokumentacji tego układu scalonego, gdzie dokładniej opisano, w jaki sposób należy łączyć ze sobą te multipleksery, aby uzyskać połączenie typu ‘daisy-chain’.

    Cztery układy komutujące zostały w powyższym artykule wykorzystane jedynie dla czytelności i przejrzystości. Nic nie stoi na przeszkodzie, aby we własnym systemie zastosować ich odpowiednio więcej. Im więcej takich układów w systemie, tym zysk wynikający ze stosowania interfejsu SPI do ich sterowania jest większy.

    Dzięki zastosowaniu przełączników sterowanych przez SPI można oszczędzić do 20% miejsca na płytce drukowanej w typowej konfiguracji 4 x 8 punktów przełączania, dzięki ośmiu poczwórnym przełącznikom SPST. Więcej informacji zdobyć możemy w artykule Analog Devices, poświęconym multiplekserom w systemach o wysokiej gęstości upakowania.

    Źródło: http://www.analog.com/en/analog-dialogue/articles/introduction-to-spi-interface.html


    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
  • #2 10 Lut 2019 18:57
    fotomh-s
    Poziom 19  

    Jeśli układy nie obsługują daisy chaina i mamy ich wiele, to można wykorzystać np. rejestr przesuwny albo dekoder adresów (albo i to i to jak ktoś się uprze) do sterowania liniami CS. Dzięki temu można przy pomocy kilku linii mikrokontrolera sterować całą masą linii CS. To jako taka ciekawostka, bo nie napisano tutaj o tym, jak zredukować ilość wyprowadzeń potrzebnych do sterowania liniami CS bez daisychain.

  • #3 10 Lut 2019 22:43
    Piottr242
    Poziom 18  

    fotomh-s napisał:
    Jeśli układy nie obsługują daisy chaina i mamy ich wiele to można wykorzystać np. rejestr przesuwny albo dekoder adresów (albo i to i to jak ktoś się uprze) do sterowania liniami CS. Dzięki temu można przy pomocy kilku linii mikrokontrolera sterować całą masą linii CS.

    W najprostszym przypadku czterema liniami mikrokontrolera można sterować 16 układów slave, przy pomocy dekodra 74hc154 i to w prosty sposób bo 74154 wystawia 0 na aktywne wybrane wyjście.

  • #5 11 Lut 2019 14:16
    Janusz_kk
    Poziom 18  

    No właśnie dużo brakuje do wyczerpania tematu.
    Z całym szacunkiem dla ghosta, ale takie artykuły tylko zwiększają
    szum informacyjny a nie dają nic, sory.

    Dodano po 1 [minuty]:

    Bo to już kolejny taki artykuł "zapchaj dziura"
    w sumie nie wiadomo dla kogo adresowany, początkujący
    się niewiele nauczy, a ci co wiedzą, to nawet go nie
    przeczytają.

  • #6 11 Lut 2019 14:56
    ghost666
    Tłumacz Redaktor

    Cóż - po pierwsze, może to dlatego jest "wprowadzenie" :), a po drugie - o zakres materiału winić chyba należy twórców z Analoga, którzy oryginalnie te artykuł stworzyli w takiej formie... Jeżeli SPI interesuje Was tak mocno, to poszukam jakiegoś szerszego opracowania tematu.

  • #8 11 Lut 2019 16:39
    acctr
    Poziom 14  

    Kompendium w formie rozbudowanej tabelki bardzo by się przydało. Taka wiedza na etapie projektowania pozwala uniknąć wtopy, która może poskutkować dodawaniem jeszcze jednego interfejsu, zmianą peryferii, bo np. I²C okaże się za wolna do obsługi wyświetlacza, potencjometru i czujnika temperatury i trzeba dodać SPI, a to wymaga zwiekszenia liczby pinów których już brakuje.

  • #9 11 Lut 2019 17:01
    Janusz_kk
    Poziom 18  

    ghost666 napisał:
    o zakres materiału winić chyba należy twórców z Analoga, którzy oryginalnie te artykuł stworzyli w takiej formie

    Ja Cię rozumiem, że ty tylko tłumaczysz, ale sam widzisz, że te materiały traktują tematy strasznie
    po łepkach, ja bym powiedział nawet, że są reklamami na zasadzie "o popatrzcie jakie fajne układy mamy".
    Aż prosi się, żeby coś dodać od siebie.

  • #10 12 Lut 2019 20:28
    ...KUBA...
    Poziom 21  

    Czy w tabelce "Polaryzacja i faza linii zegarowej" dla dwóch ostatnich przypadków, gdzie 'CPOL' wynosi 1, 'Polaryzacja zegara w stanie Idle' nie powinna być "Logicznie wysoki"??

  • #11 12 Lut 2019 23:10
    ghost666
    Tłumacz Redaktor

    ...KUBA... napisał:
    Czy w tabelce "Polaryzacja i faza linii zegarowej" dla dwóch ostatnich przypadków gdzie 'CPOL' wynosi 1, 'Polaryzacja zegara w stanie Idle' nie powinna być "Logicznie wysoki"??


    Powinno, dziękuję za uwagę - poprawione.