I²C - I²C
Rodzaj | Szeregowa magistrala komunikacyjna | ||
---|---|---|---|
Historia produkcji | |||
Projektant | Philips Semiconductor , znany dziś jako NXP Semiconductors | ||
Zaprojektowany | 1982 | ||
Dane | |||
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
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:
- Opisywanie urządzeń, które można podłączyć za pomocą małych tabel konfiguracji ROM, aby umożliwić działanie plug and play , takie jak EEPROM z wykrywaniem obecności szeregowej (SPD) w modułach podwójnej pamięci (DIMM) i rozszerzone dane identyfikacyjne wyświetlacza (EDID) dla monitorów za pośrednictwem VGA , DVI i złącza HDMI .
- Zarządzanie systemem dla systemów PC przez SMBus ; Piny SMBus są alokowane zarówno w konwencjonalnych złączach PCI, jak i PCI Express .
- Dostęp do zegarów czasu rzeczywistego i układów NVRAM, które zachowują ustawienia użytkownika.
- Dostęp do niskoobrotowych przetworników cyfrowo - analogowych i przetworników cyfrowo - analogowych .
- Zmiana ustawień kontrastu, odcienia i balansu kolorów w monitorach (za pośrednictwem kanału danych wyświetlania ).
- Zmiana głośności dźwięku w inteligentnych głośnikach.
- Sterowanie małymi (np. telefonem z internetem ) wyświetlaczami LCD lub OLED .
- Odczytywanie monitorów sprzętowych i czujników diagnostycznych, np. prędkości wentylatora.
- Włączanie i wyłączanie zasilania elementów systemu.
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
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
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 ultraszybki 5 Mbit/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.
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
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
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:
- nakazuje szybkim urządzeniom podrzędnym zmianę na szybkie reguły taktowania,
- 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
- 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
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.
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) |
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) |
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 000
zarezerwowany dla hosta SMBus, który może być używany przez urządzenia z funkcją master, 0001 100
jest „adres odpowiedzi na alert SMBus”, który jest odpytywany przez hosta po przerwaniu poza pasmem i 1100 001
jest 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
- Transmisja danych jest inicjowana stanem początkowym (S) sygnalizowanym przez SDA w stanie niskim, podczas gdy SCL pozostaje na wysokim poziomie.
- 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).
- 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).
- Ten proces się powtarza, SDA przechodzi, gdy SCL jest niski, a dane są odczytywane, gdy SCL jest wysoki (B2 do Bn).
- Po ostatnim bicie następuje impuls zegarowy, podczas którego SDA jest obniżany w celu przygotowania do bitu stopu .
- 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 ), 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.
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
GENERIC
kompilacjach i386/amd64.
- Od OpenBSD 3.9 (wydanego 1 maja 2006 ), 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.
- 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 0x51
moż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ż
- Lista autobusów sieciowych
- ACCESS.bus
- I3C
- Magistrala zarządzania energią
- Magistrala zarządzania systemem
- Złącze UEXT
- Kanał wyświetlania danych VESA
Bibliografia
Dalsza lektura
- Himpe, Vincent (2011). Opanowanie magistrali I 2 C . Numer ISBN 978-0-905705-98-9. (248 stron)
- Paret, Dominique (1997). Magistrala I2C: od teorii do praktyki . Numer ISBN 978-0-471-96268-7. (314 stron)