I²C - I²C

I 2 C autobus
Logo autobusu I²C.svg
Rodzaj Szeregowa magistrala komunikacyjna
Projektant Philips Semiconductor , znany dziś jako NXP Semiconductors
Zaprojektowany 1982 ; 39 lat temu ( 1982 )
Sygnał danych Otwarty kolektor lub otwarty drenaż
Szerokość 1-bit (SDA) z oddzielnym zegarem (SCL)
Szybkość transmisji 0,1, 0,4, 1,0, 3,4 lub 5,0  Mbit/s w zależności od trybu
Protokół Szeregowy , półdupleks

I 2 C ( Inter-Integrated Circuit , eye-squared- C ), alternatywnie znany jako I2C lub IIC , to synchroniczna , multi-master, multi-slave , komutowana pakietowo , single-ended , magistrala komunikacji szeregowej wynaleziona w 1982 roku przez firmę Philips Półprzewodniki . Jest szeroko stosowany do podłączania peryferyjnych układów scalonych o niższej prędkości do procesorów i mikrokontrolerów w komunikacji wewnątrzpłytowej na krótkie odległości.

Kilku konkurentów, takich jak Siemens , NEC , Texas Instruments , STMicroelectronics , Motorola , Nordic Semiconductor i Intersil , wprowadziło na rynek kompatybilne produkty I 2 C od połowy lat 90-tych.

System Management Bus (SMBus), zdefiniowany przez firmę Intel w 1995 roku, jest podzbiorem I 2 C, definiującym bardziej rygorystyczne użycie. Jednym z celów SMBus jest promowanie solidności i interoperacyjności. W związku z tym nowoczesne, że dwa układy C zawierać kilka zasad i zasad z SMBus czasami wspierania zarówno I 2 C i SMBus, wymagające tylko minimalnego rekonfiguracji poprzez dowodzenia i wykorzystanie wyjścia stykowe.

Aplikacje

Microchip MCP23008 8-bitowy ekspander I 2 C I/O w obudowie DIP-18

I 2 C jest odpowiedni dla urządzeń peryferyjnych, w których prostota i niski koszt produkcji są ważniejsze niż szybkość. Typowe zastosowania magistrali I 2 C to:

Szczególną zaletą I 2 C jest zdolność mikrokontrolera do kontrolowania sieci układów urządzeń za pomocą zaledwie dwóch uniwersalnych pinów I/O i oprogramowania. Wiele innych technologii magistrali używanych w podobnych aplikacjach, takich jak Serial Peripheral Interface Bus (SPI), wymaga większej liczby pinów i sygnałów do połączenia wielu urządzeń.

Rewizje

Historia wydań specyfikacji I 2 C
Rok Wersja Uwagi Referencje
1981 Patent Patent US 4 689 740 zgłoszony 2 listopada 1981 przez US Philips Corporation.
1982 Oryginał System 100 kbit/s I 2 C został stworzony jako prosty system magistrali wewnętrznej do budowy elektroniki sterującej z różnymi chipami Philipsa. Nie dotyczy
1992 1 Dodano tryb szybki (Fm) 400 kbit/s i 10-bitowy tryb adresowania w celu zwiększenia przepustowości do 1008 węzłów. To była pierwsza standardowa wersja. Nie dotyczy
1998 2 Dodano tryb wysokiej prędkości 3,4 Mbit/s (Hs) z wymaganiami dotyczącymi oszczędzania energii dla napięcia i prądu elektrycznego. Nie dotyczy
2000 2,1 Doprecyzowana wersja 2, bez znaczących zmian funkcjonalnych.
2007 3 Dodano tryb szybki 1 Mbit/s plus (Fm+) (przy użyciu sterowników 20 mA) oraz mechanizm identyfikacji urządzenia.
2012 4 Dodano 5 Mbit / s Ultra Fast-mode (dla Śródziemnomorza) dla nowej USDA (dane) i USCL (zegar) linie korzystające push-pull logikę bez rezystory pull-up ,
i dodał przypisany tabeli ID producenta. To tylko autobus jednokierunkowy .
2012 5 Poprawione błędy.
2014 6 Poprawiono dwa wykresy. To jest obecny standard.

Projekt

Przykładowy schemat z jednym urządzeniem nadrzędnym ( mikrokontroler ), trzema węzłami podrzędnymi ( przetwornik ADC , DAC , mikrokontroler) oraz rezystorami podciągającymi R p

I 2 C wykorzystuje tylko dwóch dwukierunkowych otwarty kolektor lub otwartym spustowe linie: szeregowy linii danych (SDA) i numer seryjny linia zegara (SCL) zatrzymał się z rezystorów . Typowe stosowane napięcia to +5 V lub +3,3 V, chociaż dozwolone są systemy z innymi napięciami.

Projekt referencyjny I 2 C ma 7-bitową przestrzeń adresową z rzadko używanym 10-bitowym rozszerzeniem. Wspólna I 2 prędkości magistrali C to 100  kbit / s tryb standardowy i 400 kbit / s Tryb szybki . Istnieje również tryb niskiej prędkości 10 kbit/s , ale dozwolone są również dowolnie niskie częstotliwości taktowania. Późniejsze wersje I 2 C mogą obsługiwać więcej węzłów i działać z większą prędkością ( tryb szybki 400 kbit/s , tryb szybki 1 Mbit/s plus , tryb szybki 3,4  Mbit/s i tryb ultraszybkiMbit/s ) . Prędkości te są szerzej stosowane w systemach wbudowanych niż w komputerach PC.

Należy zauważyć, że szybkości transmisji bitów są podawane dla transferów między urządzeniem nadrzędnym i podrzędnym bez rozciągania zegara lub innych narzutów sprzętowych. Narzuty protokołu obejmują adres urządzenia podrzędnego i być może adres rejestru w urządzeniu podrzędnym, a także bity ACK/NACK na bajt. W ten sposób rzeczywista szybkość przesyłania danych użytkownika jest niższa niż wynikałoby to z samych szczytowych szybkości transmisji bitów. Na przykład, jeśli każda interakcja z urządzeniem podrzędnym nieefektywnie pozwala na przesłanie tylko 1 bajtu danych, szybkość transmisji danych będzie mniejsza niż połowa szczytowej szybkości transmisji.

Liczba węzłów, które mogą występować w danym I 2 autobus C jest ograniczony przez przestrzeń adresową, a także przez całkowitą autobusowego pojemności 400  pF , co ogranicza praktyczne odległości komunikacyjne do kilku metrów. Stosunkowo wysoka impedancja i niska odporność na zakłócenia wymagają wspólnego potencjału uziemienia, co ponownie ogranicza praktyczne zastosowanie do komunikacji w obrębie tej samej płyty PC lub małego systemu płyt.

I 2 C tryby
Tryb Maksymalna
prędkość
Maksymalna
pojemność
Prowadzić samochód Kierunek
Tryb standardowy (Sm) 100 kb/s 400 pF Otwarty odpływ * Dwukierunkowy
Tryb szybki (Fm) 400 kb/s 400 pF Otwarty Spływ* Dwukierunkowy
Tryb szybki plus (Fm+) 1 Mb/s 550 pF Otwarty Spływ* Dwukierunkowy
Tryb szybki (Hs) 1,7 Mb/s 400 pF Otwarty Spływ* Dwukierunkowy
Tryb szybki (Hs) 3,4 Mb/s 100 pF Otwarty Spływ* Dwukierunkowy
Tryb ultraszybki (UFm) 5 Mb/s ? Pchać ciągnąć Jednokierunkowy
  • Uwaga: otwarty drenaż oznacza również otwarty kolektor.

Projekt referencyjny

Wspomniana konstrukcja referencyjna to magistrala z liniami zegara (SCL) i danych (SDA) z adresowaniem 7-bitowym. Magistrala ma dwie role dla węzłów: master i slave:

  • Węzeł nadrzędny – węzeł, który generuje zegar i inicjuje komunikację z urządzeniami podrzędnymi.
  • Węzeł podrzędny – węzeł, który odbiera zegar i odpowiada na adresowany przez mastera.

