Co to jest 4-przewodowy interfejs spi. Jak pracować z SPI - teoria. Schemat synchronizacji sygnału

Dziś zaczynamy naszą znajomość z oponą SPI (szeregowy interfejs peryferyjny).

Magistrala ta jest bardzo szeroko stosowana w elektronice. Jest bardzo wygodny, ponieważ jest synchroniczny i pełny dupleks, dlatego jest stosowany w wielu obwodach do komunikacji pomiędzy różnymi urządzeniami cyfrowymi - czujnikami, kontrolerami, sterownikami i innymi urządzeniami.

Innym ważnym czynnikiem powodującym potrzebę naszego zapoznania się z nią jest to, że magistrala ta jest zorganizowana sprzętowo w kontrolerach AVR.

Co więcej, czy tego chcemy, czy nie, komunikujemy się z interfejsem SPI od dłuższego czasu, gdy tylko zaczęliśmy po raz pierwszy flashować nasz kontroler, ponieważ jest on flashowany przez ten interfejs.

Dlatego chciałbym bliżej poznać tę oponę.

Otwórzmy dokumentację techniczną kontrolera Atmega8, otwórzmy stronę na której pokazany jest pinout tego kontrolera i zobaczmy, że od pinów 16 do 19 znajdują się piny magistrali SPI

Teraz trochę więcej o tych odkryciach

SS (wybór żetonu)— to jest etap wyboru urządzenia. Jeśli urządzenie podrzędne na tym pinie przejdzie w stan niski, wówczas to urządzenie będzie odpowiadać i wymieniać informacje poprzez magistralę SPI, jeśli jest wysoki to nie.

MOSI (wyjście główne, wejście podrzędne)- To jest pin wyjściowy urządzenia głównego i wejście urządzenia podrzędnego.

MISO (wejście główne, wyjście podrzędne)- wręcz przeciwnie, wyjście slave, wejście master.

SCK— noga synchronizacyjna. Wszystkie urządzenia biorące udział w wymianie informacji na tej magistrali zasilane są impulsami zegarowymi o określonej częstotliwości.

Poniżej schemat implementacji magistrali SPI w kontrolerze Atmega8

Jak w każdym autobusie, istnieje wiele rejestrów przechowujących określone informacje.

Interesuje nas REJESTR SHIFT, za jego pośrednictwem następuje wymiana informacji. Gdy tylko na pinie synchronizacyjnym pojawi się pewne zbocze, malejące lub rosnące, w zależności od ustawień, te rejestry urządzenia slave i master będą wymieniać informacje, i to nie wszystkie informacje, ale tylko jeden bit. Rejestry te przesuną się w lewo, a najbardziej znaczące bity z każdego rejestru przejdą do najmniej znaczących bitów tego samego rejestru powiązanego urządzenia. Oznacza to, że urządzenie podrzędne prześle swój najbardziej znaczący bit przez pin MOSI do lidera, który zapisze go w pustym bicie niższego rzędu z powodu przesunięcia w lewo, a urządzenie podrzędne prześle swój przesunięty bit wyższego rzędu przez MISO przypnij do bitu najniższego rzędu lidera. Tak przebiega wymiana, czyli w 8 pełnych cyklach zegara całkowicie wymienią bajty

Gdy tylko wszystkie 8 bitów jednego bajtu informacji zostanie przesłanych, określony rejestr zasygnalizuje nam to ten proces skończone. A raczej pewien fragment pewnego rejestru.

Również na schemacie blokowym widzimy dzielnik, na którego wejście odbierane są impulsy zegarowe, które następnie podzielone przez określoną wartość przesyłane są łańcuchem na pin SCK i stamtąd podawane są do urządzenia slave na pin to samo imię. Zapewnia to zsynchronizowaną pracę urządzeń. Częstotliwość zegara wybierana jest z najniższej obsługiwanej przez wszystkie urządzenia uczestniczące w giełdzie.

Mówię o liczbie mnogiej, ponieważ w danym obwodzie może znajdować się więcej niż dwa urządzenia. Jak to jest zapewnione, pod warunkiem, że urządzenia nie mają żadnych adresów, teraz ci powiem.

Istnieje kilka sposobów wymiany informacji pomiędzy kilkoma urządzeniami, to znaczy, gdy na jedno urządzenie nadrzędne przypada kilka urządzeń podrzędnych. Przyjrzymy się dwóm najczęstszym z nich.

Pierwsza metoda jest promieniowa (kliknij na obrazek, aby powiększyć obraz)

Tutaj master wysyła dane do konkretnego urządzenia, włączając logiczne 0 na pinie SS. Dzięki tej metodzie możliwe jest wybranie tylko jednego urządzenia, wymaganych będzie również kilka wolnych pinów portów kontrolera.

Jest jeszcze jedna ciekawa metoda - pierścień lub kaskada (kliknij na zdjęcie, aby powiększyć obraz)

Widzimy tutaj, że wszystkie nogi selekcji są równoległe, a wymiana przebiega po okręgu. W ten sposób prędkość maleje ze względu na wzrost koła transmisyjnego, ale nogi lewej burty są zapisywane.

Przeanalizujemy to wszystko bardziej szczegółowo w kolejnych lekcjach, kiedy będziemy wykorzystywać określone urządzenia w naszych projektach.

Cóż, wydaje się, że z obwodami transmisji danych przez magistralę SPI wymyśliliśmy to.

Zastanówmy się teraz, jak kontrolować ten proces na poziomie rejestrów sprzętowych kontrolera AVR.

Rejestry te widzimy na schemacie blokowym powyżej na stronie.

Atmega8 posiada następujące rejestry do obsługi magistrali SPI.

SPDR (rejestr danych SPI)- rejestr danych, na schemacie blokowym jest to BUFOR DANYCH. Do tego rejestru wpiszemy bajt w celu jego późniejszej transmisji do urządzenia podrzędnego i z niego odczytamy bajt informacji, który przyszedł z urządzenia podrzędnego. Nie jest też konieczne, aby nasz kontroler był urządzeniem nadrzędnym. Następnie złożymy obwód dwóch kontrolerów, z których jeden będzie slave. Zatem w tym rejestrze będzie zlokalizowany bajt zarówno do wysyłania, jak i odbierania.

SPCR (rejestr kontrolny SPI)- rejestr kontrolny

Rejestr ten zawiera następujące bity:

SPIE (włączenie przerwania SPI)- bit umożliwiający przerwanie.

SPE (włącz SPI)— bit umożliwiający obsługę magistrali SPI.

DORD (kolejność danych)— bit określający kolejność wysyłania bitów. Jeśli jest ustawiony na 1, to najpierw wysyłany jest bit najmniej znaczący, jeśli jest ustawiony na 0, wysyłany jest bit najbardziej znaczący.

MSTR (wybór urządzenia głównego/podrzędnego)— bit określający urządzenie jako master lub slave. Gdy ten bit jest ustawiony na 1, urządzenie będzie urządzeniem głównym.

CPOL (polaryzacja zegara)— polaryzacja synchronizacji, określa, przy którym zboczu impulsu synchronizującego zostanie zainicjowany stan czuwania

Jeśli ten bit ma wartość 1, to będziemy mieli stan czuwania zboczem narastającym, a jeśli będzie równy 0, to zboczem opadającym.

CPHA (faza zegara)— bit odpowiedzialny za fazę zegara, czyli po której krawędzi bit będzie transmitowany.

Przyjrzyjmy się schematom przesyłania danych w zależności od instalacji CPOL i CPHA

To bardzo interesująca zależność. Czasami czasami widujemy Specyfikacja techniczna dowolnego urządzenia, które może np. pracować w trybie SPI 0:0 i SPI 1:1, to właśnie dotyczy ustawienia tych bitów.

SPR1, SPR0 (wybór częstotliwości zegara SPI)- są to bity odpowiedzialne za wartość dzielnika częstotliwości synchronizacji, z którymi współpracują; SPI2X znajduje się w rejestrze stanu. Jest to również bit kontrolny, ponieważ osiem bitów w rejestrze kontrolnym nie wystarczyło na wszystkie ustawienia, a w rejestrze stanu jest wiele wolnych.

SPSR (rejestr stanu SPI)- rejestr stanu

SPI2X (podwójny bit prędkości SPI)- bit podwajający prędkość, współpracujący z bitami SPR1 i SPR0 rejestru sterującego.

Zobaczmy zależność częstotliwości od tych trzech bitów

SPIF (flaga przerwania SPI)— Flaga przerwania. Czekamy, aż ten bit zostanie ustawiony na jeden. kiedy otrzymamy bajt. Gdy tylko bajt z innego urządzenia pojawi się w całości w naszym buforze, flaga ta zostanie ustawiona. Ta flaga działa tylko wtedy, gdy ustawiony jest bit włączający przerwania, a także włączone są przerwania globalne.

WCOL (Zapisz flagę kolizji)— flaga konfliktu lub kolizji zostanie ustawiona, jeśli podczas przesyłania danych wystąpi konflikt bitów, jeśli podczas przesyłania danych zostanie podjęta próba zapisu do rejestru danych.

Cóż, teraz możemy powiedzieć, że trochę zapoznaliśmy się z interfejsem SPI.

Obejrzyj samouczek wideo(kliknij na zdjęcie)

Wyświetlenia postów: 6294

