I2C

I2C er en to-lednings seriebus, der bruges til at forbinde en mikrokontroller med flere perifere chips eller moduler. Den er især nyttig, når du vil spare pins på en Arduino og stadig kommunikere med sensorer, displays eller andre tilsluttede moduler.

Den simple forbindelse

Selve I2C-kommunikationen bruger to signalledninger mellem enhederne:

Simpel I2C-forbindelse mellem en master og en slave med SDA, SCL, forsyning og GND
Der er 2 I2C-signalledninger: SDA og SCL. I en praktisk forbindelse kommer normalt også forsyning og GND med, altså typisk 4 ledninger i alt.

SDA og SCL er busledninger, ikke en separat direkte forbindelse for hver enhed. Flere enheder kan derfor dele de samme to signalledninger, hvis de har forskellige adresser.

Hvordan I2C fungerer

Hastighed i byte

Et I²C-data-byte kræver normalt 9 clockslag: 8 til data og ét til kvittering. Derfor er byte-raten lavere end antallet af clockslag pr. sekund:

Tallene er regneeksempler før adresser, START/STOP, gentagne START, ventetid og clock stretching. Mange sensorer understøtter kun standard- eller fast-mode, så brug den laveste grænse, som alle enheder på bussen understøtter.

Typiske egenskaber

På Arduino Uno

Eksempler på brug

Vigtige begreber

Flere slaver på samme bus

En master kan kommunikere med flere slaver på de samme SDA- og SCL-ledninger. Hver slave skal normalt have en adresse, så masteren kan vælge, hvem der skal svare.

I2C-bus med en master og tre slaver, der deler SDA og SCL
Alle enheder deler SDA og SCL. Forsyning og GND føres også til hver enhed, mens pull-up-modstande løfter SDA og SCL mod forsyningen.

Avanceret: tidslinje for SDA og SCL

På tidslinjen nedenfor starter masteren kommunikationen med START. Derefter sendes typisk en 7-bit adresse, en bit for læs/skriv og en ACK-bit. Kommunikation afsluttes med STOP.

Officiel Arduino-figur af en I2C-meddelelse med START, 7-bit adresse, læs-skriv-bit og ACK
Officiel Arduino-figur af I2C-meddelelsens felter. Figuren viser protokolrækkefølgen; SDA og SCL er de to fysiske signalledninger, der bærer og synkroniserer denne meddelelse.

Tidslinjen er et forenklet eksempel. Den præcise sekvens afhænger af, om masteren læser eller skriver, og om enheden bruger gentaget START, flere databytes eller clock stretching.

Kilder

Den lokale figur er hentet fra Arduino-dokumentationens offentlige kildearkiv: I2C.png. Arduino-dokumentationen angiver CC BY-SA 4.0; krediteringen skal bevares ved viderebrug.