I²C-bus

De I2C-bus (spreek uit als: I kwadraat C bus), eertijds aangeduid met IIC-bus (Inter-IC-bus), is een synchrone, seriële bus, ontwikkeld voor datacommunicatie tussen microprocessoren en andere IC's, meestal op één enkele printplaat.

Geschiedenis 
De I2C-bus werd in 1979 door Philips ontwikkeld en in 1980 gepatenteerd als een betrouwbaar en goedkoop alternatief voor een reeks van andere databussen die destijds werden toegepast in consumentenapparaten. Sinds 2006 valt deze divisie van Philips onder de firma NXP, die dus ook de verantwoordelijkheid draagt voor de I2C-standaard.

Soms spreekt men van Two-Wire Interface (TWI) wanneer men het I2C-protocol bedoelt. TWI is de algemenere niet door Philips/NXP gelicentieerde term voor I2C. Philips heeft I2C echter bedacht, dus is TWI de meer officieuze term.

Het I2C-systeem had aanvankelijk enkele nadelen, zoals een lage snelheid (100 kbit/sec) en een geringe storingszekerheid bij lange leidingen (in de praktijk mag de totale lengte van de bus zeker niet langer dan 3 meter zijn), maar later is de snelheid opgevoerd en zijn er speciale buffer-IC's ontwikkeld om de leidinglengte van de bus te vergroten.

Werking 
I2C werkt op basis van twee buslijnen, namelijk SDA (serial data) en SCL (serial clock). Over de SDA-lijn wordt de data verzonden en over de SCL-lijn wordt het kloksignaal verzonden.

In het onderstaande timingdiagram wordt verduidelijkt hoe de SDA en SCL samenwerken:

De werking van I2C dataoverdracht:
 Data verzenden wordt geïnitieerd met een STARTbit (S) die de SDA het signaal geeft om omlaag getrokken te worden, terwijl de  SCL hoog blijft.
 SDA zet de eerste databit gelijk, terwijl SCL laag gehouden wordt (gedurende de blauwe tijdsbalk.). De data wordt ontvangen als SCL naar omhoog gaat (groen).
 Als de overdracht compleet is wordt een STOPbit (P) verzonden door de datalijn vrij te geven en deze zo in staat te stellen om omhoog getrokken te worden, terwijl SCL continu hoog gehouden wordt.
 Ten einde valse detecties te voorkomen wordt het niveau van de SDA veranderd op de dalende flank (overgang van hoog naar laag) van SCL. Het uitlezen gebeurt op de stijgende flank (de overgang van laag naar hoog) van SCL.

Om te kunnen communiceren heeft I2C één master nodig en minimaal één slave. De master heeft de controle over de I2C-bus en genereert het kloksignaal, startbit en stopbit. De slaves communiceren alleen dan, nadat de master daartoe een verzoek stuurt.

Om te communiceren stuurt de master eerst een startbit. Die bestaat uit een hoog-naar-laagsignaal op de SDA-lijn (flankgestuurd) terwijl de SCL-lijn hoog is. Vervolgens stuurt de master een adres plus een read/writebit over de I2C-lijn. De read/writebit geeft aan of de master data wil versturen of wil ontvangen. De slave die het aangeroepen adres heeft, zal dan reageren met een 'acknowledge', zodat de master weet dat het aangeroepen IC actief is.

Een acknowledge of een 'bevestiging' betekent dat de master na het verzenden van het laatste databit de SDA-lijn loslaat waardoor deze lijn omhoog getrokken wordt en dat de master dan nog 1 extra klokpuls verzendt waarbij voorafgaand aan het omhooggaan van de SCL-lijn de slave als bevestiging van goede ontvangst van de data de SDA-lijn omlaag trekt en weer loslaat nadat de SCL-lijn weer laag is geworden. Bij het verzenden van bijvoorbeeld 1 byte bestaande uit 8 bits zal de master dus 9 klokpulsen op de SCL-lijn uitzenden.

Nu kunnen de data worden verzonden. Er wordt één byte per keer verzonden plus een 'acknowledge' van de ontvanger om te bevestigen dat de data zijn ontvangen. Nadat de data zijn verstuurd, zal de master de stopbit verzenden: een laag-naar-hoogsignaal op de SDA-lijn (flankgestuurd), terwijl de SCL-lijn hoog is.

Om goed te kunnen werken is het noodzakelijk de beide buslijnen hoog te houden door een pull-upweerstand. De waarde van de weerstand is afhankelijk van de spanning op de bus (bij 3,3 V systemen tussen ongeveer 1,8 kΩ en 2,7 kΩ, maar bij 5V meestal 4,7 kΩ). Dit is ook afhankelijk van de snelheid waarmee men de bus wil laten werken.

Voordelen 
Bij geschikte toepassingen zijn belangrijkste voordelen:
 Lage kostprijs.
 Eenvoudige bedrading (slechts twee signaalleidingen).
 Weinig soldeerpunten, kleine IC's.
 Uitgebreid gamma IC's met de I2C-interface.
 Compatibele IC's van andere fabrikanten.
 Robuuste bouw.
 Langzame perifere chips kunnen wachtcycli afdwingen.
 Geïntegreerde multimastermogelijkheid, dat wil zeggen meerdere microcontrollers (masters) kunnen dezelfde bus gebruiken en zelfs onderling communiceren.

Nadelen 
Naast de vele voordelen zijn er ook enkele nadelen:
 Als er één aangesloten chip (IC) niet goed functioneert in de I2C-bus, kan dit de hele lijn van I2C  blokkeren, waardoor er helemaal geen communicatie meer op de I2C-lijnen kan plaatsvinden.
 I2C wordt traag bij grotere hoeveelheden data.

Latere versies 
In latere versies van de I2C-bus zijn er verschillende verbeteringen aangebracht. Zo is onder andere de maximale snelheid verhoogd naar 400 kbit/sec (fast-mode) en weer later naar 3,4 Mbit/sec (high speed-mode), is de adresseringsruimte van aangesloten IC's vergroot van 7 naar 10 bit en zijn er voorzieningen gekomen om I2C-bussen met verschillende voedingsspanningen te verbinden.

Externe links 
 I2C Introductie
 I2C Informatie
 Application notes NXP
 I2C-bus specification and user manual NXP
 Arduino Wire library

Elektronica
Computerhardware
Philips