SPI(Szeregowa magistrala peryferyjna) - protokół szeregowej wymiany urządzeń peryferyjnych. Ten piercing został opracowany przez Motoroli, ale jest obecnie używany przez wielu producentów. Przeznaczony jest do łączenia mikrokontrolerów ze sobą, a także z wszelkiego rodzaju urządzeniami peryferyjnymi: czujnikami, przetwornikami ADC, układami pamięci, zegarami. Ale nadal najczęstsze zastosowanie SPI- To jest zapisanie programu do pamięci mikrokontrolera. W mikrokontrolerach AVR z pomocą SPI można flashować mikrokontroler bez wylutowywania go z płytki, nazywa się to metodą flashowania ISP (w programowaniu systemu). Choć imiona SPI I dostawca usług internetowych bardzo zgodne, nie są tym samym, w SPI AVR-a używana jako warstwa fizyczna dostawca usług internetowych, czyli używane są linie SPI do przesyłania danych, ale sam protokół (poziom oprogramowania) jest inny.

Do transmisji danych do SPI wykorzystywane są trzy linie:

MISO (wejście główne, wyjście podrzędne)– za pośrednictwem tej linii Master (master) odbiera dane od Slave (slave).

MOSI (wyjście główne, wejście podrzędne)– Master wysyła dane do Slave za pośrednictwem tej linii.

SCK (zegar szeregowy)– służy do przesyłania sygnału zegarowego do urządzenia podrzędnego.

Linia jest również używana SS (wybór urządzenia podrzędnego), który definiuje urządzenie, za pomocą którego Gospodarz będzie wymieniać dane.

W związku z tym, że wielu producentów wykorzystuje w swoich urządzeniach SPI, nazwy pinów mogą się nieznacznie różnić. Poniżej znajduje się tabela z alternatywnymi nazwami.


Istnieją dwa rodzaje SPI: sprzętowy i programowy. Podczas wdrażania oprogramowania SPI, musimy ręcznie ustawić sygnał na nogach odpowiedniego MISO, MOSI, SS podczas ciągnięcia SCK. Z implementacją sprzętową SPI przenosimy dane do specjalnego rejestru, a sam mikrokontroler wykonuje opisane powyżej manipulacje, zgodnie ze wstępnymi ustawieniami.

Realizacja fizyczna SPI, reprezentuje dwa połączone ze sobą rejestry przesuwne.


W zależności od poziomu sygnału logicznego SCK, następuje synchronizacja Gospodarz I Niewolnik i na którym froncie dane są przechwytywane i przesuwane, możliwe są 4 tryby SPI.

  • CPOL = 0 – sygnał synchronizacji zaczyna się od niskiego poziomu;
  • CPOL = 1 – sygnał synchronizacji zaczyna się od wysokiego poziomu;
  • CPHA = 0 – dane są próbkowane na zboczu narastającym sygnału synchronizacji;
  • CPHA = 1 – dane są próbkowane na zboczu opadającym sygnału synchronizacji.
Poniższe oscylogramy pokazują jak wygląda paczka 0x17 w różnych trybach.
CPOL = 0 CPHA = 0


CPOL = 1 CPHA = 0


CPOL = 0 CPHA = 1


CPOL = 1 CPHA = 1

SPI- interfejs synchroniczny, czyli w celu odbioru niektórych danych Niewolnik, Gospodarz powinien coś wysłać. Wszystko wydaje się jasne, ale co jeśli Gospodarz wysyła jeden bajt i Niewolnik mam mu oddać dwa? W takim przypadku Master powinien wysłać mu coś 2 razy, np. 0x00.
//wyślij polecenie, odpowiedź powinna mieć dwa bajty Spi_Master_Transmit(chx); //wyślij coś, aby otrzymać pierwszy bajt Spi_Master_Transmit(0X00); dotykowy_x = SPDR; dotyk_x<<= 8; //отправляем что-нибудь для того чтобы принять второй байт Spi_Master_Transmit(0X00); touch_x |= SPDR; touch_x >>= 3;
To wszystko, powyższy przykład kodu pochodzi z działającego projektu.

Szeregowy interfejs peryferyjny Lub SPI- szeregowy interfejs peryferyjny, służący do komunikacji pomiędzy urządzeniami peryferyjnymi a mikrokontrolerem. Urządzeniem peryferyjnym może być na przykład: wyświetlacz, różne czujniki, pamięć FLASH, karta SD (tak, tak, karta SD lub „pendrive”, którego używasz w telefonach i aparatach komunikuje się z świat zewnętrzny za pomocą interfejsu SPI) itp.

Niestety nie ma oficjalnej dokumentacji interfejsu SPI, dlatego ten post powstał w oparciu o różne artykuły w Internecie, moje własne doświadczenia oraz dokumentację dotyczącą mikrokontrolerów.

O tym, czym jest SPI, przeczytaj w artykułach Wikipedii

W SPI Zawsze jest jeden mistrz i jeden/kilku niewolników.

Przesyłanie danych jest zawsze inicjowane przez master.

SPI wykorzystuje cztery linie komunikacyjne:

  • MOSI Lub SI.- wyjście master, wejście slave (angielski) GospodarzNa zewnątrzNiewolnikW). Służy do przesyłania danych z urządzenia master do urządzenia slave.
  • MISO Lub WIĘC- wejście master, wyjście slave (angielski) GospodarzWNiewolnikNa zewnątrz). Służy do przesyłania danych z urządzenia podrzędnego do urządzenia nadrzędnego.
  • SCLK Lub SCK- sygnał zegara szeregowego SeryjnyZegar). Służy do transmisji sygnału zegarowego dla urządzeń podrzędnych.
  • CS Lub SS- wybór mikroukładu, wybór urządzenia podrzędnego (ang. Wybór chipa, wybór urządzenia podrzędnego).

P.S. Aby zapewnić jednokierunkową komunikację z jednym urządzeniem, wystarczy skorzystać SCLK, MOSI(w przypadku, gdy urządzenie podrzędne tylko odbiera) lub SCLK, MISO(w przypadku, gdy urządzenie slave nic nie odbiera, a jedynie przesyła informacje). Przy wejściu CS urządzenie podrzędne musi być ustawione na logiczne zero, w przeciwnym razie niewolnik nie będzie działał.

P.S. Jeśli urządzenie podrzędne nadaje i odbiera, możesz ograniczyć się do trzech przewodów - MISO, MOSI, SCLK, przy wejściu CS urządzenie podrzędne również musi ustawić wartość logiczną zero.

SPI można zaimplementować w mikrokontrolerze sprzęt komputerowy, wówczas zadanie zarządzania interfejsem rozwiązuje się dla każdego mikrokontrolera osobno, ponieważ wdrożenia mogą się różnić. Na przykład dla ATmega328Р(mikrokontroler firmy Atmel) podczas pracy z SPI musimy go programowo zainstalować SS logiczny zero Na rozpoczęcie odbioru/nadawania i ustaw logicznie jednostka Wracając koniec transmisji.

