Spis treści:
Szyna I2C jest jednym z najpopularniejszych standardów lokalnej komunikacji szeregowej w urządzeniach cyfrowych. Poznaj podstawy i zastosowania I2C w praktyce!
Współczesne urządzenia elektroniczne korzystają z wielu standardów przesyłu danych pomiędzy poszczególnymi urządzeniami, modułami, a nawet pojedynczymi układami scalonymi – także w ramach tej samej płyty drukowanej. Z uwagi na niewielką liczbę linii wymaganych do utworzenia połączenia zdecydowanie najpopularniejsze są obecnie szyny szeregowe. W wielu zastosowaniach z powodzeniem zastępują one znacznie bardziej rozbudowane łącza równoległe. Wśród najczęściej spotykanych w elektronice standardów można znaleźć łącza I2C, SPI oraz I2S – dziś zajmiemy się pierwszym z nich, szczególnie rozpowszechnionym w świecie cyfrowych czujników oraz scalonych układów peryferyjnych.
Konstrukcja szyny I2C – zagadnienia sprzętowe
Od strony sprzętowej budowa łącza I2C jest niezwykle prosta. Do transmisji danych wykorzystuje się zaledwie dwa przewody (najczęściej w postaci ścieżek na płytce drukowanej lub krótkiego, maksymalnie kilkumetrowego kabla), do których mogą być bezpośrednio podłączone co najmniej dwa urządzenia.
Taka konstrukcja oznacza, że obie linie są współdzielone pomiędzy układami, a co za tym idzie – tylko jeden z nich może w danym momencie pełnić funkcję nadajnika, podczas gdy drugi (lub wszystkie pozostałe) – funkcję odbiornika. Linia oznaczona SCL służy do przesyłania sygnału zegarowego (taktującego), wyznaczającego „rytm”, w jakim nadawane są kolejne bity adresów, danych oraz potwierdzeń odbioru, natomiast SDA odpowiada za transmisję właściwej informacji pomiędzy współpracującymi układami.
Co ważne, po stronie każdego z układów wyprowadzenia współpracujące z liniami SDA i SCL muszą pracować w trybie określanym jako otwarty kolektor (open-collector, OC) czy też otwarty dren (open-drain, OD).
Zasada działania tego typu wyjść jest nieskomplikowana – włączenie tranzystora wyjściowego, znajdującego się w strukturze układu scalonego (np. mikrokontrolera lub czujnika) powoduje zwarcie danej linii (np. SDA) do masy układu, a zatem wymusza wystąpienie na niej logicznego stanu niskiego (L).
Wyłączenie tranzystora prowadzi do pojawienia się stanu wysokiego (H), a to za sprawą zewnętrznych rezystorów podciągających, które w przypadku szyny I2C powinny mieć zazwyczaj wartość rzędu 4,7 kΩ.
Sposób transmisji danych i adresów
Początek transmisji na szynie I2C wyznacza sygnał START – jest to nic innego, jak opadające zbocze na linii SDA, podczas gdy linia SCL znajduje się w stanie wysokim. Po spełnieniu tego warunku można już zacząć przesyłać dane – stan linii SDA może przy tym zmieniać się tylko wtedy, gdy na przewodzie SCL występuje stan niski, natomiast odczyt (próbkowanie) SDA przez odbiornik odbywa się w czasie dodatniego impulsu (stan H) na linii zegarowej.
Co ważne, bity są przesyłane w kolejności od najbardziej znaczącego, czyli najstarszego (MSB), do najmniej znaczącego (najmłodszego – LSB). Pierwszy przesyłany bajt w większości przypadków zawiera 7-bitowy adres urządzenia podrzędnego (tzw. slave) oraz bit kierunku transmisji (R/W) – ten ostatni przyjmuje logiczną wartość 1, gdy kolejne bajty mają być odczytywane z urządzenia podrzędnego przez urządzenie nadrzędne (master), natomiast 0 w przypadku zapisu danych z mastera do slave’a.
Gwoli ścisłości warto dodać, że od zaktualizowanej w 1992 roku specyfikacji standardu I2C adresowanie może być 10-bitowe – w takim przypadku pierwszy bajt zawiera 5 bitów o wartości 11110, dwa najstarsze bity adresu i bit kierunku R/W, a pozostałe 8 bitów adresu trafia do kolejnego bajtu. Rozwiązanie takie zostało wprowadzone w celu rozszerzenia dostępnej przestrzeni adresowej z początkowych 128 możliwości (co odpowiada liczbie 27) do 1024 adresów (czyli 210). Co ważne, po każdym pełnym bajcie master nadaje dodatkowy impuls na linii SCK, pozwalający urządzeniu podrzędnemu na potwierdzenie odbioru ramki (poprzez wystawienie logicznego zera na linię SDA). Po przesłaniu wszystkich danych w określonym pakiecie master może zakończyć transmisję, nadając sygnał STOP (zbocze narastające na linii SDA, podczas gdy SCL jest w stanie wysokim).
Prędkość transmisji
Istotnym zagadnieniem w przypadku linii I2C jest prędkość transmisji. Najwcześniejsza wersja standardu zakładała szybkość równą 100 kbps – do dziś wykorzystuje się ją w wielu urządzeniach z uwagi na większą odporność na zakłócenia oraz mniejsze wymagania sprzętowe w porównaniu do szybszych szyn I2C.
Zaktualizowana wersja 1.0 (rok 1992) umożliwiła pracę z prędkością 4-krotnie większą (400 kbps – tryb Fast), natomiast sześć lat później pojawiła się specyfikacja 2.0 dopuszczająca transmisję na poziomie aż 3,4 Mbps.
Aby zapewnić odpowiednią stromość zboczy na liniach zegarowej oraz danych, konieczne okazuje się jednak utrzymanie stosunkowo niskiej pojemności szyny – największe znaczenie mają tu pojemności pomiędzy ścieżkami sygnałowymi a masą na płytce drukowanej (lub pomiędzy żyłami i ekranem kabla, jeżeli rozpatrywane są układy nieznajdujące się na tej samej płytce PCB).
Wraz z rezystancją rezystorów podciągających pojemność linii transmisyjnej tworzy bowiem całkiem skuteczny filtr RC – jego „przeładowanie”, w przypadku zbyt dużej pojemności wypadkowej, może być niemożliwe w czasie wymaganym do pracy z daną szybkością transmisji. Z tego powodu wysoce zalecana jest minimalizacja pojemności na szynie I2C, zwłaszcza w przypadku dłuższych połączeń lub współpracy wielu układów w ramach tej samej szyny komunikacyjnej.
Jak oceniasz ten wpis blogowy?
Kliknij gwiazdkę, aby go ocenić!
Średnia ocena: 4.2 / 5. Liczba głosów: 16
Jak dotąd brak głosów! Bądź pierwszą osobą, która oceni ten wpis.