Magistrala jest magistralą multi-master , co oznacza, że ​​może być obecna dowolna liczba węzłów master. Dodatkowo role master i slave mogą być zmieniane pomiędzy komunikatami (po wysłaniu STOP).

Mogą istnieć cztery potencjalne tryby pracy dla danego urządzenia magistrali, chociaż większość urządzeń używa tylko jednej roli i jej dwóch trybów:

  • master transmit – węzeł master wysyła dane do slave,
  • master receive – węzeł master odbiera dane z slave,
  • slave transmit – węzeł slave wysyła dane do mastera,
  • odbiór podrzędny – węzeł podrzędny odbiera dane od urządzenia nadrzędnego.

Oprócz bitów danych 0 i 1, magistrala I 2 C umożliwia specjalne sygnały START i STOP, które działają jako ograniczniki komunikatów i są różne od bitów danych. (W przeciwieństwie do bitów startu i stopu używanych w asynchronicznej komunikacji szeregowej , które różnią się od bitów danych tylko ich taktowaniem).

Urządzenie master jest początkowo w trybie transmisji master, wysyłając START, po którym następuje 7-bitowy adres urządzenia slave, z którym chce się komunikować, a następnie pojedynczy bit reprezentujący, czy chce pisać (0) do lub czytać (1 ) od niewolnika.

Jeśli urządzenie podrzędne istnieje na szynie, odpowie bitem ACK (aktywny stan niski dla potwierdzonego) dla tego adresu. Następnie urządzenie nadrzędne kontynuuje pracę w trybie nadawania lub odbioru (zgodnie z wysłanym bitem odczytu/zapisu), a urządzenie podrzędne kontynuuje pracę w trybie komplementarnym (odpowiednio odbiór lub nadawanie).

Adres i bajty danych są wysyłane najpierw w najbardziej znaczącym bitu . Stan początkowy jest wskazywany przez przejście SDA z wysokiego na niski z wysokim SCL; warunek zatrzymania jest wskazywany przez przejście od niskiego do wysokiego SDA z wysokim SCL. Wszystkie inne przejścia SDA mają miejsce przy niskim SCL.

Jeśli master chce pisać do slave, to wielokrotnie wysyła bajt, a slave wysyła bit ACK. (W tej sytuacji urządzenie nadrzędne jest w trybie nadawania urządzenia nadrzędnego, a urządzenie podrzędne w trybie odbioru podrzędnego).

Jeśli master chce czytać ze slave'a, to wielokrotnie otrzymuje bajt od slave'a, przy czym master wysyła bit ACK po każdym bajcie z wyjątkiem ostatniego. (W tej sytuacji master jest w trybie odbioru master, a slave jest w trybie nadawania slave).

An i 2 transakcja C może składać się z wielu wiadomości. Master kończy komunikat warunkiem STOP, jeśli jest to koniec transakcji lub może wysłać inny warunek START, aby zachować kontrolę nad magistralą dla innego komunikatu (transakcja „w formacie kombinowanym”).

Protokoły wiadomości

I 2 C definiuje podstawowe rodzaje transakcji, z których każda zaczyna się od STARTU, a kończy na STOP:

  • Pojedynczy komunikat, w którym master zapisuje dane do slave.
  • Pojedynczy komunikat, w którym master odczytuje dane z slave.
  • Format łączony, w którym urządzenie nadrzędne wykonuje co najmniej dwa odczyty lub zapisy do jednego lub więcej urządzeń podrzędnych.

W transakcji łączonej każdy odczyt lub zapis rozpoczyna się od STARTU i adresu urządzenia podrzędnego. Warunki START po pierwszym są również nazywane powtarzanymi bitami START . Powtarzane STARTY nie są poprzedzone warunkami STOP, dzięki czemu slave wie, że następny komunikat jest częścią tej samej transakcji.

Każde urządzenie podrzędne będzie odpowiadać tylko na określone komunikaty, jak określono w dokumentacji produktu.

Systemy Pure I 2 C obsługują dowolne struktury wiadomości. SMBus jest ograniczony do dziewięciu z tych struktur, takich jak czytanie słowa N i pisanie słowa N , z udziałem pojedynczego urządzenia podrzędnego. PMBus rozszerza SMBus o protokół grupowy , umożliwiając wysyłanie wielu takich transakcji SMBus w jednej połączonej wiadomości. Kończący STOP wskazuje, kiedy te zgrupowane akcje powinny odnieść skutek. Na przykład jedna operacja PMBus może zmienić konfigurację trzech zasilaczy (używając trzech różnych adresów I 2 C slave), a ich nowe konfiguracje zaczną obowiązywać w tym samym czasie: po otrzymaniu tego STOP.

Poza kilkoma wyjątkami, ani I 2 C, ani SMBus nie definiują semantyki wiadomości, takiej jak znaczenie bajtów danych w wiadomościach. Semantyka wiadomości jest poza tym specyficzna dla produktu. Wyjątki te zawierają komunikaty skierowane do I 2 C ogólnego wywołania adresu (0x00) lub do SMBus Adres Alert reagowania ; oraz wiadomości zaangażowane w protokół rozpoznawania adresów SMBus (ARP) do dynamicznego przydzielania adresów i zarządzania nimi.

W praktyce większość urządzeń podrzędnych przyjmuje modele sterowania żądanie-odpowiedź, w których jeden lub więcej bajtów po poleceniu zapisu jest traktowanych jako polecenie lub adres. Te bajty określają, jak traktowane są kolejne zapisane bajty lub jak slave reaguje na kolejne odczyty. Większość operacji SMBus obejmuje polecenia jednobajtowe.

Przykład wiadomości: 24C32 EEPROM

STMicroelectronics 24C08: szeregowa pamięć EEPROM z magistralą I 2 C

Jednym konkretnym przykładem jest pamięć EEPROM typu 24C32 , która używa dwóch bajtów żądania, które są nazywane Address High i Address Low. (W związku z tym te pamięci EEPROM nie są używane przez hosty z czystym interfejsem SMBus, które obsługują tylko polecenia lub adresy jednobajtowe.) Te bajty są używane do adresowania bajtów w przestrzeni adresowej EEPROM 32  kbit (lub 4  kB ). To samo adresowanie dwubajtowe jest również używane przez większe pamięci EEPROM, takie jak 24C512, który przechowuje 512 kbitów (lub 64 kB). Zapis i odczyt danych do tych EEPROM-ów odbywa się za pomocą prostego protokołu: zapisywany jest adres, a następnie dane są przesyłane do końca wiadomości. Część protokołu dotycząca przesyłania danych może powodować problemy w SMBus, ponieważ bajty danych nie są poprzedzone licznikiem, a jednocześnie można przesłać więcej niż 32 bajty. I 2 C EEPROM mniejsza niż 32 kb, jak 2 kb 24C02, są często używane w SMBus z nieefektywne transmisji danych jednobajtowych, aby przezwyciężyć ten problem.

Pojedyncza wiadomość jest zapisywana w pamięci EEPROM. Po START, master wysyła adres magistrali układu z bitem kierunku zerowania ( zapis ), następnie wysyła dwubajtowy adres danych w EEPROM, a następnie wysyła bajty danych do zapisu zaczynając od tego adresu, po czym następuje STOP. Podczas zapisywania wielu bajtów wszystkie bajty muszą znajdować się na tej samej 32-bajtowej stronie. Podczas gdy jest zajęty zapisywaniem tych bajtów w pamięci, EEPROM nie odpowiada na dalsze żądania I 2 C. (To kolejna niezgodność z SMBus: urządzenia SMBus muszą zawsze odpowiadać na ich adresy magistrali.)

Do odczytu rozpoczynającego się od określonego adresu w EEPROM używany jest komunikat łączony. Po START, master najpierw zapisuje adres magistrali tego układu z bitem kierunku ( zapis ), a następnie dwa bajty adresu danych EEPROM. Następnie wysyła (powtarzany) START i adres magistrali EEPROM z ustawionym bitem kierunku ( odczyt ). EEPROM odpowie następnie bajtami danych zaczynającymi się od określonego adresu danych EEPROM — połączony komunikat: najpierw zapis, potem odczyt. Master wydaje potwierdzenie ACK po każdym odczytanym bajcie z wyjątkiem ostatniego bajtu, a następnie wydaje STOP. EEPROM zwiększa adres po każdym przesłanym bajcie danych; odczyty wielobajtowe mogą pobrać całą zawartość EEPROM za pomocą jednego połączonego komunikatu.