Aby przesłać dane na urządzenie podrzędne, musisz to zrobić rejestr przesuwny MASTER (na obrazku rejestr przesuwny mastera to „ 8-BITOWY REJESTR PRZESUNIĘTY") zanotować bajt przesyłanej informacji. Jednocześnie automatycznie SCK zacznie generować sygnał zegara. To jest implementacja sprzętowa.

Jeśli w mikrokontrolerze nie ma sprzętowej obsługi SPI, to interfejs SPI zawsze można zaimplementować w oprogramowaniu, tj. tworzyć program sterujący odnogami sterownika zgodnie z protokołem wymiany SP.

Różnice w implementacjach interfejsu SPI

Mikroukłady slave mogą inaczej „interpretować” odbierany sygnał przez SPI, różnica może polegać na następujących punktach:

  • w ilości przesyłanych danych Lub wielkość paczki, zwykle to 8 bitowy, ale jest tego więcej
  • w kolejności bitowej, na początku Najbardziej znaczący bit lub pierwszy najmniej znaczący bit
  • Przez do jakiego poziomu sygnału zegarowego przesyłane są dane?(według jednostki logicznej (WYSOKA) lub zera logicznego (NISKA))
  • Przez do którego zbocza impulsu następuje synchronizacja?(wznoszenie się lub opadanie), w skrócie nazywana „fazą synchronizacji”

Kombinacja " poziom sygnału zegara" I " fazy synchronizacji» jest zdefiniowany w specyfikacjach jako Tryby pracy SPI. Są tylko 4:

Tryb Siła sygnału (CPOL) Faza (CPHA)
0 0 0
1 0 1
2 1 0
3 1 1

W kolumnie „ Poziom sygnału» 1, Oznacza to, że bit danych, przyjęty niewolnik kiedy zero jest przesyłane wzdłuż linii synchronizacji inaczej mówiąc – urządzenie podrzędne czeka i nie przyjmuje danych, gdy jest włączone SCK ustawione na logiczną 1.

W kolumnie „ Faza» 1, oznacza, że ​​sygnał synchronizacji jest wyznaczany przez opadające zbocze impulsu zegarowego i logiczne 0-l Przez zbocze narastające impulsu zegarowego.

P.S. Ponadto, jeśli w kolumnie „ Poziom sygnału» zainstalowany 1, wówczas front opadający i wznoszący się, jeśli jest przedstawiony na schemacie, będzie „ do góry nogami».

Na wykresach, danych 4 tryby można przedstawić następująco:

Więcej o zasadach działania SPI przeczytasz w artykule

http://www.kit-e.ru/articles/interface/2009_03_53.php

Implementacja SPI na mikrokontrolerach ATmega serii AVR (ATmega328P) i „wczesnych” mikrokontrolerach Motoroli

W mikrokontrolerze ATmega328P(mikrokontroler z serii Atmel AVR) możesz sterować następującymi elementami parametry SPI:

Do konfiguracji i sterowania interfejsem SPI służą trzy rejestry:

  • Rejestr kontrolny - SPCR
  • Rejestr stanu - SPSR
  • Rejestr danych - SPDR

Przeczytaj więcej o każdym z nich...

Rejestr kontrolny – « SPCR» 0x2C, adres do nagrywania 0x4C

— Jednostka logiczna w 7. bit(nazwa bitowa SZPIEG) – włączyć przerwania SPI(przerwanie nastąpi, jeśli ustawiony jest bit włączający przerwanie rejestru globalnego SREG(7-ty bit)). Po zakończeniu przesyłania bajtów zostanie wygenerowane przerwanie.

— Jednostka logiczna w 6-ty bit(nazwa bitowa - SPE) - podłączyć SS, MOSI, MISO I SCK do portów mikrokontrolera ATmega328P - PB2, PB3, PB4, PB5.

— Jednostka logiczna w 5-ty bit(nazwa bitowa DORD) – ustali to wg SPI przesłane jako pierwsze stopień juniorski, A wtedy najstarszy– Tryb „LSB”. Natomiast zero logiczne oznacza, że ​​najpierw przesyłany jest bit najbardziej znaczący, a następnie bit najmniej znaczący - tryb „MSB”.

— Jednostka logiczna w 4. bit(nazwa bitowa - MSTR) — włączyć tryb hosta, zero – włącz tryb slave

— Jednostka logiczna w Trzeci bit(nazwa bitowa CPOL) (polaryzacja sygnału synchronizacji lub poziom synchronizacji) – synchronizacja odbywa się wg brak impulsu(zero logiczne) lub sygnał zegara w stanie czuwania jest równy 1. Zero logiczne - synchronizacja odbywa się poprzez obecność impulsu (logicznego) lub sygnał zegara w stanie czuwania jest równy 0. Określa się, wzdłuż którego frontu (spadek lub wzrost) przeprowadzana jest synchronizacja 2 fragment ( CPHA).

— Jednostka logiczna w 2. bit(nazwa bitowa CPHA) (faza synchronizacji) – określa sygnał synchronizacji określane przez opadające zbocze SCK i zero logiczne na zboczu narastającym SCK. Co więcej, jeśli CPOL jest ustawiony na 1, wówczas opadające i wznoszące się fronty można przedstawić na diagramie „do góry nogami”.

1 I 0 kawałek z kawałkiem SPI2x w rejestrze SPSR określić Szybkość transmisji danych SPI(lub prędkość zegara przez SCK). Te bity mają znaczenie tylko dla mastera, dla slave'a są bez znaczenia, ponieważ Szybkość odbioru zależy od częstotliwości SCK urządzenia głównego.

Gdzie fos częstotliwość zegara głównego oscylatora SPI (zwykle jest równa częstotliwości zegara procesora).

Rejestr Stanowy - „SPSR”(adres w ATmega328P do odczytu 0x2D, adres do nagrywania 0x4D, jeśli masz inny MK, to adresy znajdziesz w dokumentacji)

7 zarejestruj bit " SPIF": Flaga przerwania SPI

Bit jest ustawiony jednostka, Gdy transfer bajtów dane dot MOSI skończył. Jeżeli w rejestrze SPCR ustawiony jest bit umożliwiający przerwanie SPI (bit SPIE), ustawienie flagi SPIF powoduje wygenerowanie żądania przerwania.

6 zarejestruj bit " WCOL": Napisz flagę COLlision

Fragment napisz konflikt do rejestru SPDR. Bit jest ustawiony jednostka, jeśli w czas transmisji dane działają próba pisania V rejestr danych SPDR.

- Z 5 Przez 1 bit – bity zarezerwowane, ich wartość jest zawsze równa 0

0 fragment " SPI2X": Bit prędkości podwójnego SPI

Fragment " podwójna prędkość transmisja danych" Jeśli bit jest zapisany jednostka, To prędkość transfery dane podwoiły się. Używając kombinacji tego bitu i 1 I 0 fragment ( SPR1, SPR0) rejestr SPCR, określić prędkość transmisji Dane SPI. .

Rejestr Danych - "SPDR"(adres w ATmega328P do odczytu 0x2E, adres do nagrywania 0x4E, jeśli masz inny MK, to adresy znajdziesz w dokumentacji)

Rozmiar rejestru jest taki sam jak powyżej - 8 bitowy. Rejestr ten służy do transmisji i odczytu danych poprzez SPI. Umieszczając w nim dane, rozpoczynasz proces transferu.

Przyjrzyjmy się 3 przykładom pracy z interfejsem SPI na ATmega328P w środowiskach:

- Arduino

#włączać bajt x=B11000000; //przesłany bajt bitowy y= B00000000; //bit odbiorczy zostanie zapisany do zmiennej y void setup() ( SPI.begin(); /* inicjalizacja SPI */ /* inicjalizacja w Arduino oznacza to - ustaw jeden w SS - ustaw na wyjście SS (Slave Select lub wybór slave) - 10 pinów - ustaw 1 w następujących bitach rejestru sterującego SPCR: w 4-tym bicie (nazwa bitu - MSTR) - włącz tryb master w 6-tym bicie (nazwa bitu - SPE) - podłącz SS, MOSI, MISO i SCK do portów PB4,PB5,PB6,PB7 (10,11,12,13 pinów w Arduino) - skonfiguruj następujące piny wyjściowe: SCK (zegar szeregowy lub sygnał zegara) - 13 pin MOSI (Master Out Slave In lub dane z master) - 11 pin W wyniku inicjalizacji poprzez SPI.begin() konfiguracja interfejsu SPI wygląda następująco: - kolejność bitów „MSB”, czyli najpierw przesyłany jest bit najbardziej znaczący, a następnie najmniej znaczący - synchronizacja odbywa się poprzez obecność impulsu lub sygnału zegarowego w stanie oczekiwania wynosi 0 - sygnał synchronizacji wyznaczany jest przez narastające zbocze SCK (dwa punkty powyżej wskazują, że tryb SPI w tym przypadku wynosi 0 ) - prędkość transmisji fosc/4 */ // MOŻEMY SAMI PONOWNIE INICJALIZOWAĆ NIEKTÓRE PARAMETRY KOMUNIKACJI SPI // uporządkować sekwencje bitów //SPI.setBitOrder(MSBFIRST); /* LSBFIRST - najpierw junior, potem senior MSBFIRST - najpierw senior, potem junior (wartość domyślna z SPI.begin) */ // częstotliwość wymiany danych //SPI.setClockDivider(SPI_CLOCK_DIV4); /* definiuje się jako stosunek fosc do współczynnika, którego możliwe wartości to: SPI_CLOCK_DIV2 SPI_CLOCK_DIV4 SPI_CLOCK_DIV8 SPI_CLOCK_DIV16 SPI_CLOCK_DIV32 SPI_CLOCK_DIV64 SPI_CLOCK_DIV128 */ //Tryb pracy SPI //SPI.setDataMode(SPI_MODE0); /* SPI_MODE0 - tryb zerowy SPI_MODE1 - tryb pierwszy SPI_MODE2 - tryb drugi SPI_MODE3 - tryb trzeci */ ) void pętli() ( /* IMPLEMENTACJA TRANSFERU DANYCH PRZEZ SPI */ digitalWrite(10, HIGH); /* musimy ustawić robimy to sami w SS 1-tsu */ y=SPI.transfer(x); /* przesyłamy bit po bicie argumentu (bajt) i odbieramy odpowiedź od urządzenia slave, transfer odbywa się poprzez przypisanie wartości bajtu do rejestru SPDR i w tym momencie automatycznie do SCK (13 pin) generowany jest sygnał zegarowy */ digitalWrite(10, LOW); /* musimy ustawić SS na 0 */ SPI.end(); magistralę SPI z pinów 10,11,12,13 */ /* Czyli ustawia 0 na 6 bit (SPE) rejestru SPCR */ )

#włączać

bajt x = B11000000 ; //przesłany bit

bajt y = B00000000 ; //bit odbierający zostanie zapisany do zmiennej y

unieważnij konfigurację() (

SPI. zaczynać(); /* Inicjalizacja SPI */

/* oznacza to inicjalizację w Arduino

Ustaw jednostkę na SS

Ustaw na wyjście SS (wybór urządzenia podrzędnego lub wybór urządzenia podrzędnego) – 10 pinów

Ustaw następujące bity rejestru sterującego SPCR na 1:

W czwartym bicie (nazwa bitu - MSTR) - włącz tryb master

B 6-ty bit (nazwa bitu - SPE) - połącz

SS, MOSI, MISO i SCK

Do portów PB4, PB5, PB6, PB7

(10,11,12,13 pinów w Arduino)

Skonfiguruj następujące piny wyjściowe:

SCK (zegar szeregowy lub sygnał zegara) - 13 pinów

MOSI (Master Out Slave In lub dane z mastera) – 11 pinów

W wyniku inicjalizacji poprzez SPI.begin()

Nasza konfiguracja interfejsu SPI wygląda następująco:

Kolejność bitów to „MSB”, tj. Najpierw przesyłany jest bit najbardziej znaczący, a następnie bit najmniej znaczący

Synchronizacja opiera się na obecności impulsu

Lub sygnał zegara w stanie spoczynku wynosi 0

Sygnał synchronizacji jest wyznaczany przez narastające zbocze SCK

(dwa punkty powyżej wskazują, że tryb SPI w tym przypadku wynosi 0)

Szybkość transmisji fosc/4

// MOŻEMY SAM ZAINICJALIZOWAĆ NIEKTÓRE PARAMETRY KOMUNIKACJI SPI

// kolejność bitów

//SPI.setBitOrder(MSBFIRST);

// częstotliwość wymiany danych

//SPI.setClockDivider(SPI_CLOCK_DIV4);

/* zdefiniowany jako relacja

Fosc do współczynnika, którego możliwe wartości to:

SPI_CLOCK_DIV2

SPI_CLOCK_DIV4

SPI_CLOCK_DIV8

SPI_CLOCK_DIV16

SPI_CLOCK_DIV32

SPI_CLOCK_DIV64

SPI_CLOCK_DIV128

//Tryb pracy SPI

//SPI.setDataMode(SPI_MODE0);

SPI_MODE0 - tryb zerowy

SPI_MODE1 - tryb pierwszy

SPI_MODE2 - drugi tryb

SPI_MODE3 - trzeci tryb

pusta pętla()

/* REALIZACJA TRANSMISJI DANYCH POPRZEZ SPI */

digitalWrite(10, WYSOKI); /* musimy sami zainstalować 1-tsu w SS */

y = SPI. przelew(x); /* przesyłanie argumentu bitowego (bajt) i odbieranie odpowiedzi od urządzenia podrzędnego

Transfer odbywa się poprzez przypisanie rejestrowi SPDR wartości bajtu

I w tym momencie automatycznie na SCK (13 pinów)

Generowany jest sygnał zegarowy */

digitalWrite(10, NISKI); /* musimy ustawić SS na 0 */

SPI. koniec(); /* wyłącza magistralę SPI z pinów 10,11,12,13 */

/* To jest ustawia 0 na bit 6 (SPE) rejestru SPCR */

-Atmel Studio (AVR GCC)

#włączać #włączać void init_spi() ( DDRB=(1<

#włączać

#włączać

unieważnij init_spi() (

DDRB = (1<< PB0 ) | (1 << PB1 ) | (1 << PB2 ) | (0 << PB3 ) ;

//konfiguracja pinów dla SPI (SS, SCK, MOSI - wyjście, wejście MOSI)

// Inicjalizacja SPI

// Typ SPI: Master

// Częstotliwość zegara SPI: 2000 000 kHz

// Faza zegara SPI: początek cyklu

// Polaryzacja zegara SPI: niska

// Kolejność danych SPI: najpierw MSB

SPCR = (0<< SPIE ) | (1 << SPE ) | (0 << DORD ) | (1 << MSTR ) | (0 << CPOL ) | (0 << CPHA ) | (1 << SPR1 ) | (1 << SPR0 ) ;

Interfejsy transferu.

Opracowano wiele interfejsów przesyłania danych do przesyłania danych z jednego urządzenia do drugiego lub z jednego układu do drugiego. Każdy interfejs ma zarówno pozytywne, jak i negatywne strony, dlatego trzeba wiedzieć, jakie interfejsy istnieją, ich zalety i wady i zastosować odpowiedni interfejs do przesyłania danych w danej sytuacji.

Interfejsy obsługują asynchroniczny i synchroniczny transfer danych. W przypadku synchronicznej transmisji danych sygnał zegara jest przesyłany jednocześnie z danymi, umożliwiając synchronizację odbiornika i nadajnika. Przykładem takiego protokołu jest interfejs SPI.

W asynchronicznej transmisji danych nie ma sygnału zegarowego. W takich liniach istnieje niebezpieczeństwo niedopasowania odbiornika i nadajnika, w wyniku czego dalsze dane nie będą odbierane poprawnie. Aby temu zapobiec, interfejsy asynchroniczne wykonują okresową synchronizację wzdłuż linii danych. Zaletą takich interfejsów jest mniejsza liczba przewodów potrzebnych do transmisji.

Przyjrzyjmy się bliżej kilku najpopularniejszym interfejsom.

Interfejs USART.

Interfejs USART jest szeregowym uniwersalnym transceiverem synchroniczno-asynchronicznym. Dane przesyłane są do USART w regularnych odstępach czasu. Ten okres czasu jest określony przez określoną prędkość USART i jest podawany w bodach (dla znaków, które mogą przyjmować tylko wartości równe zero lub jeden, bod jest równoważny bitom na sekundę). Istnieje ogólnie przyjęty zakres standardowych prędkości: 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600 bodów.

Oprócz bitów danych USART automatycznie wstawia do strumienia znaczniki synchronizacji, tzw. bity startu i stopu. Po odebraniu te dodatkowe bity są usuwane. Zwykle bity startu i stopu oddzielają jeden bajt informacji (8 bitów), ale istnieją implementacje USART, które umożliwiają transmisję 5, 6, 7, 8 lub 9 bitów. Bity oddzielone sygnałami startu i stopu stanowią minimum wysyłania. USART umożliwia wstawienie dwóch bitów stopu podczas transmisji, aby zmniejszyć prawdopodobieństwo desynchronizacji odbiornika i nadajnika przy dużym natężeniu ruchu. Odbiornik ignoruje drugi bit stopu, traktując go jako krótką pauzę na linii.

Konwencja jest taka, że ​​stan pasywny (w przypadku braku danych) wejścia i wyjścia USART to logiczna „1”. Bit startu jest zawsze logicznym „0”, zatem odbiornik USART czeka na przejście z „1” na „0” i odlicza od niego odstęp czasu wynoszący połowę czasu trwania bitu (środek transmisji bitu startu). . Jeśli w tym momencie na wejściu nadal znajduje się wartość „0”, wówczas rozpoczyna się proces odbioru paczki minimalnej. W tym celu odbiornik zlicza 9 czasów trwania bitów z rzędu (dla danych 8-bitowych) i w każdym momencie rejestruje stan wejścia. Pierwsze 8 wartości to dane odbierane, ostatnia wartość to wartość testowa (bit stopu). Wartość bitu stopu wynosi zawsze „1”; jeśli rzeczywista odebrana wartość jest inna, USART rejestruje błąd.

Aby utworzyć przedziały czasowe, nadawczy i odbiorczy USART mają źródło dokładnego czasu (taktowanie). Dokładność tego źródła musi być taka, aby suma błędów (odbiornika i nadajnika) przy ustalaniu odstępu czasu od początku impulsu startowego do środka impulsu zatrzymującego nie przekraczała połowy (lub jeszcze lepiej, co najmniej ćwierć) interwału bitowego. Dla komunikatu 8-bitowego 0,5/9,5 = 5% (w rzeczywistości nie więcej niż 3%). Ponieważ jest to suma błędów odbiornika i nadajnika oraz możliwych zniekształceń sygnału na linii, zalecana tolerancja dokładności taktowania USART nie przekracza 1,5%.

Ponieważ bity zegara zajmują część strumienia bitów, wynikająca z tego przepustowość UART nie jest równa szybkości połączenia. Na przykład dla transmisji w formacie 8-bitowym 8-N-1 bity zegara zajmują 20% strumienia, co przy fizycznej prędkości 115 200 bodów daje przepływność danych 92 160 bps lub 11 520 bajtów/s.

Test zgodności

Protokół USART ma możliwość automatycznego monitorowania integralności danych przy użyciu metody parzystości bitów. Gdy ta funkcja jest włączona, ostatni bit danych („bit parzystości”) ma zawsze wartość 1 lub 0, więc liczba jedynek w bajcie jest zawsze parzysta.

Kontrola przepływu

W dawnych czasach urządzenia USART mogły działać tak wolno, że nie nadążały za przychodzącym strumieniem danych. Aby rozwiązać ten problem, moduły USART wyposażono w oddzielne wyjścia i wejścia sterujące przepływem. Gdy bufor wejściowy był pełny, logika odbierającego USART ustawiała poziom blokowania na odpowiednim wyjściu, a nadawczy USART zawieszał transmisję. Później kontrolę przepływu przypisano protokołom komunikacyjnym i stopniowo zanikała potrzeba stosowania oddzielnych linii kontroli przepływu.

Realizacja fizyczna.

USART jest protokołem wymiany, tj. określa sposób tworzenia bitów, parametry transmisji bajtów, prędkość transmisji itp.

Ale fizyczna implementacja USART może być inna. Na przykład, aby przesyłać dane w ramach jednej karty, sygnały są przesyłane na poziomie +5 V i 0 V. Do przesyłania danych na duże odległości i pomiędzy urządzeniami stosowane są inne fizyczne poziomy napięć i standardy, takie jak: pętla prądowa (4-20 mA), RS-232 (port COM), RS-485 i tym podobne.

Aby przekonwertować poziomy „kontrolera” 0-5 V na poziomy „standardowe”, istnieje ogromna liczba wyspecjalizowanych mikroukładów, na przykład ADM202 dla RS-232.

Interfejs szeregowy SPI

Nazwa SPI to skrót od „Serial Peripheral Bus”, co odzwierciedla jego przeznaczenie – magistralę do podłączania urządzeń zewnętrznych. Magistrala SPI zorganizowana jest w oparciu o zasadę master-slave. Nadrzędnym magistralą jest zwykle mikrokontroler, ale może to być również programowalna logika, kontroler DSP lub układ ASIC. Urządzenia podłączone do mastera są urządzeniami slave. Ich rolę pełnią różnego rodzaju mikroukłady, m.in. urządzenia pamięci masowej (EEPROM, pamięć Flash, SRAM), zegar czasu rzeczywistego (RTC), przetworniki ADC/DAC, potencjometry cyfrowe, specjalistyczne sterowniki itp.

Głównym elementem interfejsu SPI jest konwencjonalny rejestr przesuwny, którego synchronizacja i sygnały wejściowe/wyjściowe strumienia bitów tworzą sygnały interfejsu. Zatem protokół SPI jest bardziej poprawnie nazywany nie protokołem przesyłania danych, ale protokołem wymiany danych między dwoma rejestrami przesuwnymi, z których każdy pełni jednocześnie funkcję odbiornika i nadajnika. Warunkiem transmisji danych na magistrali SPI jest wygenerowanie sygnału synchronizacji magistrali. Tylko przywódca ma prawo generować ten sygnał i od tego całkowicie zależy praca niewolnika.

Połączenie.

Istnieją trzy rodzaje podłączenia do magistrali SPI, z których każde obejmuje cztery sygnały. Przeznaczenie sygnałów SPI opisano w tabeli 7.1.

Najprostsze połączenie, które obejmuje tylko dwa mikroukłady, pokazano na rysunku 7.2. Tutaj master magistrali przesyła dane wzdłuż linii MOSI synchronicznie z generowanym przez niego sygnałem SCLK, a slave przechwytuje przesyłane bity danych na pewnych zboczach odebranego sygnału synchronizacji. W tym samym czasie urządzenie podrzędne wysyła swój pakiet danych. Przedstawiony układ można uprościć eliminując linię MISO w przypadku, gdy zastosowany układ scalony typu slave nie zapewnia transmisji danych odpowiedzi lub nie ma takiej potrzeby. Jednokierunkowy transfer danych można spotkać w takich układach jak przetworniki cyfrowo-analogowe, potencjometry cyfrowe, wzmacniacze programowalne i sterowniki. Zatem rozważana opcja podłączenia podrzędnego układu scalonego wymaga 3 lub 4 linii komunikacyjnych.

Aby układ scalony podrzędny mógł odbierać i przesyłać dane, oprócz sygnału zegarowego, linia SS musi być również ustawiona na niski poziom. W przeciwnym razie układ scalony slave będzie nieaktywny. Gdy używany jest tylko jeden zewnętrzny układ scalony, kuszące może być wyeliminowanie linii SS poprzez ustawienie wejścia wyboru układu scalonego podrzędnego na niski poziom. Rozwiązanie to jest skrajnie niepożądane i może prowadzić do awarii lub wręcz niemożności przesłania danych, gdyż Wejście wyboru chipa służy do resetowania układu scalonego do stanu początkowego i czasami inicjuje wysyłanie pierwszego bitu danych.

Jeśli konieczne jest podłączenie kilku mikroukładów do magistrali SPI, stosuje się połączenie niezależne (równoległe) (ryc. 7.3) lub połączenie kaskadowe (szeregowe) (ryc. 7.4). Niezależne połączenie jest bardziej powszechne, ponieważ osiągnąć przy użyciu dowolnych chipów kompatybilnych z SPI. Tutaj wszystkie sygnały, z wyjątkiem wyboru mikroukładów, są połączone równolegle, a master magistrali, przesyłając jeden lub drugi sygnał SS do stanu niskiego, określa, z którym podrzędnym układem scalonym będzie wymieniał dane. Główną wadą tego połączenia jest konieczność stosowania dodatkowych linii do adresowania układów podrzędnych (całkowita liczba linii komunikacyjnych wynosi 3+n, gdzie n jest liczbą układów podrzędnych).

Jeśli nie ma wystarczającej liczby nóg mikrokontrolera, możesz użyć układu demultipleksera. Demultiplekser łączy pojedynczy sygnał wejściowy z jednym z sygnałów wyjściowych, w zależności od kodu na pinach sterujących. Rysunek 7.4 przedstawia schemat podłączenia demultipleksera. Na jego wejście podawany jest sygnał SS, który przyjmuje wartość równą 0 w przypadku konieczności wybrania jednego z mikroukładów. Numer wymaganego mikroukładu w kodzie binarnym jest dostarczany do nóg Am-A0. Pozwala to zredukować liczbę odnóg zastosowanych w mikrokontrolerze do m=log 2 n. Gdzie n jest liczbą chipów podrzędnych. Te. do podłączenia 128 urządzeń potrzeba 8 pinów mikrokontrolera. Jeden do ustawienia sygnału włączającego i 7 do ustawienia numeru chipa, który ma zostać włączony. Należy zaznaczyć, że na niepołączonych odnogach demultipleksera musi znajdować się logiczny. W przeciwnym razie używany jest falownik sygnału, przekształcający zero logiczne na logiczne.

Przełączanie kaskadowe jest wolne od tej wady, ponieważ tutaj kilka chipów tworzy jeden duży rejestr przesuwny. W tym celu wyjście transmisji danych jednego układu scalonego jest połączone z wejściem odbioru danych drugiego, jak pokazano na rysunku 3. Wejścia wyboru chipa są tutaj połączone równolegle, dzięki czemu całkowita liczba linii komunikacyjnych pozostaje równa do 4. Jednakże zastosowanie połączenia kaskadowego jest możliwe tylko wtedy, gdy jego obsługa jest wskazana w dokumentacji zastosowanych układów. Aby się tego dowiedzieć, warto wiedzieć, że takie połączenie nazywa się po angielsku „daisy-chaining”.

Protokół przekazania

Protokół transmisji przez interfejs SPI jest zasadniczo identyczny z logiką rejestru przesuwnego (rysunek 7.6), która polega na wykonaniu operacji przesunięcia i odpowiednio wejściu i wyjściu bitów danych na określonych zboczach sygnału synchronizacji. Ustawianie danych podczas transmisji i próbkowanie podczas odbioru są zawsze wykonywane na przeciwległych zboczach zegara. Jest to konieczne, aby zapewnić pobranie próbki danych po ich wiarygodnym ustaleniu. Jeżeli weźmiemy pod uwagę, że pierwszym zboczem w cyklu transmisji może być zbocze narastające lub opadające, to możliwe są cztery logiczne opcje działania interfejsu SPI. Opcje te nazywane są trybami SPI i są opisane dwoma parametrami:

· CPOL - początkowy poziom sygnału synchronizacji (jeśli CPOL=0 to linia synchronizacyjna przed rozpoczęciem cyklu transmisji i po jego zakończeniu ma niski poziom (tj. pierwsze zbocze narasta, a ostatnie opada), w przeciwnym przypadku, jeśli CPOL=1, - wysoki (tzn. pierwszy front opada, a ostatni rośnie));

· CPHA – faza synchronizacji; Ten parametr określa kolejność, w jakiej dane są instalowane i pobierane. Jeżeli CPHA=0, to na zboczu narastającym cyklu zegara dane będą próbkowane, a następnie na zboczu opadającym dane zostaną ustawione. Jeżeli CPHA=1 to instalacja danych będzie wykonywana na zboczu narastającym cyklu synchronizacji, a próbkowanie na zboczu opadającym.

Informacje o trybach SPI przedstawiono na rysunkach 7.7 i 7.8.

Układy master i slave pracujące w różnych trybach SPI są niekompatybilne, dlatego przed wyborem chipów slave ważne jest, aby wyjaśnić, które tryby są obsługiwane przez master magistrali. Sprzętowe moduły SPI zintegrowane z mikrokontrolerami w większości przypadków obsługują możliwość wyboru dowolnego trybu, dzięki czemu można do nich podłączyć dowolne układy slave SPI (dotyczy tylko opcji połączenia niezależnego). Ponadto protokół SPI w dowolnym z trybów można łatwo zaimplementować w oprogramowaniu.

Interfejs RS-485

Interfejs RS-485 (inna nazwa to EIA/TIA-485) to jeden z najpopularniejszych standardów warstwy komunikacji fizycznej. Warstwa fizyczna to kanał komunikacyjny i sposób transmisji sygnału (warstwa 1 modelu połączeń systemów otwartych OSI).

Sieć zbudowana na interfejsie RS-485 składa się z transceiverów połączonych skrętką - dwiema skrętkami. Interfejs RS-485 opiera się na zasadzie różnicowej (zrównoważonej) transmisji danych. Jego istotą jest przesyłanie jednego sygnału dwoma przewodami. Co więcej, jeden przewód (warunkowo A) przenosi sygnał oryginalny, a drugi (warunkowo B) przenosi jego odwrotną kopię. Innymi słowy, jeśli na jednym przewodzie znajduje się „1”, to „0” na drugim i odwrotnie. Zatem zawsze istnieje różnica potencjałów między dwoma przewodami skrętki: w „1” jest dodatnia, w „0” jest ujemna (rysunek 7.9).

To właśnie ta różnica potencjałów przesyła sygnał. Ta metoda transmisji zapewnia wysoką odporność na zakłócenia w trybie wspólnym. Zakłócenia w trybie wspólnym to zakłócenia, które w równym stopniu wpływają na oba przewody linii. Na przykład fala elektromagnetyczna przechodząca przez odcinek linii komunikacyjnej indukuje potencjał w obu przewodach. Jeśli sygnał jest przesyłany potencjałem w jednym przewodzie względem masy, jak w przypadku RS-232, wówczas zakłócenia na tym przewodzie mogą zniekształcić sygnał względem masy, która dobrze pochłania zakłócenia. Ponadto różnica potencjałów masy spadnie na rezystancji długiego wspólnego przewodu – dodatkowe źródło zniekształceń. A przy transmisji różnicowej zniekształcenia nie występują. W rzeczywistości, jeśli dwa przewody leżą blisko siebie, a nawet są ze sobą splecione, wówczas odbiór na obu przewodach jest taki sam. Potencjał w obu jednakowo obciążonych przewodach zmienia się jednakowo, natomiast informacyjna różnica potencjałów pozostaje niezmieniona.

Sprzętowa implementacja interfejsu RS485.

Sprzętowa implementacja interfejsu - układy transceiverów z wejściami/wyjściami różnicowymi (do linii) i portami cyfrowymi (do portów UART kontrolera). Istnieją dwie opcje tego interfejsu: RS-422 i RS-485.

RS-422 jest interfejsem w trybie pełnego dupleksu. Odbiór i transmisja odbywają się za pośrednictwem dwóch oddzielnych par przewodów. Na każdej parze przewodów może znajdować się tylko jeden nadajnik.

RS-485 jest interfejsem półdupleksowym. Odbiór i transmisja odbywają się jedną parą przewodów z separacją czasową. W sieci może znajdować się wiele nadajników, ponieważ można je wyłączyć w trybie odbioru (rysunek 7.10).

Objaśnienie symboli na rys. 7.10

D (kierowca) - nadajnik;
R (odbiornik) - odbiornik;
DI (wejście sterownika) - wejście cyfrowe przetwornika;
RO (wyjście odbiornika) - wyjście cyfrowe odbiornika;
DE (włączenie sterownika) - zezwolenie na obsługę nadajnika;
RE (włączenie odbiornika) - zezwolenie na obsługę odbiornika;
A - bezpośrednie wejście/wyjście różnicowe;
B - odwrotne wejście/wyjście różnicowe;
Y - bezpośrednie wyjście różnicowe (RS-422);
Z - odwrotne wyjście różnicowe (RS-422).

Przyjrzyjmy się bliżej transceiverowi RS-485. Wyjście cyfrowe odbiornika (RO) podłączone jest do portu UART odbiornika (RX). Wejście cyfrowe nadajnika (DI) do portu nadajnika UART (TX). Ponieważ odbiornik i nadajnik są połączone po stronie różnicowej, nadajnik musi być wyłączony podczas odbioru, a odbiornik podczas nadawania. W tym celu wykorzystywane są wejścia sterujące – zezwolenie odbiornika (RE) i zezwolenie nadajnika (DE). Ponieważ wejście RE jest odwrotne, można je podłączyć do DE i załączyć odbiornik i nadajnik jednym sygnałem z dowolnego portu sterownika. Na poziomie „0” - praca dla odbioru, na „1” - dla transmisji (ryc. 7.11).

Odbiornik, odbierając różnicę potencjałów (UAB) na wejściach różnicowych (AB), przetwarza je na sygnał cyfrowy na wyjściu RO. Czułość odbiornika może być różna, ale producenci chipów nadawczo-odbiorczych podają w dokumentacji gwarantowany zakres progowy rozpoznawania sygnału. Zazwyczaj te progi wynoszą ±200 mV. Oznacza to, że gdy UAB > +200 mV - odbiornik wykrywa „1” przy UAB< -200 мВ - приемник определяет "0". Если разность потенциалов в линии настолько мала, что не выходит за пороговые значения - правильное распознавание сигнала не гарантируется. Кроме того, в линии могут быть и не синфазные помехи, которые исказят столь слабый сигнал.

Wszystkie urządzenia podłącza się do jednej skrętki komputerowej w ten sam sposób: wyjścia bezpośrednie (A) do jednego przewodu, wyjścia odwrócone (B) do drugiego.

Impedancja wejściowa odbiornika po stronie linii (RAB) wynosi zazwyczaj 12 KΩ. Ponieważ moc nadajnika nie jest nieograniczona, stwarza to ograniczenie liczby odbiorników podłączonych do linii. Zgodnie ze specyfikacją RS-485, po uwzględnieniu rezystorów terminujących, nadajnik może sterować do 32 odbiorników. Istnieje jednak szereg mikroukładów o zwiększonej impedancji wejściowej, co pozwala na podłączenie do linii znacznie więcej niż 32 urządzeń.

Maksymalna prędkość komunikacji zgodnie ze specyfikacją RS-485 może osiągnąć 10 Mbodów/s. Maksymalna odległość wynosi 1200 metrów. W przypadku konieczności zorganizowania komunikacji na odległość większą niż 1200 metrów lub podłączenia większej liczby urządzeń niż pozwala na to obciążalność nadajnika, stosuje się specjalne wzmacniaki.

Interfejs I2C.

Interfejs ten zaproponował firma Philips, która wykorzystała go do organizacji komunikacji pomiędzy chipami w swoich telewizorach. I 2 C (skrót od Inter-Integrated Circuit) to dwukierunkowa asynchroniczna magistrala szeregowa. Fizycznie magistrala I 2 C składa się z dwóch linii sygnałowych, z których jedna (SCL) przeznaczona jest do przesyłania sygnału zegarowego, a druga (SDA) do wymiany danych. Do sterowania liniami stosuje się stopnie wyjściowe z otwartym kolektorem, dlatego linie magistrali należy podłączyć do źródła zasilania +5 V poprzez rezystory o rezystancji 1...10 kOhm, w zależności od fizycznej długości linii i szybkość przesyłania danych. Długość linii łączących w trybie standardowym może sięgać 2 metrów, szybkość przesyłania danych wynosi 100 kbit/s.

Wszyscy abonenci autobusów są podzieleni na dwie klasy - „Lider” i „Niewolnik”. Urządzenie nadrzędne generuje sygnał zegarowy (SCL). Może niezależnie uzyskać dostęp do magistrali i adresować dowolne urządzenie podrzędne w celu przesyłania lub odbierania informacji. Wszystkie urządzenia podrzędne „nasłuchują” magistrali, wykrywają własny adres i po jego rozpoznaniu wykonują określoną operację. Dodatkowo możliwy jest tzw. tryb „MultiMaster”, gdy na magistrali zainstalowanych jest kilka urządzeń master, które albo wspólnie dzielą wspólne urządzenia slave, albo na przemian pełnią funkcję masterów, gdy same inicjują wymianę informacji, lub jako slave, gdy czekają na dostęp z innego urządzenia głównego. Tryb „MultiMaster” wymaga stałego monitorowania i rozpoznawania konfliktów. Pod tym względem tryb ten jest trudniejszy do wdrożenia (czyli implementacji oprogramowania) i w rezultacie jest rzadziej stosowany w rzeczywistych produktach.

W początkowej chwili - w stanie czuwania - obie linie SCL i SDA znajdują się w stanie logicznym (tranzystor stopnia wyjściowego typu otwarty kolektor jest zwarty). W trybie transmisji (rysunek 7.12) bit danych SDA jest taktowany przez narastające zbocze SCL. Informacje na linii SDA ulegają zmianie, gdy linia SCL znajduje się w stanie zerowym. Urządzenie podrzędne może na przykład „utrzymywać” linię SCL w stanie zerowym podczas przetwarzania następnego odebranego bajtu, podczas gdy urządzenie nadrzędne musi poczekać, aż linia SCL zostanie zwolniona, zanim będzie kontynuować transmisję informacji.

Aby zsynchronizować pakiety magistrali I 2 C, rozróżnia się dwa warunki - „START” i „STOP”, ograniczające początek i koniec pakietu informacyjnego (rysunek 7.13). Do zakodowania tych warunków wykorzystuje się zmianę stanu linii SDA pojedynczym stanem linii SCL, co jest niedopuszczalne przy transmisji danych. Stan „START” powstaje, gdy na linii SDA pojawi się zbocze opadające, gdy linia SCL jest w stanie pojedynczym i odwrotnie, stan „STOP” powstaje, gdy na linii SDA pojawi się zbocze narastające, gdy SCL linia jest w jednym stanie.

Transmisja danych rozpoczyna się od pierwszego zbocza narastającego linii SCL, które taktuje najbardziej znaczący bit pierwszego bajtu informacji. Każdy bajt informacji (8 bitów) zawiera 9 okresów zegarowych linii SCL. W dziewiątym cyklu urządzenie odbiorcze wysyła potwierdzenie (ACK) – opadające zbocze sygnalizujące odbiór danych. Należy zauważyć, że każdy abonent magistrali, zarówno master, jak i slave, może w różnych momentach być zarówno nadajnikiem, jak i odbiornikiem i zgodnie z trybem ma obowiązek odebrać lub wysłać sygnał ACK, którego brak jest interpretowany jako błąd.

Aby rozpocząć operację wymiany danych, urządzenie nadrzędne wystawia na magistrali warunek „START”. Po warunku „START” następuje bajt z adresem urządzenia podrzędnego (rysunek 7.14), składający się z siedmiobitowego adresu urządzenia (bity 1...7) i jednobitowej flagi operacji odczytu i zapisu - „ R/W” (bit 0). Bit R/W określa kierunek wymiany, gdzie 0 oznacza przesyłanie danych z urządzenia master do urządzenia slave (rysunek 7.14a), a 1 oznacza odczyt z urządzenia slave (rysunek 7.14b). Wszystkie bity na magistrali I 2 C są przesyłane w kolejności od najwyższej do najniższej, to znaczy 7. bit jest przesyłany jako pierwszy, 0 jako ostatni. Po adresie może następować jeden lub więcej bajtów informacyjnych (w kierunku określonym przez flagę R/W), których bity są taktowane przez master na szynie SCL.

Podczas wykonywania operacji odczytu host musi potwierdzić odczytany bajt, jeśli chce przeczytać następny bajt, i nie wysyłać potwierdzenia, jeśli ma wkrótce zakończyć odczytywanie pakietu (patrz rysunek 7.14b).

Dopuszcza się wielokrotne wznawianie adresu urządzenia podrzędnego w jednym cyklu transmisji, czyli przesłanie powtarzającego się warunku „START” bez wcześniejszego warunku „STOP” (rysunek 7.14c).

Należy zwrócić uwagę na niektóre cechy układów pamięci pracujących poprzez interfejs I 2 C oraz procedury wymiany z nimi danych. Po pierwsze, nieulotna pamięć danych tych mikroukładów jest podzielona na strony pamięci, więc po zapisaniu bajtu cała strona jest najpierw kopiowana do wewnętrznej pamięci RAM mikroukładu, gdzie zmieniana jest żądana komórka. Następnie stara strona jest usuwana, a na jej miejscu zapisywana jest nowa. Inną cechą jest to, że cztery najbardziej znaczące bity adresu urządzenia podrzędnego muszą zawsze mieć wartość 1010. Wymóg ten reguluje sama firma Philips.

Magistrala 1-Wire wykorzystuje tylko jeden przewód do komunikacji i zasilania. Tryb komunikacji jest asynchroniczny i półdupleksowy, ściśle zgodny ze wzorem master-slave. Do tej samej magistrali można jednocześnie podłączyć jedno lub więcej urządzeń podrzędnych. Do jednej magistrali można podłączyć tylko jedno urządzenie nadrzędne.

Stan jałowy magistrali odpowiada wysokiemu poziomowi, który jest generowany przez rezystor podciągający. Wartość rezystora podciągającego podana jest w dokumentacji układu scalonego podrzędnego. Wszystkie chipy podłączone do magistrali muszą być w stanie generować niski poziom. Jeżeli wyjście mikrokontrolera nie obsługuje trzech stanów, wówczas należy zapewnić sterownik posiadający wyjście typu otwarty kolektor lub otwarty dren

Transmisja sygnału magistralą 1-Wire jest podzielona na przedziały czasowe o czasie trwania 60 µs. W każdym przedziale czasowym przesyłany jest tylko jeden bit danych. Urządzenia Slave mogą wykazywać znaczne różnice w stosunku do znamionowych opóźnień czasowych. Wymaga to jednak dokładniejszego wyczucia czasu przez lidera, aby zapewnić prawidłową komunikację z podwładnymi, którzy mają różne podstawy czasu.

Podstawowe sygnały autobusowe.

Master inicjuje każdą komunikację na poziomie bitu. Oznacza to, że transmisja każdego bitu, niezależnie od kierunku, musi być inicjowana przez urządzenie master. Osiąga się to poprzez ustawienie magistrali na niski poziom, co synchronizuje logikę wszystkich pozostałych urządzeń. Istnieje 5 głównych poleceń komunikacji poprzez magistralę 1-Wire: „Zapisz log. 1”, „Zapisz dziennik. 0”, „Odczyt”, „Resetuj” i „Obecność”.

Sygnał „Zapisz dziennik. 1"

Sygnał „Zapisz dziennik. 1” pokazano na ryc. 7.15. Master ustawia niski poziom na 1...15 µs. Następnie zwalnia autobus na pozostałą część przedziału czasowego.

Ryż. 7.15 – Sygnał „Zapisz log. 1"

Sygnał „Zapisz dziennik. 0"

Sygnał „Zapisz dziennik. 0” pokazano na rysunku 7.16. Master generuje niski poziom przez co najmniej 60 µs, ale nie dłużej niż 120 µs.

Rys. 7.16 – Sygnał „Zapisz log. 0"

Przeczytaj sygnał

Sygnał „Odczyt” pokazany jest na rys. 7.17. Master ustawia niski poziom na 1...15 µs. Następnie urządzenie podrzędne utrzymuje magistralę w stanie niskim, jeśli chce przesłać dziennik. 0. Jeśli konieczne jest przesłanie dziennika. 1, to po prostu zwalnia linię. Skanowanie magistrali należy wykonać w ciągu 15 µs od przejścia magistrali w stan niski. Patrząc od strony urządzenia głównego, sygnał „Odczyt” jest w istocie sygnałem „Zapis protokołu”. 1". Rzeczywisty stan wewnętrzny urządzenia podrzędnego zostanie określony na podstawie sygnału „Record log”. 1” lub „Czytanie”.

Rysunek 7.17 – Sygnał „Odczyt”.

Sygnał resetowania/obecności

Sygnały „Reset” i „Obecność” pokazano na rysunku 7.18. Należy pamiętać, że odstępy czasu impulsów są różne. Urządzenie nadrzędne obniża napięcie na 8 przedziałów czasowych (480 µs), a następnie zwalnia magistralę. Ten długi okres niskiego stanu nazywany jest sygnałem „resetu”.

Jeśli na magistrali znajduje się urządzenie podrzędne, musi ono w ciągu 60 µs po zwolnieniu magistrali przez urządzenie nadrzędne ustawić niski poziom na co najmniej 60 µs. Ta reakcja nazywa się „obecnością”. Jeżeli taki sygnał nie zostanie wykryty, to master musi przyjąć, że do magistrali nie są podłączone żadne urządzenia i dalsza komunikacja nie jest możliwa.

USB (Universal Serial Bus) został opracowany z myślą o szybkim podłączeniu urządzeń zewnętrznych do komputera osobistego, a następnie wyszukaniu i zainstalowaniu niezbędnego oprogramowania. Urządzenia małej mocy są zasilane bezpośrednio przez interfejs.

Standard USB zakłada obecność tylko jednego urządzenia głównego (hosta) w sieci. Co więcej, standard obsługuje do 127 urządzeń podrzędnych w sieci. Aby rozróżnić urządzenia master i slave, opracowano różne typy złączy (rysunek 7.19): typ A dla urządzenia master i typ B dla urządzenia slave. Przyjmuje się, że napięcie 5V występuje tylko na złączu typu A, które jest złączem głównym. Reszta urządzeń zasilana jest bezpośrednio z niego.

Standard USB wykorzystuje 4 ekranowane przewody, z których dwa przesyłają moc (+5 V i GND) (rysunek 7.19 i tabela 7.2). Pozostałe dwa reprezentują sygnały danych różnicowych skrętki. Stosowany schemat kodowania NRZI(Non Return to Zero Invert) do transmisji danych z polem synchronizacyjnym w celu synchronizacji zegarów master i slave.

Standard USB 2.0 wprowadził standard On-The-Go (OTG), który wprowadził protokół negocjacji hosta, który umożliwia dwóm urządzeniom USB uzgodnienie, kto będzie pełnił rolę mastera. Jest to zamierzone i ograniczone do pojedynczych połączeń typu punkt-punkt, takich jak telefon komórkowy z komputerem osobistym.

USB obsługuje połączenie „hot” (plug’n’play) z dynamicznie ładowanymi i wyładowywanymi sterownikami. Użytkownik po prostu podłącza urządzenie, podłączając je tym samym do magistrali. Host wykrywa połączenie, odpytuje nowo podłączone urządzenie i ładuje odpowiedni sterownik, wskazując moment ładowania klepsydrą na ekranie (jeśli sterownik urządzenia USB jest już zainstalowany w systemie). Użytkownikowi końcowemu nie zależy na rozwiązaniu lub Przerwanie(przerwania) i adresy portów, ani o ponownym uruchomieniu komputera (nie jest wymagane ponowne uruchomienie). Gdy użytkownik skończy korzystać z urządzenia USB, po prostu je wyjmie (lub odłączy kabel), host wykryje brak urządzenia i automatycznie wyładuje sterownik.

Wersja SB 1.1 obsługuje dwie prędkości - tryb pełnej prędkości z prędkością 12 Mbit/s oraz tryb niskiej prędkości z prędkością 1,5 Mbit/s. Tryb 1,5 Mbit/s jest wolniejszy i mniej wrażliwy na zakłócenia elektromagnetyczne (EMI), co zmniejsza koszt kulek ferrytowych i zmniejsza wymagania dotyczące jakości komponentów.

Kabel magistrali o pełnej prędkości jest skrętką dwużyłową, chronioną ekranem i może być również używany do pracy z niską prędkością. Kabel do pracy tylko przy minimalnej prędkości (na przykład do podłączenia myszy) może być dowolny i nieekranowany.

Standard USB 2.0 wprowadza tryb High Speed ​​z szybkością przesyłania danych 480 Mbit/s.

Transfer danych.

Wszystkie transfery danych przez interfejs są inicjowane przez hosta. Dane przesyłane są w formie pakietów. Interfejs USB wykorzystuje kilka typów pakietów:

A) podpisz paczkę (pakiet tokenów) opisuje rodzaj i kierunek przesyłania danych, adres urządzenia i numer seryjny punktu końcowego (CT to adresowalna część urządzenia USB); Istnieje kilka typów pakietów funkcji: W, NA ZEWNĄTRZ, SOF, ORGANIZOWAĆ COŚ;

B) pakiet danych (pakiet danych) zawiera przesyłane dane;

B) pakiet homologacyjny (pakiet uścisków dłoni) służy do raportowania wyników transferu danych; Istnieje kilka rodzajów pakietów koordynacyjnych: POTWIERDŹ, NAK, STOISKO.

