- Co to jest protokół komunikacyjny I2C?
- Jak działa komunikacja I2C?
- Gdzie korzystać z komunikacji I2C?
- I2C w MSP430: sterowanie potencjometrem cyfrowym AD5171
MSP430 to potężna platforma dostarczana przez Texas Instruments dla projektów wbudowanych, jej wszechstronny charakter sprawił, że znalazł sposoby na wiele aplikacji i faza ta wciąż trwa. Jeśli śledziłeś nasze samouczki dotyczące MSP430, to zauważyłeś, że omówiliśmy już szeroki zakres samouczków na temat tego mikrokontrolera, zaczynając od podstaw. Od teraz omówiliśmy podstawy, które możemy uzyskać w bardziej interesujących rzeczach, takich jak portal komunikacyjny.
W rozległym systemie aplikacji wbudowanych żaden mikrokontroler nie jest w stanie samodzielnie wykonać wszystkich czynności. Na pewnym etapie musi komunikować się z innymi urządzeniami, aby udostępniać informacje, istnieje wiele różnych typów protokołów komunikacyjnych do udostępniania tych informacji, ale najczęściej używane są USART, IIC, SPI i CAN. Każdy protokół komunikacyjny ma swoje zalety i wady. Na razie skupmy się na części I2C, ponieważ tego nauczymy się w tym samouczku.
Co to jest protokół komunikacyjny I2C?
Termin IIC oznacza „ Inter Integrated Circuits ”. Zwykle jest oznaczany jako I2C lub I do kwadratu C lub nawet jako protokół interfejsu 2-przewodowego (TWI) w niektórych miejscach, ale wszystko oznacza to samo. I2C to synchroniczny protokół komunikacyjny, co oznacza, że oba urządzenia, które udostępniają informacje, muszą dzielić wspólny sygnał zegarowy. Ma tylko dwa przewody do udostępniania informacji, z których jeden służy do sygnału koguta, a drugi do wysyłania i odbierania danych.
Jak działa komunikacja I2C?
Komunikację I2C po raz pierwszy wprowadził Phillips. Jak wspomniano wcześniej, ma dwa przewody, te dwa przewody zostaną połączone między dwoma urządzeniami. W tym przypadku jedno urządzenie nazywa się nadrzędnym, a drugie jako podrzędne. Komunikacja powinna i zawsze będzie zachodzić między dwoma urządzeniami Master i Slave. Zaletą komunikacji I2C jest to, że więcej niż jeden slave może być podłączony do Master.
Cała komunikacja odbywa się za pośrednictwem tych dwóch przewodów, mianowicie zegara szeregowego (SCL) i danych szeregowych (SDA).
Zegar szeregowy (SCL): dzieli sygnał zegara generowany przez urządzenie nadrzędne z urządzeniem podrzędnym
Serial Data (SDA): Wysyła dane do i pomiędzy Master a Slave.
W dowolnym momencie tylko kapitan będzie mógł zainicjować komunikację. Ponieważ w magistrali jest więcej niż jeden slave, master musi odnosić się do każdego slave'a używając innego adresu. Po zaadresowaniu tylko slave o tym konkretnym adresie odpowie z informacją, podczas gdy inni będą kontynuować. W ten sposób możemy używać tej samej magistrali do komunikacji z wieloma urządzeniami.
Te poziomy napięcia I2C nie są predefiniowane. Komunikacja I2C jest elastyczna, oznacza to, że urządzenie zasilane napięciem 5 V, może używać 5 V dla I2C, a urządzenia 3,3 V mogą używać 3 V do komunikacji I2C. Ale co, jeśli dwa urządzenia pracujące na różnych napięciach muszą komunikować się za pomocą I2C? Magistrali I2C 5V nie może być połączony z 3.3V urządzenia. W tym przypadku przesuwniki napięcia służą do dopasowania poziomów napięcia między dwiema szynami I2C.
Istnieje kilka warunków, które stanowią ramę dla transakcji. Inicjalizacja transmisji rozpoczyna się opadającym zboczem SDA, który jest zdefiniowany jako stan „START” na poniższym schemacie, w którym master pozostawia wysoki poziom SCL podczas ustawiania niskiego poziomu SDA.
Jak pokazano na powyższym schemacie poniżej, Zbocze opadające SDA jest wyzwalaczem sprzętowym dla warunku START. Następnie wszystkie urządzenia na tej samej magistrali przechodzą w tryb nasłuchu.
W ten sam sposób narastające zbocze SDA zatrzymuje transmisję, co jest pokazane jako stan „STOP” na powyższym schemacie, w którym master opuszcza wysoki poziom SCL, a także zwalnia SDA, aby przejść w stan wysoki. Tak więc narastające zbocze SDA zatrzymuje transmisję.
Bit R / W wskazuje kierunek transmisji kolejnych bajtów, jeśli jest WYSOKI oznacza, że slave będzie transmitować, a jeśli jest niski, oznacza to, że master będzie transmitował.
Każdy bit jest przesyłany w każdym cyklu zegara, więc przesłanie bajtu zajmuje 8 cykli zegara. Po wysłaniu lub odebraniu każdego bajtu dziewiąty cykl zegara jest wstrzymywany dla potwierdzenia / NACK (potwierdzony / niepotwierdzony). Ten bit ACK jest generowany przez slave lub master w zależności od sytuacji. Dla bitu ACK SDA jest ustawiane w stan niski przez master lub slave w 9- tym cyklu zegara. Więc jest niski, uważany za ACK, w przeciwnym razie NACK.
Gdzie korzystać z komunikacji I2C?
Komunikacja I2C jest używana tylko do komunikacji na krótkie odległości. Z pewnością jest do pewnego stopnia niezawodny, ponieważ ma zsynchronizowany impuls zegara, aby uczynić go inteligentnym. Protokół ten jest używany głównie do komunikacji z czujnikiem lub innymi urządzeniami, które muszą przesyłać informacje do mastera. Jest to bardzo przydatne, gdy mikrokontroler musi komunikować się z wieloma innymi modułami slave przy użyciu minimum samych przewodów. Jeśli szukasz komunikacji dalekiego zasięgu, powinieneś wypróbować RS232, a jeśli szukasz bardziej niezawodnej komunikacji, powinieneś wypróbować protokół SPI.
I2C w MSP430: sterowanie potencjometrem cyfrowym AD5171
Energia IDE jest jednym z najłatwiejszych programów do programowania naszego MSP430. Działa tak samo jak Arduino IDE. Możesz dowiedzieć się więcej o rozpoczęciu pracy z MSP430 przy użyciu Energia IDE tutaj.
Tak więc, aby użyć I2C w Energia IDE, musimy po prostu dołączyć plik nagłówkowy wire.h. Deklaracja pinów (SDA i SCL) znajduje się wewnątrz biblioteki wire, więc nie musimy deklarować w funkcji setup .
Przykładowe przykłady można znaleźć w menu Przykłady środowiska IDE. Poniżej wyjaśniono jeden z przykładów:
Ten przykład pokazuje, jak sterować potencjometrem cyfrowym Analog Devices AD5171, który komunikuje się za pośrednictwem synchronicznego protokołu szeregowego I2C. Korzystając z biblioteki MSP I2C Wire Library, cyfrowy potencjometr przejdzie przez 64 poziomy oporu, wygaszając diodę LED.
Najpierw dołączymy bibliotekę odpowiedzialną za komunikację i2c, czyli bibliotekę przewodową
#zawierać
W funkcji setup zainicjujemy bibliotekę wire za pomocą funkcji .begin () .
void setup () { Wire.begin (); }
Następnie zainicjalizuj zmienną val, aby zapamiętać wartości potencjometru
wartość bajtów = 0;
W funkcji pętli zaczniemy transmisję do urządzenia slave i2c (w tym przypadku potencjometr cyfrowy IC) podając adres urządzenia, który jest podany w arkuszu danych układu scalonego.
void loop () { Wire.beginTransmission (44); // transmituj na urządzenie nr 44 (0x2c)
Następnie bajty kolejki, czyli dane, które chcesz wysłać do układu scalonego w celu przesłania za pomocą funkcji write () .
Wire.write (bajt (0x00)); // wysyła bajt instrukcji Wire.write (val); // wysyła bajt wartości potencjometru
Następnie prześlij je, wywołując endTransmission () .
Wire.endTransmission (); // przestań przesyłać val ++; // wartość przyrostu if (val == 64) {// jeśli osiągnięto 64 pozycję (max) val = 0; // zacznij od najniższej wartości } delay (500); }