Warstwa fizyczna

Magistrala I 2 C: R p to rezystory podciągające, R s to opcjonalne rezystory szeregowe.

W warstwie fizycznej zarówno linie SCL, jak i SDA są szynami typu open-drain ( MOSFET ) lub typu open-collector ( BJT ), dlatego dla każdej linii potrzebny jest rezystor podciągający . Logiczne „0” jest wyprowadzane przez podciągnięcie linii do masy, a logiczne „1” jest wyprowadzane przez umożliwienie pływania linii ( wysoka impedancja wyjściowa ), tak aby rezystor podciągający podciągał ją wysoko. Linia nigdy nie jest aktywnie prowadzona wysoko. To okablowanie umożliwia podłączenie wielu węzłów do magistrali bez zwarć spowodowanych rywalizacją o sygnał. Systemy o dużej szybkości (i niektóre inne) mogą wykorzystywać źródło prądowe zamiast rezystora, aby podciągnąć tylko SCL lub zarówno SCL, jak i SDA, aby dostosować się do większej pojemności magistrali i umożliwić szybsze czasy narastania.

Ważną konsekwencją tego jest to, że wiele węzłów może jednocześnie sterować liniami. Jeśli którykolwiek węzeł obniża linię, będzie ona niska. Węzły, które próbują przesłać jeden logiczny (tzn. pozwolić linii unosić się wysoko) mogą to wykryć i stwierdzić, że w tym samym czasie aktywny jest inny węzeł.

W przypadku użycia w SCL, nazywa się to rozciąganiem zegara i jest mechanizmem kontroli przepływu dla urządzeń podrzędnych. W przypadku korzystania z SDA nazywa się to arbitrażem i zapewnia, że ​​w danym momencie jest tylko jeden nadajnik.

W stanie bezczynności obie linie są wysokie. Aby rozpocząć transakcję, SDA jest obniżane, podczas gdy SCL pozostaje wysokie. Nielegalne jest nadawanie znacznika stopu poprzez zwolnienie SDA, aby ponownie uniósł się w górę (chociaż taki „unieważniony komunikat” jest zwykle nieszkodliwy), więc następnym krokiem jest obniżenie SCL.

Z wyjątkiem sygnałów start i stop, linia SDA zmienia się tylko wtedy, gdy zegar jest niski; przesyłanie bitu danych polega na pulsowaniu linii zegara na wysokim poziomie, przy jednoczesnym utrzymywaniu linii danych na stałym poziomie.

Gdy SCL jest niski, nadajnik (początkowo master) ustawia SDA na żądaną wartość i (po krótkim opóźnieniu, aby wartość się propagowała) pozwala na wysoki poziom SCL. Następnie master czeka, aż SCL rzeczywiście osiągnie wysoki poziom; to będzie opóźniony o czas narastania skończonego sygnału SCL (o stałej czasowej RC w rezystor pull-up i pasożytnicze pojemności autobusu) i może być dodatkowo opóźniony przez zegar niewolnika rozciągania.

Gdy SCL jest wysoki, master czeka minimalny czas (4 μs dla standardowej prędkości I 2 C), aby upewnić się, że odbiornik widział bit, a następnie ponownie obniża go. To kończy transmisję jednego bitu.

Po każdych 8 bitach danych w jednym kierunku bit „potwierdzenia” jest przesyłany w drugim kierunku. Nadajnik i odbiornik zmieniają role na jeden bit, a oryginalny odbiornik przesyła z powrotem pojedynczy bit „0” (ACK). Jeśli zamiast tego nadajnik widzi bit „1” (NACK), dowiaduje się, że:

  • (Jeżeli urządzenie nadrzędne przesyła do urządzenia podrzędnego) Urządzenie podrzędne nie może przyjąć danych. Brak takiego niewolnika, komenda niezrozumiana lub niezdolna do przyjęcia więcej danych.
  • (Jeżeli slave przesyła do mastera) Master chce, aby transmisja została zatrzymana po tym bajcie danych.

Tylko linia SDA zmienia kierunek podczas bitów potwierdzenia; SCL jest zawsze kontrolowany przez mastera.

Po bicie potwierdzenia linia zegara jest niska i master może wykonać jedną z trzech rzeczy:

  • Rozpocznij przesyłanie kolejnego bajtu danych: nadajnik ustawia SDA, a master pulsuje SCL na wysokim poziomie.
  • Wyślij „Stop”: ustaw niski SDA, pozwól SCL wzrosnąć, a następnie pozwól, aby SDA wzrosło. To zwalnia magistralę I 2 C.
  • Wyślij „Powtórz start”: ustaw wysoki SDA, pozwól SCL iść wysoko, a następnie ponownie obniż SDA. To uruchamia nowy komunikat magistrali I 2 C bez zwalniania magistrali.

Rozciąganie zegara za pomocą SCL

Jedną z ważniejszych funkcji protokołu I 2 C jest rozciąganie zegara. Zaadresowane urządzenie podrzędne może utrzymywać niską linię zegara (SCL) po odebraniu (lub wysłaniu) bajtu, wskazując, że nie jest jeszcze gotowe do przetwarzania większej ilości danych. Master, który komunikuje się z Slave, może nie zakończyć transmisji bieżącego bitu, ale musi poczekać, aż linia zegara faktycznie przejdzie w stan wysoki. Jeśli urządzenie podrzędne rozciąga zegar, linia zegara nadal będzie niska (ponieważ połączenia są otwarte ). To samo dotyczy sytuacji, gdy drugi, wolniejszy mistrz próbuje w tym samym czasie sterować zegarem. (Jeśli jest więcej niż jeden master, wszyscy oprócz jednego zwykle przegrywają arbitraż.)

Master musi poczekać, aż zauważy, że linia zegara idzie w górę, i dodatkowy minimalny czas (4 μs dla standardowych 100 kbit/s I 2 C) przed ponownym obniżeniem zegara.

Chociaż master może również utrzymywać niską linię SCL tak długo, jak chce (nie jest to dozwolone w najnowszej wersji 6 protokołu – podrozdział 3.1.1), termin „rozciąganie zegara” jest zwykle używany tylko wtedy, gdy robią to podrzędni . Chociaż teoretycznie każdy impuls zegarowy może być rozciągnięty, zazwyczaj używa się odstępów przed lub po bicie potwierdzenia. Na przykład, jeśli niewolnik jest mikrokontroler , jego I 2 C interfejs mógłby rozciągnąć zegara po każdym bajcie, aż oprogramowanie decyduje, czy wysłać pozytywne potwierdzenie lub NACK.

Rozciąganie zegara to jedyny czas w I 2 C, w którym slave napędza SCL. Wiele urządzeń podrzędnych nie musi rozciągać zegara i dlatego traktuje SCL jako ściśle wejście bez obwodów do sterowania. Niektóre mastery, takie jak te znajdujące się w niestandardowych układach ASIC, mogą nie obsługiwać rozciągania zegara; często te urządzenia będą oznaczone jako „interfejs dwuprzewodowy”, a nie I 2 C.

Aby zapewnić minimalną przepustowość magistrali , SMBus nakłada ograniczenia na to, jak daleko mogą być rozciągnięte zegary. Hosty i urządzenia podrzędne przestrzegające tych limitów nie mogą blokować dostępu do magistrali na dłużej niż na krótki czas, co nie jest gwarancją czystą I 2 C systemów.

Arbitraż za pomocą SDA

Każdy master monitoruje magistralę pod kątem bitów startu i stopu i nie uruchamia komunikatu, podczas gdy inny master utrzymuje magistralę zajętą. Jednak dwa urządzenia nadrzędne mogą rozpocząć transmisję mniej więcej w tym samym czasie; w takim przypadku następuje arbitraż. Tryb transmisji Slave może być również arbitrażowy, gdy urządzenie nadrzędne adresuje wiele urządzeń podrzędnych, ale jest to mniej powszechne. W przeciwieństwie do protokołów (takich jak Ethernet ), które używają losowych opóźnień wycofywania przed wydaniem ponownej próby, I 2 C ma deterministyczną politykę arbitrażu. Każdy nadajnik sprawdza poziom linii danych (SDA) i porównuje go z oczekiwanymi poziomami; jeśli się nie zgadzają, oznacza to, że nadajnik utracił arbitraż i wypadł z interakcji tego protokołu.