Przesyłanie danych przez USB odbywa się w następujący sposób:

Pierwszy pakiet, tzw. token, jest generowany przez urządzenie główne w celu opisania rodzaju przesyłanych danych, operacji przesyłania (odczyt lub zapis), adresu urządzenia i punktu końcowego. Następnym zwykle przesyłanym pakietem jest pakiet danych zawierający przydatne informacje, po którym następuje pakiet uzgadniania wskazujący, że dane lub token zostały pomyślnie odebrane lub punkt końcowy jest zablokowany lub niedostępny do przyjęcia danych.

Punkty końcowe w standardzie USB są źródłami i odbiornikami danych. Wszystkie urządzenia muszą obsługiwać punkt końcowy 0. Jest to punkt końcowy, który akceptuje wszystkie żądania kontroli i statusu podczas wyliczania (żądanie obsługi w celu określenia typu podłączonego urządzenia) i tak długo, jak urządzenie działa na magistrali.

Punkty końcowe ponumerowane od 1 służą do przesyłania informacji o użytkowniku. Spójrzmy na kilka przykładów.

Sterownik urządzenia przesyła dane do punktu końcowego urządzenia głównego EP1. Ponieważ To urządzenie jest masterem, wtedy dane trafiają do bufora OUT EP1. W takim przypadku wysyłany jest token OUT, który wskazuje, że dane są gotowe do wysłania. Po otrzymaniu tego tokena urządzenie slave może odczytać dane z bufora OUT.

