zaterdag 23 maart 2013

Wat is I²C?




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.


Geen opmerkingen:

Een reactie posten