Jeśli jeden nadajnik ustawi SDA na 1 (nie steruje sygnałem), a drugi na 0 (przyciąganie do masy), wynik jest taki, że linia jest niska. Pierwszy nadajnik zauważa następnie, że poziom linii jest inny niż oczekiwany i stwierdza, że ​​inny węzeł nadaje. Pierwszym węzłem, który zauważa taką różnicę, jest ten, który traci arbitraż: przestaje kierować SDA. Jeśli jest masterem, również przestaje prowadzić SCL i czeka na STOP; wtedy może spróbować ponownie wysłać całą wiadomość. W międzyczasie drugi węzeł nie zauważył żadnej różnicy między oczekiwanymi a rzeczywistymi poziomami na SDA i dlatego kontynuuje transmisję. Może to zrobić bez problemów, ponieważ do tej pory sygnał był dokładnie taki, jak oczekiwano; żaden inny nadajnik nie zakłócił jego przekazu.

Jeśli dwa urządzenia nadrzędne wysyłają wiadomość do dwóch różnych urządzeń podrzędnych, ten, który wysyła niższy adres urządzenia podrzędnego, zawsze „wygrywa” arbitraż na etapie adresowania. Ponieważ dwa urządzenia nadrzędne mogą wysyłać komunikaty na ten sam adres urządzenia podrzędnego, a adresy czasami odnoszą się do wielu urządzeń podrzędnych, arbitraż musi czasami kontynuować etapy danych.

Arbitraż występuje bardzo rzadko, ale jest niezbędny do prawidłowego wsparcia multi-masterów. Podobnie jak w przypadku rozciągania zegara, nie wszystkie urządzenia obsługują arbitraż. Te, które to robią, generalnie określają się jako wspierające komunikację „multi-master”.

Jeden przypadek, który należy obchodzić się ostrożnie w Multi-Master I 2 implementacje C jest to, że wśród mistrzów rozmawiają ze sobą. Jeden nadrzędny może stracić arbitraż na przychodzącą wiadomość i musi zmienić swoją rolę z nadrzędnego na podrzędny na czas, aby potwierdzić swój własny adres.

W niezwykle rzadkim przypadku, gdy dwa urządzenia nadrzędne jednocześnie wysyłają identyczne wiadomości, obaj uznają komunikację za udaną, ale urządzenie podrzędne zobaczy tylko jedną wiadomość. Z tego powodu, gdy do urządzenia podrzędnego może uzyskać dostęp wielu nadrzędnych, każde polecenie rozpoznawane przez podrzędny musi być albo idempotentne, albo musi mieć gwarancję, że nigdy nie zostanie wydane przez dwóch nadrzędnych w tym samym czasie. (Na przykład, polecenie wydane tylko przez jednego mastera nie musi być idempotentne, ani nie jest konieczne, aby określone polecenie było idempotentne, gdy jakiś mechanizm wzajemnego wykluczania zapewnia, że ​​tylko jeden master może wydać to polecenie w danym momencie. .)

Arbitraż w SMBus

Podczas gdy I 2 C rozstrzyga tylko pomiędzy urządzeniami nadrzędnymi, SMBus wykorzystuje arbitraż w trzech dodatkowych kontekstach, w których wiele urządzeń podrzędnych odpowiada na urządzenie nadrzędne, a jeden z nich przekazuje swoją wiadomość.

  • Chociaż koncepcyjnie jest to magistrala z pojedynczym nadrzędnym, urządzenie podrzędne, które obsługuje „protokół powiadamiania hosta”, działa jako nadrzędny w celu wykonania powiadomienia. Zajmuje magistralę i zapisuje 3-bajtową wiadomość pod zarezerwowany adres „SMBus Host” (0x08), przekazując jej adres i dwa bajty danych. Gdy dwóch niewolników spróbuje powiadomić hosta w tym samym czasie, jeden z nich straci arbitraż i będzie musiał spróbować ponownie.
  • Alternatywny system powiadamiania o urządzeniu podrzędnym wykorzystuje oddzielny sygnał SMBALERT# w celu zwrócenia uwagi. W takim przypadku host wykonuje 1-bajtowy odczyt z zarezerwowanego „SMBus Alert Response Address” (0x0C), który jest rodzajem adresu rozgłoszeniowego. Wszystkie urządzenia podrzędne alarmujące odpowiadają bajtami danych zawierającymi ich własny adres. Kiedy slave pomyślnie prześle swój własny adres (wygrywając arbitraż przeciwko innym), przestaje podnosić to przerwanie. Zarówno w tym, jak iw poprzednim przypadku arbitraż zapewnia, że ​​wiadomość od jednego niewolnika zostanie odebrana, a pozostali będą wiedzieć, że muszą ponowić próbę.
  • SMBus obsługuje również „protokół rozpoznawania adresów”, w którym urządzenia zwracają 16-bajtowy „uniwersalny identyfikator urządzenia” ( UDID ). Wiele urządzeń może odpowiedzieć; osoba z najniższym UDID wygra arbitraż i zostanie uznana.

Arbitraż w PMBus

PMBus w wersji 1.3 rozszerza protokół odpowiedzi na alerty SMBus w swoim protokole "odczytu strefy". Urządzenia podrzędne mogą być pogrupowane w „strefy”, a wszystkie urządzenia podrzędne w strefie mogą być adresowane do odpowiedzi, z ich odpowiedziami zamaskowanymi (pominięciem niechcianych informacji), odwróconymi (więc żądana informacja jest wysyłana jako bity 0, które wygrywają arbitraż) lub zmienioną kolejnością ( więc najważniejsze informacje są wysyłane jako pierwsze). Arbitraż zapewnia, że ​​odpowiedzią o najwyższym priorytecie jest ta, która jako pierwsza została zwrócona kapitanowi.

PMBus rezerwuje I 2 adresy C 0x28 i 0x37 odpowiednio dla odczytu i zapisu strefy.

Różnice między trybami

Istnieje kilka możliwych trybów pracy dla komunikacji I 2 C. Wszystkie są kompatybilne, ponieważ zawsze można używać standardowego trybu 100 kbit/s , ale łączenie urządzeń o różnych możliwościach na tej samej magistrali może powodować następujące problemy:

  • Tryb szybki jest wysoce kompatybilny i po prostu poprawia kilka parametrów taktowania, aby osiągnąć prędkość 400 kbit/s. Tryb szybki jest szeroko obsługiwany przez urządzenia podrzędne I 2 C, więc master może z niego korzystać, o ile wie, że pozwala na to pojemność magistrali i siła podciągania.
  • Tryb Fast plus osiąga prędkość do 1 Mbit/s przy użyciu mocniejszych (20 mA) przetworników i podciągnięć, aby uzyskać szybsze czasy narastania i opadania. Kompatybilność z urządzeniami w trybie standardowym i szybkim (z funkcją podciągania 3 mA) można osiągnąć, jeśli istnieje sposób na zmniejszenie siły podciągania podczas rozmowy z nimi.
  • Tryb wysokiej prędkości (3,4 Mbit/s) jest kompatybilny z normalnymi urządzeniami I 2 C na tej samej magistrali, ale wymaga aktywnego podciągania linii zegara przez mastera, który jest włączony podczas szybkich transferów. Pierwszy bit danych jest przesyłany z normalnym, narastającym zboczem zegara z otwartym drenem, który może być rozciągnięty. Dla pozostałych siedmiu bitów danych i ACK, master ustawia zegar w stan wysoki w odpowiednim czasie, a slave może go nie rozciągać. Wszystkie szybkie transfery są poprzedzone jednobajtowym „kodem głównym” przy dużej lub standardowej prędkości. Ten kod służy trzem celom:
    1. nakazuje szybkim urządzeniom podrzędnym zmianę na szybkie reguły taktowania,
    2. zapewnia, że ​​urządzenia o dużej lub normalnej prędkości nie będą próbowały uczestniczyć w przekazie (ponieważ nie pasuje do ich adresu), oraz
    3. ponieważ identyfikuje kod główny (jest osiem kodów głównych, a każdy kod główny musi używać innego), zapewnia, że ​​arbitraż jest zakończony przed częścią transferu o dużej szybkości, dzięki czemu część o dużej szybkości nie musi uwzględniać tę umiejętność.
  • Tryb ultraszybki jest zasadniczo tylko do zapisu I 2 C podzbiorem, która jest niezgodna z innymi rodzajami wyjątkiem, że łatwo jest dodać wsparcie dla niego do istniejącej I 2 C projektowania interfejsu sprzętowego. Dozwolony jest tylko jeden master, który przez cały czas aktywnie steruje liniami danych, aby osiągnąć szybkość transferu 5 Mbit/s. Rozciąganie zegara, arbitraż, transfery odczytu i potwierdzenia są pomijane. Jest przeznaczony głównie do animowanych wyświetlaczy LED, w których błąd transmisji spowodowałby jedynie nieistotną krótką usterkę wizualną . Podobieństwo do innych trybów magistrali I 2 C jest ograniczone do:
    • warunki startu i stopu służą do delimitacji przelewów,
    • Adresowanie I 2 C pozwala wielu urządzeniom podrzędnym współdzielić magistralę bez sygnałów wyboru urządzenia podrzędnego w stylu magistrali SPI , oraz
    • wysyłany jest dziewiąty impuls zegarowy na przesyłany bajt, oznaczający pozycję nieużywanych bitów potwierdzenia.