Jeśli urządzenie podrzędne musi przesłać dane do urządzenia nadrzędnego, umieszcza je w buforze IN. Bufor ten będzie przechowywać dane do czasu, aż urządzenie główne wyśle ​​token IN z żądaniem danych z punktu końcowego. Wszystkie bufory punktów końcowych nazywane są w odniesieniu do wzorca, tj. Bufor wyjściowy urządzenia podrzędnego nazywany jest IN, ponieważ jest to bufor wejściowy dla urządzenia głównego.

Przesyłanie danych z jednego punktu końcowego do drugiego odbywa się za pośrednictwem strumieni. Przepływ – logiczne połączenie między hostem a punktem końcowym.

Strumienie mają również zestaw parametrów, takich jak typ transmisji (sterowanie, zbiorcze, Iso lub przerwanie), kierunek przepływu danych i maksymalne rozmiary pakietów/buforów.

Na przykład strumień domyślny jest strumieniem dwukierunkowym składającym się z punktu końcowego IN 0 i punktu końcowego OUT 0 z kontrolą typu przesyłania.

USB definiuje dwa typy potoków

A) Rury strumieniowe nie mają predefiniowanego formatu USB, więc możesz przesyłać dowolne dane przez potok strumieniowy i odzyskiwać dane na drugim końcu. Strumienie danych są sekwencyjne i mają z góry określony kierunek – IN lub OUT. Potoki strumieniowe obsługują typy transferu masowego, izochronicznego i przerwaniowego. Potokami strumieniowymi można sterować z hosta lub urządzenia.

