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
Ze werd in 1979 door Philips
ontwikkeld en in 1980 gepatenteerd als betrouwbaar en goedkoop alternatief ter
vervanging van een reeks van verschillende andere databussen die destijds
werden toegepast in consumentenapparaten.
Het 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 1m 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 bestaat uit twee data lijnen
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.
Beide lijnen worden hoog gehouden
door een Pull-up weerstand te gebruiken van ongeveer 1800 Ohm.
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 nadat
de master daartoe een verzoek stuurt.
Om te communiceren stuurt de master
eerst een Start bit.
Dit bestaat uit een hoog naar laag
signaal op de SDA lijn (flankgestuurd) terwijl de SCL lijn hoog is. Vervolgens
stuurt de master een adres + een read/write bit over de I2C lijn.
Het read/write bit houdt in of de
master data wil versturen naar de of ontvangen van de slave.
De slave die het aangeroepen adres
heeft zal dan reageren met een Acknowledge zodat de master weet dat de
aangeroepen IC actief is.
Nu kan de data worden verzonden.
Er wordt één byte per keer verzonden
+ een Acknowledge van de ontvanger om te bevestigen dat de data is ontvangen.
Nadat de data is verstuurd zal de
master het stopbit verzenden:
Een laag naar hoog signaal op de SDA
lijn (flankgestuurd) terwijl de SCL lijn hoog is.
De I2C-bus is een
tweedraads dataverbinding tussen een of meer processoren (masters) en speciale
periferiecomponenten (slaves).
Al deze componenten zijn op dezelfde
bus aangesloten en hebben elk hun eigen unieke adres.
Adressen en data worden via dezelfde
lijnen verzonden.
De I2C-bus maakt een
uiterst eenvoudige verbinding mogelijk tussen vele IC's, waarbij uitbreidingen
achteraf probleemloos kunnen worden gerealiseerd.
Op de I2C-bus kunnen alle
IC's worden aangesloten die het speciale busprotocol beheersen.
Naast RAM-, EEPROM- en poort-IC's,
MQ-en D/A-omzetters en timers zijn dit vele speciale IC's zoals displaydrivers
of IC's voor de televisietechniek.
Al deze IC's kunnen zonder meer via
twee aansluitingen van de parallelle poort van de PC worden aangestuurd.
Wanneer we bereid zijn een paar
extra onderdelen te gebruiken kunnen we de IC's ook via de seriële poort
aansturen.
Voordelen
De voordelen zijn echter al even
belangrijk, wanneer aangewend in geschikte toepassingen.
De belangrijkste voordelen zijn:
- 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 IC niet goed
functioneert in de I2C bus dan kan dit de hele lijn van I2C blokkeren
zodat er helemaal geen communicatie meer op de I2C lijnen kan
plaatsvinden.
- I2C is 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.
Adressering van I2C-componenten
Algemeen
Iedere
bouwsteen die vanuit de bus moet kunnen worden aangesproken (geadresseerd),
heeft ter onderscheiding van andere bouwstenen een uniek adres: het slave
adres.
Bouwstenen die uitsluitend als master optreden hebben geen adres nodig.
Oorspronkelijk voorzag het I2C-concept in 7-bits adressen.
Hiermee zijn maximaal 128 bouwstenen aan te sturen.
Er zijn echter bepaalde adressen gereserveerd.
Philips heeft echter ook een mogelijkheid gemaakt dat ook 10-bits adressen
mogelijk zijn.
Omdat het gebruik van 7-bits en 10-bits adressen gelijktijdig mogelijk is, is
de 10 bit modus ietwat geforceerd.
De adressering is voor de 10-bit modus dus wat omslachtig.
7-bit adressering
Als een master met een slave wil communiceren, moet
hij eerst de bus opvragen via een start conditie.
Dan zendt
hij als eerste een byte waarvan de eerste 7 bits het adres vormen.
Het laatste
bit legt de transportrichting vast ('0' = schrijven, '1' = lezen).
Na een startconditie moeten alle aangesloten slaves de
bus bewaken om dit byte te lezen.
Hierbij
kunnen langzame slaves de master tot wachten dwingen.
Nadat alle 8
bits zijn ontvangen vergelijkt iedere slave het ontvangen adres met zijn eigen
adres.
Dit adres
ligt vast of het kan handmatig zijn ingesteld.
Bouwstenen
met een afwijkend adres nemen afscheid en wachten op een volgende
startconditie.
De bouwsteen
met het juiste adres stuurt een acknowledge-bit.
Nu weet de master dat de geadresseerde slave tot data
transport in staat is.
Komt er geen
acknowledge-bit dan is de bouwsteen beschadigd of er is geen bouwsteen aanwezig
op dat adres.
10-bit adressering
Aangezien de meeste adressen binnen de 7 bits
adresruimte al bezet zijn, heeft Philips voor toekomstige bouwstenen een
10-bits adresmodus gemaakt.
Deze modus
is compatibel met de 7-bit adresmodus.
Dus kunnen
7-bit en 10-bit bouwstenen op dezelfde bus worden aangesloten.
Het
basisidee achter 10-bit adressering is dat er twee adresbytes worden
gebruikt.
Daartoe
bevat het eerste adresbyte een combinatie die is gereserveerd voor deze wijze
van adresuitbreiding.
Daarna volgt een tweede byte dat de verdere adresbits
bevat.
Het
richtingsbit krijgt hierbij een ietwat andere betekenis.
De 7-bits in
het eerste adresbyte hebben de gedaante 11110XX.XX betekend hierbij de beide
hoogst waardige adresbits van het 10-bits adres.
De andere
acht bits volgen in het tweede adresbyte.
De
geadresseerde slave moet beide bytes bevestigen met een acknowledge.
Bij de
behandeling van genaral call adress en de startbyte procedure moet de slave
reageren als een 7-bit bouwsteen.
Dat betekent
echter geen beperking en is gewoon logisch.
Condities
De I2C bus bestaat uit twee actieve lijnen
en een massa verbinding.
De actieve lijnen zijn SDA en SCL. Beide lijnen zijn bidirectioneel.
SDA is de Serial DAta lijn en SCL is de Serial CLock lijn.
Elke component die aan de lijn hangt heeft een uniek
adres.
Elke component kan afhankelijk van zijn functie zowel als zender als ontvanger
werken.
De Master is het IC dat de commando`s op de bus plaatst. In de I2C protocol
specificatie staat dat het IC, dat de datatransfer begint, de Master is. Elk
ander IC is dan een Slave. De I2C bus is een multi-master bus. Dit
houdt in dat er meer dan één IC de mogelijkheid bezit om de datatransfer te
beginnen. De Master IC`s zijn meestal microcontrollers die het geheel besturen.
Veronderstel dat de controller met een slave wil
communiceren.
(De cursief gedrukte woorden worden in het onderdeel
‘bustoestanden’ uitgelegd.)
De controller begint met een Start conditie op
de bus te plaatsen.
De werkt als
een attentie signaal voor alle IC`s op de bus.
Alle IC`s
luisteren nu op de bus naar binnenkomende data.
Dan zendt de controller het Adres van het
gewenste IC door.
Alle IC`s
zullen het binnenkomende adres vergelijken met hun eigen adres.
De IC’s die
een ander adres hebben reageren niet en wachten tot de bus terug vrijkomt.
Het IC dat wel het juiste adres heeft geneert een Acknowledge op de bus.
Als de controller deze Acknowledge terugkrijgt,
dan begint hij met data te verzenden.
Bij de
overdracht van 8 bits (een byte) heb je acht klokpulsen nodig op de
SCL-lijn.
Deze
klokpulsen worden door de master gegenereerd.
De
geadresseerde slave mag echter de laagtoestand naar eigen behoefte
verlengen.
Deze procedure
wordt ook wel clock stretching genoemd.
Zo kunnen
langzame slaven wachttijden inlassen.
De master
moet hiermee rekening houden.
Bij het transport wordt het hoogwaardigste bit (MSB)
van een byte als eerste verzonden, en het laagstwaardige bit (LSB) als laatste.
Na het verzenden van de data geeft de controller een Stop
conditie.
Hiermee
wordt de bus terug vrijgegeven.
De IC`s die
op de bus hangen beginnen nu terug te luisteren naar een nieuwe Start
conditie.
Toepassingen van I2C.
Omdat het een eenvoudig toe te passen protocol is,
zijn er zeer veel toepassingen van I2C.
Je kunt ze
in bijna alle elektronica producten vinden.
Meestal
beseffen we ons niet eens dat er in een product zoveel elektronica aanwezig is
en zeker geen protocol om de elektronica met elkaar te laten
communiceren.
Hier volgt een lijst van producten waar I2C in
aanwezig kan zijn :
- TV's
- Videorecorders
- Radio's
- Versterkers
- Mengpanelen
- Decoders
- Wasmachines
- LCD displays
I2C interface op de Raspberry Pi
Op de Raspberry Pi kun je de I2C interface gebruiken met de pins
aangegeven op het schema hieronder.
De keuze
welke voltage je wilt gaan gebruiken is uiteraard aan jezelf.