Niektórzy producenci oferują tak zwany niestandardowy tryb Turbo z prędkością do 1,4 Mbit/s.

We wszystkich trybach częstotliwość zegara jest kontrolowana przez urządzenie nadrzędne, a dłuższa niż normalna magistrala może działać z prędkością niższą niż nominalna dzięki podtaktowaniu .

Połączenia obwodów

16-bitowa płytka ADC z interfejsem I 2 C

I 2 C jest popularny do łączenia obwodów peryferyjnych z systemami prototypowania, takimi jak Arduino i Raspberry Pi . I 2 C nie wykorzystuje znormalizowanego złącza, jednak projektanci płyt stworzyli różne schematy połączeń dla połączeń I 2 C. Aby zminimalizować ewentualne uszkodzenia wynikające z podłączania do tyłu 0,1-calowych nagłówków, niektórzy programiści sugerowali stosowanie naprzemiennych połączeń sygnału i zasilania o następujących schematach okablowania: (GND, SCL, VCC, SDA) lub (VCC, SDA, GND, SCL) .

Zdecydowana większość aplikacji wykorzystuje I 2 C w sposób, w jaki został pierwotnie zaprojektowany — peryferyjne układy scalone bezpośrednio podłączone do procesora na tej samej płytce drukowanej, a zatem na stosunkowo krótkie odległości poniżej 30 cm, bez złącza . Jednak przy użyciu sterownika różnicowego, alternatywna wersja I 2 C może komunikować się do 20 metrów (prawdopodobnie ponad 100 metrów) przez kabel CAT5 lub inny.

Kilka standardowych złączy przenosi sygnały I 2 C. Na przykład złącze UEXT przenosi I 2 C; 10-pinowe złącze iPack przenosi I 2 C; 6p6c złącze Lego Mindstorms NXT niesie I 2 ° C; Kilka osób użyciu złącza 8p8c i kabel kategorii 5 zwykle stosowanych do sieci Ethernet w warstwie fizycznej , aby być naniesione różnica kodowane I 2 sygnałów C lub wzmocniony niesymetryczne I 2 sygnałów C; a każde złącze HDMI oraz większość złącz DVI i VGA przenosi dane DDC2 przez I 2 C.

Buforowanie i multipleksowanie

Gdy istnieje wiele I 2 C Urządzenia w systemie, może istnieć konieczność uwzględnienia autobusowe buforów lub multipleksery do dzielenia dużych segmentów magistrali na mniejsze. Może to być konieczne, aby utrzymać pojemność segmentu magistrali poniżej dopuszczalnej wartości lub aby umożliwić oddzielenie wielu urządzeń o tym samym adresie przez multiplekser. Istnieje wiele typów multiplekserów i buforów i wszystkie muszą brać pod uwagę fakt, że linie I 2 C są określone jako dwukierunkowe. Multipleksery można zaimplementować za pomocą przełączników analogowych, które mogą łączyć jeden segment z drugim. Przełączniki analogowe zachowują dwukierunkowy charakter linii, ale nie izolują pojemności jednego segmentu od drugiego ani nie zapewniają możliwości buforowania.

Bufory mogą być używane do izolowania pojemności jednego segmentu od drugiego i/lub umożliwienia przesyłania I 2 C przez dłuższe kable lub ścieżki. Bufory dla linii dwukierunkowych, takich jak I 2 C, muszą wykorzystywać jeden z kilku schematów zapobiegania zatrzaskiwaniu. I 2 C jest otwarty, więc bufory muszą generować niski poziom z jednej strony, gdy widzą niski poziom z drugiej. Jedną z metod zapobiegania zatrzaskiwaniu się bufora jest starannie dobrane poziomy wejściowe i wyjściowe tak, aby poziom wyjściowy jego sterownika był wyższy niż próg wejściowy, zapobiegając samoczynnemu wyzwalaniu. Na przykład bufor może mieć próg wejściowy 0,4 V do wykrywania niskiego, ale niski poziom wyjściowy 0,5 V. Ta metoda wymaga, aby wszystkie inne urządzenia na magistrali miały progi, które są kompatybilne i często oznacza, że ​​wiele buforów realizujących to schemat nie może być połączony szeregowo.

Alternatywnie, istnieją inne typy buforów, które implementują wzmacniacze prądowe lub śledzą stan (tj. która strona spowodowała niski poziom szyny), aby zapobiec blokowaniu. Metoda stanu zazwyczaj oznacza, że ​​niezamierzony impuls jest wytwarzany podczas przekazywania, gdy jedna strona ustawia szynę w stanie niskim, następnie druga ustawia ją w stan niski, a następnie pierwsza strona zwalnia (jest to powszechne podczas potwierdzenia I 2 C).

Udostępnianie SCL między wieloma autobusami

W przypadku jednego urządzenia nadrzędnego możliwe jest posiadanie wielu magistral I 2 C współdzielących tę samą linię SCL. Pakiety na każdej magistrali są wysyłane jeden po drugim lub w tym samym czasie. Jest to możliwe, ponieważ komunikacja na każdej szynie może być podzielona na naprzemienne krótkie okresy z wysokim SCL, po których następują krótkie okresy z niskim SCL. A zegar można przeciągnąć, jeśli jeden autobus potrzebuje więcej czasu w jednym stanie.

Zaletą jest jednoczesne korzystanie z urządzeń podrzędnych o tym samym adresie i oszczędność połączeń lub szybsza przepustowość dzięki wykorzystaniu kilku linii danych w tym samym czasie.

Tabela stanów linii

Tabele te pokazują różne stany atomowe i operacje na bitach, które mogą wystąpić podczas komunikatu I 2 C.

Stan linii
Rodzaj Nieaktywny autobus

(N)

Początek

(S)

Bezczynny

(i)

Zatrzymać

(P)

Rozciąganie zegara

(CS)

Notatka Swobodnie domagać się arbitrażu Zgłaszanie autobusu (master) Zgłoszony autobus (master) Zwolnienie autobusu (master) Wstrzymane przez niewolnika
SDA Pasywne podciąganie Opadająca krawędź (master) Utrzymywany na niskim poziomie (master) Rosnąca krawędź (master) Nie obchodzi mnie to
SCL Pasywne podciąganie Pasywne podciąganie Pasywne podciąganie Pasywne podciąganie Trzymany nisko (niewolnik)
Stan linii
Rodzaj Wysyłanie jednego bitu danych (1) (0)

(SDA jest ustawiana/próbkowana po SCL, aby uniknąć wykrywania fałszywego stanu)

Odpowiedź odbiornika z bitem ACK

(Bajt odebrany od nadawcy)