B) Potoki wiadomości mają predefiniowany format USB. Są kontrolowane przez hosta i inicjowane przez żądanie wysłane od hosta. Dane są wysyłane w żądanym kierunku określonym w żądaniu. Zatem potoki komunikatów umożliwiają przesyłanie danych w obu kierunkach, ale obsługują jedynie transfery kontrolne.

Standard USB opisuje cztery rodzaje przesyłania danych:

A) Przekazywanie kontroli (transfer kontrolny) służy do konfiguracji urządzenia, a także do innych celów specyficznych dla urządzenia.

B) Transmisja strumieniowa (transfer zbiorczy) służy do przesyłania stosunkowo dużej ilości informacji.

B) Przerwij przekazywanie (przerwać transfer) służy do przesyłania stosunkowo niewielkiej ilości informacji, dla której ważne jest jej terminowe przesłanie. Ma ograniczony czas trwania i wyższy priorytet w porównaniu do innych rodzajów przelewów.

D) Przekazywanie izochroniczne (transfer izochroniczny) jest również nazywane przesyłaniem strumieniowym w czasie rzeczywistym. Informacja przekazywana w takim przekazie wymaga rzeczywistej skali czasu podczas jej tworzenia, przesyłania i odbioru.

Transmisje strumieniowe charakteryzuje się gwarantowaną bezbłędną transmisją danych pomiędzy hostem a funkcją poprzez wykrywanie błędów podczas transmisji i ponowne żądanie informacji. Kiedy host będzie gotowy do odbioru danych z funkcji, wysyła do niej pakiet flagowy W-plastikowa torba. W odpowiedzi na to funkcja w fazie przesyłania danych przesyła pakiet danych do hosta lub, jeśli tak, to

