Electronica
I2C - IIC: Inter IC
TechTalk
Het I2C protocol (of IIC: Inter Integrated Circuit) is een eenvoudig protocol die communicatie mogelijk maakt tussen vesrchillende electronische modules. Het wordt nog altijd volop gebruikt en Arduino heeft een library om met dergelijke modules te communiceren.
-

-

Het I2C protocol is niet zo goed gekend, want het wordt vooral gebruikt in de apparaten zelf. Het werd ontworpen in de jaren 1980 om de verschillende delen van een apparaat met elkaar te verbinden (televisietoestel, videorecorder,...). De verbinding kan slechts een paar tientallen centimeters overbruggen en de basisversie is niet snel.

Het protocol wordt nog volop gebruikt door bijvoorbeeld real time clocks, geheugenchips (EEPROM), intelligente sensoren, en dergelijke meer. De computerschermen wisselen informatie uit over de mogelijkheiden van het scherm uit via I2C (VGA, DVI, HDMI) zodat de bron een geschikte beeldformaat en frekwentie kan selecteren.

In een videorecorder waren er verschillende processoren (hoofdprocessor, display processor, servo processor) en randapparatuur zoals de tuner, de klok en een geheugen IC. Ze konden allemaal met elkaar communiceren via twee lijnen.

Philips, die aan de basis van het protocol ligt, bestaat niet meer, het is een naam die op bepaalde apparaten "Made in China" geplakt wordt. De norm wordt nu beheerd door NXP, een onderdelenfabricant die het catalogus van Philips overgenomen heeft.

Het protocol kan met meerdere masters en meerdere slaves werken, waarbij op een bepaald ogenblik slechts één master aktief kan zijn. Er zijn twee communicatielijnen: een datalijn (SDA)en een kloklijn (SCL). Data wordt ingelezen op het ogenblik dat de kloklijn hoog gemaakt wordt. Communicatie is didirectioneel en de apparaten trekken de lijnen naar de massa (in rust zijn d elijnen hoog door een pull up weerstand). Het protocol is zeer eenvoudig en is goed gestandardiseerd.

Normaal levert de aktieve master de klokpulsen maar een slave kan de klok laag maken als die niet klaar is. Verschillend ekloksnelheden zijn mogelijk, maar een nauwkeurige timing is niet nodig. Het is de aktieve master die de kloksnelheid bepaalt.

Een bericht bestaat uit één of meerdere datablokken. Een datablok, dat is één byte die verstuurd wordt (het is dus een protocol met een hoge overhead als er veel data verstuurd moet worden). Als de master een bericht wilt sturen, dan veroorzaakt hij een startconditie en stuurt het adres op de bus. Het adres bestaat uit 7 of 10 bits. Dan wordt er een read of write bit gestuurd om aan te geven of de master data zal versturen of ontvangen.

Data wordt gelezen op het ogenblik dat de klok hoog is. De datalijn mag niet veranderen als de klok hoog is. Een wijziging van de datalijn als de klok hoog is is een startconditie (overgang van hoog naar laag) of een stopconditie (overgang naar hoog). De restart conditie is een nieuwe start conditie zonder dat de master de bus tussendoor vrijgeeft.

Een slave die zijn adres op de bus ziet passeren (na een start conditie) zal een ack signaal produceren. Ziet de processor geen ack, dan wordt het adres niet gebruikt. Dataoverdracht gebeurt in datablokken van 1 byte en de ontvanger stuurt een ack op het einde om aan te geven dat de gegevens ontvangen zijn. Als alle data verstuurd is, stuurt d eprocessor een stop conditie om aan te geven dat de bus vrij is. De master stuurt ook een stop als er na het versturen van een adres geen ack komt van een slave, dit ook om de bus opnieuw vrij te geven.

Een nack code wordt door de slave verstuurd als de opdracht niet uitgevoerd kon worden (write richting slave). Een nack code wordt ook door de master verstuurd als er geen data meer verstuurd moet worden (read richting master). De master kan dan een nieuw bevel geven (restart conditie) of de bus vrijgeven (stop conditie).

Iedere slave moet een uniek adres hebben. ER zijn 127 mogelijke adressen, maar een aantal adressen zijn gereserveerd (broadcast). Bepaalde slave componenten hebben jumpers om de adres in te stellen.

Het 64k EEPROM geheugen gebruikt het I2C protocol. Een of meerdere opeenvolgende bytes kunnen gelezen worden met een enkele instructie.

Het protocol heeft slechts twee lijnen nodig, en dit is interessant bij een arduino, die maar een beperkt aantal digitale lijnen heeft. De te gebruiken library heet Wire. De digitale poort 13 kan niet gebruikt worden, want er zit reeds een led op de poort aangesloten, waardoor een hoog niveau met pull up weerstand niet bereikt kan worden.

Een pen dient zowel als ingang en als uitgang. De poorten moeten als INPUT_PULLUP gedefinieerd worden. Een pen hoog maken is niet toegestaan, want een ander component kan terzelfdertijd de poort laag trekken. Om dergelijke condities tegen te gaan worden de extra modules uitgerust met beveiligingsweerstanden.

Publicités - Reklame

-