Odpowiedź odbiornika z bitem NACK

(Bajt nie odebrany od nadawcy)

Konfiguracja bitów (Bs) Gotowy do pobrania (Bx) Konfiguracja bitów (Bs) POTWIERDZENIE (A) Konfiguracja bitów (Bs) NACK (A')
Notatka Bit ustawiony nadawcy (master/slave) Bit próbki odbiornika (master/slave) Nadajnik hi-Z Nadawca widzi niski poziom SDA Nadajnik hi-Z Nadawca widzi, że SDA jest wysokie
SDA Ustaw bit (po spadku SCL) Przechwytywanie bitu (po wzroście SCL) Utrzymywany na niskim poziomie przez odbiorcę (po spadku SCL) Wysterowany wysoki (lub pasywny wysoki) przez odbiornik (po spadku SCL)
SCL Opadająca krawędź (master) Rosnąca krawędź (master) Opadająca krawędź (master) Rosnąca krawędź (master) Opadająca krawędź (master) Rosnąca krawędź (master)
Stan linii (powtórny start)
Rodzaj Konfiguracja dla sygnału (Sr) po ACK/NACK Powtórny start (Sr)
Notatka Zacznij tutaj od ACK Unikanie stanu zatrzymania (P) Zacznij tutaj od NACK Taki sam jak sygnał startu (S)
SDA Został utrzymywany nisko dla ACK Rosnąca krawędź Pasywny wysoki Pasywny wysoki Opadająca krawędź (master)
SCL Opadająca krawędź (master) Utrzymywany na niskim poziomie Rosnąca krawędź (master) Pasywny wysoki Pasywne podciąganie

Struktura adresowania

7-bitowe adresowanie

Pole: S I 2 C pole adresowe R/W” A I 2 sekwencje wiadomości C... P
Rodzaj Początek Bajt 1 POTWIERDZ Bajt X itd...

Reszta przeczytaj lub napisz

wiadomość idzie tutaj

Zatrzymać
Pozycja bitu w bajcie X 7 6 5 4 3 2 1 0
7-bitowy adres poz 7 6 5 4 3 2 1
Notatka MSB LSB 1 = Czytaj
0 = Napisz

10-bitowe adresowanie

Pole: S 10-bitowy wskaźnik trybu Adres górny R/W” A Dolne pole adresowe I 2 C sekwencje wiadomości P
Rodzaj Początek Bajt 1 POTWIERDZ Bajt 2 Bajt X itd.

Reszta przeczytaj lub napisz

wiadomość idzie tutaj

Zatrzymać
Pozycja bitu w bajcie X 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
Wartość bitowa 1 1 1 1 0 x x x x x x x x x x x
10-bitowy adres poz 10 9 8 7 6 5 4 3 2 1
Notatka Wskazuje tryb 10-bitowy MSB 1 = Czytaj LSB
0 = Napisz

Zarezerwowane adresy w 7-bitowej przestrzeni adresowej

Dla funkcji specjalnych zarezerwowane są dwie grupy adresów:

  • 0000 XXX
  • 1111 XXX
Zarezerwowany indeks
adresu
8-bitowy bajt Opis
7-bitowy adres Wartość R/W
MSB
(4-bitowy)
LSB
(3-bitowy)
1-bitowy
1 0000 000 0 Rozmowa ogólna
2 0000 000 1 Bajt początkowy
3 0000 001 x Adres CBUS
4 0000 010 x Zarezerwowane dla innego formatu autobusu
5 0000 011 x Zarezerwowane na przyszłość
6 0000 1XX x Kod główny trybu HS
7 1111 1XX 1 Identyfikator urzadzenia
8 1111 0XX x 10-bitowe adresowanie slave

SMBus rezerwuje dodatkowe adresy. W szczególności 0001 000zarezerwowany dla hosta SMBus, który może być używany przez urządzenia z funkcją master, 0001 100jest „adres odpowiedzi na alert SMBus”, który jest odpytywany przez hosta po przerwaniu poza pasmem i 1100 001jest adresem domyślnym, który jest początkowo używane przez urządzenia zdolne do dynamicznego przydzielania adresów.

Niezarezerwowane adresy w 7-bitowej przestrzeni adresowej

MSB (4-bitowy) Typowe zastosowanie
0001 Odbiorniki cyfrowe, SMBus
0010 Dekodery linii wideo TV, IPMB
0011 Kodeki AV
0100 Kodery wideo, ekspandery GPIO
0101 ACCESS autobus , PMBus
0110 VESA DDC , PMBus
0111 Kontroler wyświetlacza
1000 Przetwarzanie sygnału telewizyjnego, przetwarzanie dźwięku, SMBus
1001 Przełączanie AV, ADC i DAC , IPMB , SMBus
1010 Pamięć do przechowywania, zegar czasu rzeczywistego
1011 Procesory AV
1100 PLL i tunery, modulatory i demodulatory, SMBus
1101 Procesory i dekodery AV, wzmacniacze mocy audio, SMBus
1110 Konwertery przestrzeni kolorów AV

Chociaż MSB 1111 jest zarezerwowany dla identyfikatora urządzenia i 10-bitowego adresowania slave, jest również używany przez urządzenia zależne od wyświetlacza VESA DDC , takie jak urządzenia wskazujące .

Format transakcji

I 2 C transakcja składa się z jednego albo większej liczby wiadomości . Każda wiadomość zaczyna się od symbolu startu, a transakcja kończy się symbolem stopu. Symbole startu po pierwszym, które rozpoczynają wiadomość, ale nie transakcję, są określane jako powtarzające się symbole startowe .

Każda wiadomość to odczyt lub zapis. Transakcja składająca się z pojedynczej wiadomości nazywana jest transakcją odczytu lub zapisu. Transakcja składająca się z wielu wiadomości nazywana jest transakcją łączoną. Najpopularniejszą formą tej ostatniej jest wiadomość zapisu zawierająca informacje o adresie wewnątrz urządzenia, po której następuje wiadomość odczytu.

Wiele urządzeń I 2 C nie rozróżnia między transakcją łączoną a tymi samymi wiadomościami wysyłanymi jako oddzielne transakcje, ale nie wszystkie. Protokół identyfikatora urządzenia wymaga pojedynczej transakcji; niewolnicy nie mogą odpowiadać, jeśli zauważą symbol stop. Tryby konfiguracji, kalibracji lub autotestu, które powodują nietypową reakcję urządzenia podrzędnego, są również często automatycznie kończone po zakończeniu transakcji.

Schemat czasowy

Sekwencja przesyłania danych
  1. Transmisja danych jest inicjowana stanem początkowym (S) sygnalizowanym przez SDA w stanie niskim, podczas gdy SCL pozostaje na wysokim poziomie.
  2. SCL jest ustawiany na niskim poziomie, a SDA ustawia pierwszy poziom bitów danych, jednocześnie utrzymując SCL na niskim poziomie (w czasie niebieskiego paska).
  3. Dane są próbkowane (otrzymywane), gdy SCL wzrasta dla pierwszego bitu (B1). Aby bit był ważny, SDA nie może zmieniać się między rosnącym zboczem SCL a kolejnym opadającym zboczem (cały czas zielonego paska).
  4. Ten proces się powtarza, SDA przechodzi, gdy SCL jest niski, a dane są odczytywane, gdy SCL jest wysoki (B2 do Bn).
  5. Po ostatnim bicie następuje impuls zegarowy, podczas którego SDA jest obniżany w celu przygotowania do bitu stopu .
  6. Zatrzymania warunek (P), jest sygnalizowane przy SCL wzrasta, a następnie SDA wzrasta.

Aby uniknąć fałszywego wykrywania znaczników, istnieje minimalne opóźnienie między zboczem opadającym SCL a zmianą SDA oraz między zmianą SDA a zboczem narastającym SCL. Należy zauważyć, że, że 2 wiadomość C zawierającego N bitów danych (w tym uznaje) zawiera n + 1 impulsów zegarowych.

Przykład bit-bangingu protokołu I 2 C master

Poniżej znajduje się przykład bit uderzając í 2 protokół C jak w I 2 C opanowania. Przykład jest napisany w pseudo C . Ilustruje wszystkie opisane wcześniej cechy I 2 C (rozciąganie zegara, arbitraż, bit start/stop, ack/nack).

// Hardware-specific support functions that MUST be customized:
#define I2CSPEED 100
void I2C_delay(void);
bool read_SCL(void);  // Return current level of SCL line, 0 or 1
bool read_SDA(void);  // Return current level of SDA line, 0 or 1
void set_SCL(void);   // Do not drive SCL (set pin high-impedance)
void clear_SCL(void); // Actively drive SCL signal low
void set_SDA(void);   // Do not drive SDA (set pin high-impedance)
void clear_SDA(void); // Actively drive SDA signal low
void arbitration_lost(void);

bool started = false; // global data

void i2c_start_cond(void) {
  if (started) { 
    // if started, do a restart condition
    // set SDA to 1
    set_SDA();
    I2C_delay();
    set_SCL();
    while (read_SCL() == 0) { // Clock stretching
      // You should add timeout to this loop
    }

    // Repeated start setup time, minimum 4.7us
    I2C_delay();
  }

  if (read_SDA() == 0) {
    arbitration_lost();
  }

  // SCL is high, set SDA from 1 to 0.
  clear_SDA();
  I2C_delay();
  clear_SCL();
  started = true;
}

void i2c_stop_cond(void) {
  // set SDA to 0
  clear_SDA();
  I2C_delay();

  set_SCL();
  // Clock stretching
  while (read_SCL() == 0) {
    // add timeout to this loop.
  }

  // Stop bit setup time, minimum 4us
  I2C_delay();

  // SCL is high, set SDA from 0 to 1
  set_SDA();
  I2C_delay();

  if (read_SDA() == 0) {
    arbitration_lost();
  }

  started = false;
}

// Write a bit to I2C bus
void i2c_write_bit(bool bit) {
  if (bit) {
    set_SDA();
  } else {
    clear_SDA();
  }

  // SDA change propagation delay
  I2C_delay();

  // Set SCL high to indicate a new valid SDA value is available
  set_SCL();

  // Wait for SDA value to be read by slave, minimum of 4us for standard mode
  I2C_delay();

  while (read_SCL() == 0) { // Clock stretching
    // You should add timeout to this loop
  }

  // SCL is high, now data is valid
  // If SDA is high, check that nobody else is driving SDA
  if (bit && (read_SDA() == 0)) {
    arbitration_lost();
  }

  // Clear the SCL to low in preparation for next change
  clear_SCL();
}

// Read a bit from I2C bus
bool i2c_read_bit(void) {
  bool bit;

  // Let the slave drive data
  set_SDA();

  // Wait for SDA value to be written by slave, minimum of 4us for standard mode
  I2C_delay();

  // Set SCL high to indicate a new valid SDA value is available
  set_SCL();

  while (read_SCL() == 0) { // Clock stretching
    // You should add timeout to this loop
  }

  // Wait for SDA value to be written by slave, minimum of 4us for standard mode
  I2C_delay();

  // SCL is high, read out bit
  bit = read_SDA();

  // Set SCL low in preparation for next operation
  clear_SCL();

  return bit;
}

// Write a byte to I2C bus. Return 0 if ack by the slave.
bool i2c_write_byte(bool send_start,
                    bool send_stop,
                    unsigned char byte) {
  unsigned bit;
  bool     nack;

  if (send_start) {
    i2c_start_cond();
  }

  for (bit = 0; bit < 8; ++bit) {
    i2c_write_bit((byte & 0x80) != 0);
    byte <<= 1;
  }

  nack = i2c_read_bit();

  if (send_stop) {
    i2c_stop_cond();
  }

  return nack;
}

// Read a byte from I2C bus
unsigned char i2c_read_byte(bool nack, bool send_stop) {
  unsigned char byte = 0;
  unsigned char bit;

  for (bit = 0; bit < 8; ++bit) {
    byte = (byte << 1) | i2c_read_bit();
  }

  i2c_write_bit(nack);

  if (send_stop) {
    i2c_stop_cond();
  }

  return byte;
}

void I2C_delay(void) { 
  volatile int v;
  int i;

  for (i = 0; i < I2CSPEED / 2; ++i) {
    v;
  }
}

Obsługa systemu operacyjnego

  • W AmigaOS można użyć komponentu i2c.resource dla AmigaOS 4.xi MorphOS 3.x lub biblioteki współdzielonej i2c.library autorstwa Wilhelma Noekera dla starszych systemów.
  • Programiści Arduino mogą korzystać z biblioteki „Wire”.
  • Maximite obsługuje komunikację I 2 C natywnie jako część swojego MMBasic.
  • PICAXE używa poleceń i2c i hi2c.
  • eCos obsługuje I 2 C dla kilku architektur sprzętowych.
  • ChibiOS/RT obsługuje I 2 C dla kilku architektur sprzętowych.
  • FreeBSD , NetBSD i OpenBSD również dostarczają framework I 2 C, z obsługą wielu popularnych kontrolerów i czujników.
    • Od OpenBSD 3.9 (wydanego 1 maja 2006 ; 15 lat temu ), centralny podsystem i2c_scan sprawdza wszystkie możliwe chipy czujników jednocześnie podczas rozruchu, używając schematu ważenia ad hoc i lokalnej funkcji buforowania do odczytu wartości rejestrów z urządzeń podrzędnych I 2 C; to sprawia, że możliwe do badania czujników ogólnego przeznaczenia off-the-shelf i386 / amd64 sprzętu podczas rozruchu bez jakiejkolwiek konfiguracji przez użytkownika ani zauważalnego opóźnienia próbkowania; procedury dopasowywania poszczególnych sterowników muszą wtedy polegać tylko na „przyjaznej nazwie” opartej na ciągach znaków; w rezultacie większość sterowników czujników I 2 C jest domyślnie włączana automatycznie w odpowiednich architekturach bez negatywnego wpływu na stabilność; poszczególne czujniki, zarówno I 2 C, jak i inne, są eksportowane do obszaru użytkownika za pośrednictwem struktury sysctl hw.sensors . Od marca 2019 OpenBSD ma ponad dwa tuziny sterowników urządzeń na I 2 C, które eksportują jakiś rodzaj czujnika przez framework hw.sensors , a większość tych sterowników jest domyślnie w pełni włączona w jądrach i386/amd64 OpenBSD. ( 2006-05-01 ) GENERIC
    • W NetBSD istnieje ponad dwa tuziny podrzędnych urządzeń I 2 C, które posiadają czujniki monitorujące sprzęt, które są dostępne poprzez framework sysmon envsys jako listy właściwości . Na sprzęcie ogólnego przeznaczenia każdy sterownik musi wykonać własne sondowanie, stąd wszystkie sterowniki dla urządzeń podrzędnych I 2 C są domyślnie wyłączone w NetBSD w GENERICkompilacjach i386/amd64.
  • W Linux , że 2 C jest obsługiwane za pomocą sterownika dla konkretnego urządzenia, a drugi dla I 2 C (lub SMBus ) łącznika, z którym jest połączony. Setki takich sterowników są częścią aktualnych wydań jądra Linuksa.
  • W systemie Mac OS X istnieje około dwóch tuzinów rozszerzeń jądra I 2 C, które komunikują się z czujnikami w celu odczytu napięcia, prądu, temperatury, ruchu i innych stanów fizycznych.
  • W systemie Microsoft Windows I 2 C jest implementowany przez odpowiednie sterowniki urządzeń większości dostępnego w branży sprzętu. W przypadku urządzeń wbudowanych/ SoC HID system Windows 8 i nowsze mają zintegrowany sterownik magistrali I²C.
  • W Windows CE I 2 C jest implementowany przez odpowiednie sterowniki urządzeń większości dostępnego w branży sprzętu.
  • Unison OS , POSIX RTOS dla IoT, obsługuje I 2 C dla kilku architektur sprzętowych MCU i MPU.
  • W RISC OS , I 2 C jest dostarczany z ogólnym interfejsem I 2 C z kontrolera IO i jest obsługiwany przez system modułu OS
  • W systemach operacyjnych Sinclair QDOS i Minerva QL I 2 C jest obsługiwany przez zestaw rozszerzeń dostarczonych przez TF Services .

Narzędzia programistyczne

Podczas opracowywania lub rozwiązywania problemów z systemami wykorzystującymi I 2 C, widoczność na poziomie sygnałów sprzętowych może być ważna.

Adaptery hosta

Istnieje wiele rozwiązań sprzętowych adapterów I 2 C hosta do tworzenia połączenia I 2 C master lub slave z komputerami hosta z systemem Linux , Mac lub Windows . Większość opcji to adaptery USB -do-I 2 C. Nie wszystkie z nich wymagają własnościowych sterowników lub interfejsów API .

Analizatory protokołów

I 2 analizatory protokołu C są narzędzia próbki typu I 2 C magistrali i dekodować sygnały elektryczne do widoku na wyższym poziomie w danych przesyłanych przez magistralę.

Analizatory logiczne

Podczas opracowywania i/lub rozwiązywania problemów z magistralą I 2 C, badanie sygnałów sprzętowych może być bardzo ważne. Analizatory stanów logicznych to narzędzia, które zbierają, analizują, dekodują i przechowują sygnały, dzięki czemu ludzie mogą oglądać szybkie przebiegi w wolnym czasie. Analizatory logiczne wyświetlają znaczniki czasu każdej zmiany poziomu sygnału, co może pomóc w znalezieniu problemów z protokołem. Większość analizatorów logicznych ma możliwość dekodowania sygnałów magistrali na dane protokołu wysokiego poziomu i wyświetlania danych ASCII.

Ograniczenia

Przypisywanie adresów urządzeń podrzędnych jest jedną ze słabości I 2 C. Siedem bitów to za mało, aby zapobiec kolizji adresów między wieloma tysiącami dostępnych urządzeń. To, co łagodzi problem kolizji adresów między różnymi dostawcami, a także umożliwia połączenie z kilkoma identycznymi urządzeniami, to fakt, że producenci dedykują piny, które mogą być użyte do ustawienia adresu slave na jedną z kilku opcji adresu na urządzenie. Typowe są dwa lub trzy piny, a w przypadku wielu urządzeń istnieją trzy lub więcej opcji okablowania na pin adresowy.

10-bitowe adresy I 2 C nie są jeszcze powszechnie używane, a wiele systemów operacyjnych hosta ich nie obsługuje. Nie ma też złożonego schematu SMBus „ARP” do dynamicznego przydzielania adresów (innych niż dla kart PCI z obecnością SMBus, dla których jest to wymagane).

Pokrewnym zagadnieniem jest automatyczna konfiguracja magistrali. Dany adres może być używany przez wiele różnych urządzeń niezgodnych z protokołem w różnych systemach i prawie żaden typ urządzenia nie może zostać wykryty w czasie wykonywania. Na przykład 0x51może być używany przez 24LC02 lub 24C32 EEPROM z niekompatybilnym adresowaniem; lub przez PCF8563 RTC , którego nie można wiarygodnie odróżnić od żadnego z nich (bez zmiany stanu urządzenia, co może być niedozwolone). Jedyne niezawodne mechanizmy konfiguracji dostępne dla hostów obejmują mechanizmy pozapasmowe, takie jak tabele dostarczane przez oprogramowanie układowe systemu, które zawierają listę dostępnych urządzeń. Ponownie, ten problem może częściowo zostać rozwiązany przez ARP w systemach SMBus, zwłaszcza gdy używane są identyfikatory dostawcy i produktu; ale to się nie przyjęło. ks. Wersja 03 specyfikacji I 2 C dodaje mechanizm ID urządzenia.

I 2 C obsługuje ograniczony zakres prędkości. Hosty obsługujące prędkości wielomegabitowe są rzadkie. Obsługa prędkości Fm+ 1 Mbit/s jest bardziej rozpowszechniona, ponieważ jej elektronika jest prostymi wariantami tego, co jest używane przy niższych prędkościach. Wiele urządzeń nie obsługuje prędkości 400 kbit/s (po części dlatego, że SMBus jeszcze jej nie obsługuje). Węzły I 2 C zaimplementowane w oprogramowaniu (zamiast dedykowanego sprzętu) mogą nawet nie obsługiwać prędkości 100 kbit/s; więc cały zakres zdefiniowany w specyfikacji jest rzadko użyteczny. Wszystkie urządzenia muszą przynajmniej częściowo obsługiwać najwyższą używaną prędkość lub mogą fałszywie wykryć adres swojego urządzenia.

Urządzenia mogą rozciągać cykle zegara, aby dopasować je do swoich szczególnych potrzeb, co może spowodować brak przepustowości potrzebnej szybszym urządzeniom i zwiększyć opóźnienia podczas komunikowania się z innymi adresami urządzeń. Pojemność magistrali również ogranicza prędkość transferu, zwłaszcza gdy źródła prądowe nie są wykorzystywane do skrócenia czasu narastania sygnału.

Ponieważ I 2 C jest współdzieloną magistralą, istnieje możliwość, że każde urządzenie będzie mieć awarię i zawiesić całą magistralę. Na przykład, jeśli jakiekolwiek urządzenie utrzymuje stan niski na linii SDA lub SCL, uniemożliwia to urządzeniu nadrzędnemu wysyłanie poleceń START lub STOP w celu zresetowania magistrali. Dlatego często projekty zawierają sygnał resetowania, który zapewnia zewnętrzną metodę resetowania urządzeń magistrali. Jednak wiele urządzeń nie ma dedykowanego pinu resetującego, co zmusza projektanta do wprowadzenia obwodów, aby umożliwić ponowne włączenie urządzeń, jeśli trzeba je zresetować.

Ze względu na te ograniczenia (zarządzanie adresami, konfiguracja magistrali, potencjalne błędy, prędkość) kilka segmentów magistrali I 2 C ma nawet kilkanaście urządzeń. Często zdarza się, że systemy mają kilka takich segmentów. Jeden może być przeznaczony do użytku z szybkimi urządzeniami, do zarządzania energią o niskich opóźnieniach. Inny może służyć do kontrolowania kilku urządzeń, w których opóźnienia i przepustowość nie są ważnymi kwestiami; jeszcze inny segment może być używany tylko do odczytu chipów EEPROM opisujących karty dodatkowe (takie jak standard SPD używany z pamięciami DRAM).

Technologie pochodne

I 2 C jest podstawą dla ACCESS.bus , interfejsu VESA Display Data Channel (DDC), magistrali zarządzania systemem (SMBus), magistrali zarządzania energią (PMBus) i magistrali zarządzania inteligentną platformą (IPMB, jednego z protokołów IPMI ). Warianty te mają różnice w zakresach napięcia i częstotliwości taktowania oraz mogą mieć linie przerwań .

Systemy o wysokiej dostępności (AdvancedTCA, MicroTCA) wykorzystują dwukierunkową redundancję I 2 C do zarządzania półkami. W tych systemach wymagana jest funkcja Multi-master I 2 C.

TWI (Two-Wire Interface) lub TWSI (Two-Wire Serial Interface) to zasadniczo ta sama magistrala zaimplementowana w różnych procesorach system-on-chip firmy Atmel i innych dostawców. Sprzedawcy używają nazwy TWI, mimo że I 2 C nie jest zarejestrowanym znakiem towarowym od 2014-11-07. Ochrona znaku towarowego istnieje tylko dla odpowiedniego logo (patrz prawy górny róg), a patenty na I 2 C wygasły. Według Microchip Technology , TWI i I2C mają kilka różnic. Jednym z nich jest to, że TWI nie obsługuje bajtu START.

W niektórych przypadkach użycie terminu „interfejsu dwuprzewodowej” wskazuje niekompletną realizacji I 2 specyfikacji C. Brak obsługi arbitrażu lub rozciągania zegara jest jednym z powszechnych ograniczeń, które nadal jest przydatne dla pojedynczego urządzenia nadrzędnego komunikującego się z prostymi urządzeniami podrzędnymi, które nigdy nie rozciągają zegara.

Standard interfejsu czujnika MIPI I3C (I3C) jest rozwinięciem I 2 C, opracowywanym w 2017 roku.

Zobacz też

Bibliografia

Dalsza lektura

Zewnętrzne linki