O wartościach znamionowych od 10 omów do 1 MOhm);

  • przewody łączące (na przykład jest to dobry zestaw);
  • komputer osobisty ze środowiskiem programistycznym Arduino IDE.
  • 1 Opis serialu Interfejs SPI

    SPI – szeregowy interfejs peryferyjny lub „szeregowy interfejs peryferyjny” to protokół synchronicznego przesyłania danych służący do parowania urządzenie główne Z urządzenia peryferyjne (Slave). Urządzeniem głównym jest często mikrokontroler. Komunikacja między urządzeniami odbywa się za pomocą czterech przewodów, dlatego SPI czasami nazywany jest „interfejsem czteroprzewodowym”. Oto opony:

    Dostępne są cztery tryby przesyłania danych ( SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3), spowodowane kombinacją polaryzacji impulsów zegarowych (pracujemy na poziomie WYSOKIM lub NISKIM), Polaryzacja zegara, CPOL oraz fazę impulsów zegarowych (synchronizacja na zboczu narastającym lub opadającym impulsu zegarowego), Faza zegara, CPHA.

    Rysunek wyjaśnia tę tabelę.

    Interfejs SPI udostępnia kilka możliwości podłączenia urządzeń typu slave: niezależny I kaskada. Po niezależnym podłączeniu do magistrali SPI urządzenie główne uzyskuje dostęp do każdego urządzenia podrzędnego indywidualnie. W przypadku połączenia kaskadowego urządzenia podrzędne działają jedno po drugim, jak w kaskadzie.


    Rodzaje podłączenia urządzenia do pracy poprzez interfejs SPI: niezależne i kaskadowe

    2 Implementacja interfejsu SPI na płytach rodziny Arduino

    W Arduino magistrale interfejsu SPI zlokalizowane są na określonych portach. Każda płytka ma swoje własne przyporządkowanie pinów. Dla wygody wnioski są powielane i również umieszczane na osobnym Złącze ICSP(W programowaniu szeregowym obwodów: programowanie urządzenia zawartego w obwodzie przy użyciu protokołu szeregowego). Należy pamiętać, że złącze ICSP nie posiada pinu wyboru urządzenia podrzędnego - SS, ponieważ zakłada się, że Arduino będzie używane jako urządzenie nadrzędne w sieci. Ale jeśli to konieczne, możesz przypisać dowolny cyfrowy pin Arduino jako SS.

    Rysunek pokazuje standardową zgodność pinów z magistralami SPI dla Arduino UNO i Nano.


    3 Biblioteka do pracy z interfejsem SPI

    Dla Arduino napisano specjalną bibliotekę implementującą protokół SPI. Łączy się to tak: na początku programu dodajemy #włącz SPI.h.

    Aby rozpocząć korzystanie z protokołu SPI, należy skonfigurować ustawienia, a następnie zainicjować protokół zgodnie z procedurą SPI.beginTransaction(). Można to zrobić za pomocą jednej instrukcji: SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0))

    Oznacza to, że inicjujemy protokół SPI z częstotliwością 14 MHz, transmisja danych odbywa się począwszy od MSB (najbardziej znaczący bit), w trybie SPI_MODE0.

    Po inicjalizacji wybierz urządzenie podrzędne, przesuwając odpowiedni pin SS do stanu NISKI.

    Następnie za pomocą polecenia przesyłamy dane do urządzenia slave SPI.transfer().

    Po przeniesieniu zwracamy SS państwu WYSOKI.


    Pracę z protokołem kończy polecenie SPI.endTransaction().

    Wskazane jest zminimalizowanie czasu transferu pomiędzy instrukcjami SPI.beginTransaction() i SPI.endTransaction() w celu uniknięcia problemów, jeśli inne urządzenie będzie próbowało zainicjować transfer danych przy użyciu innych ustawień.

    4 Podłączenie rejestru przesuwnego do Arduino

    Rozważmy praktyczne zastosowanie interfejsu SPI. Diody LED zapalimy sterując 8-bitowym rejestrem przesuwnym poprzez magistralę SPI. Połączmy się z Arduino rejestr przesuwny 74HC595. Podłączymy diodę LED o wartości nominalnej 220 omów do każdego z 8 wyjść rejestru poprzez rezystor ograniczający. Schemat pokazano na rysunku.


    5 Szkic do sterowania rejestrem przesuwnym poprzez interfejs SPI

    Napiszmy taki szkic.

    #włączać const int pinSelect = 8; // zarejestruj się wybierz pin unieważnij konfigurację() ( SPI.begin(); // inicjalizacja interfejsu SPI pinMode(pinSelect, OUTPUT); // digitalWrite(wybierz pin, NISKI); // wybierz urządzenia podrzędne (rejestr) SPI.transfer(0); // wyczyść zawartość rejestru digitalWrite(pinSelect, HIGH); // koniec transmisji Serial.begin(9600); } pusta pętla() ( for (int i=0; i )

    Na początek podłączmy bibliotekę SPI i zainicjujmy interfejs SPI. Zdefiniujmy pin 8 jako pin wyboru urządzenia podrzędnego SS. Wyczyśćmy rejestr przesuwny wysyłając do niego wartość „0”. Zainicjuj port szeregowy.

    Aby zaświecić konkretną diodę LED za pomocą rejestru przesuwnego, należy na jej wejściu zastosować 8-bitową liczbę. Przykładowo, aby zaświeciła się pierwsza dioda LED, podajemy liczbę binarną 00000001, dla drugiej - 00000010, dla trzeciej - 00000100 itd. Te liczby binarne po przeliczeniu na system dziesiętny tworzą następującą sekwencję: 1, 2, 4, 8, 16, 32, 64, 128 i są potęgami dwójki od 0 do 7.

    Odpowiednio w cyklu pętla() Na podstawie liczby diod LED przeliczamy od 0 do 7. Funkcja pow(podstawa, stopień) Podnosi 2 do potęgi licznika pętli. Mikrokontrolery nie działają zbyt dokładnie z liczbami typu „double”, dlatego stosujemy funkcję zaokrąglania, aby przeliczyć wynik na liczbę całkowitą okrągły(). I przesyłamy wynikową liczbę do rejestru przesuwnego. Dla przejrzystości monitor portu szeregowego wyświetla wartości uzyskane podczas tej operacji: Urządzenie „przebiega” przez wyładowania - diody LED świecą falą.

    6 „Biegnąca fala” z diod LED

    Diody zapalają się jedna po drugiej i obserwujemy biegnącą „falę” świateł. Sterowanie diodami odbywa się za pomocą rejestru przesuwnego, do którego podłączyliśmy się poprzez interfejs SPI. W rezultacie tylko 3 piny Arduino służą do sterowania 8 diodami LED. Gdybyśmy podłączali diody LED bezpośrednio do portów cyfrowych Arduino, musielibyśmy użyć osobnego portu dla każdej diody LED.

    Przestudiowaliśmy najprostszy przykład Arduino współpracującego z magistralą SPI. Bardziej szczegółowo rozważymy działanie kilku rejestrów przesuwnych z niezależnymi i kaskadowymi połączeniami w osobnym artykule.