3.23. I2C:n perusteet¶
I2C (Inter-Integrated Circuit, lausutaan ”I-squared-C” tai ”I-two-C”) on kaksijohtiminen sarjaväylä, joka on suunniteltu saman kortin sirujen välisiin lyhyen kantaman yhteyksiin. Se sijoittuu prioriteeteissaan SPI:n ja UARTin väliin: hitaampi kuin SPI mutta säästeliäämpi nastojen suhteen, ja osoitteistettu (useita laitteita samoissa kahdessa johtimessa), kun taas SPI tarvitsee oman CS-linjan jokaiselle laitteelle.
I2C on suosituin väylä matalan nopeuden sensoreille – kiihtyvyysantureille, lämpötila-antureille, kosteusantureille, magnetometreille, reaaliaikakelloille, EEPROM-muisteille – joissa nastojen ja väylän monimutkaisuuden säästäminen merkitsee enemmän kuin raaka läpäisykyky.
3.23.1. Kaksi johdinta, molemmat avokollektori¶
I2C-väylässä on vain kaksi signaalia:
SCL (sarjakello). Ohjaimen ajama (suurimman osan ajasta).
SDA (sarjadata). Sen laitteen ajama, joka kulloinkin puhuu – ohjain osoitteen ja lähtevän datan aikana, oheislaite lukujen ja ACK-bittien aikana.
Molemmat linjat ovat avokollektorilinjoja: jokainen väylän laite voi vetää linjan alas maahan mutta ei koskaan aja sitä korkealle. Kaksi väylällä olevaa ylösvetovastusta (tyypillisesti 2.2 kΩ – 10 kΩ käyttöjännitekiskoon) nostavat linjat korkealle, kun kukaan ei vedä niitä alas. Wired-OR-toiminta seuraa tästä – mikä tahansa laite, joka vetää linjan alas, voittaa, ja korkea tila tarkoittaa vain ”kukaan ei puhu”.
MCU:n sisäiset ylösvetovastukset sen SCL- ja SDA-nastoissa eivät yleensä ole riittävän vahvoja toimiakseen väylän ylösvetovastuksina yksinään; väylällä tarvitaan normaalisti ulkoisia vastuksia. Monet sensorin breakout-kortit sisältävät ne jo valmiiksi; tarkista datalehti ennen lisävastusten lisäämistä.
3.23.2. Tapahtuma¶
Jokainen I2C-tapahtuma noudattaa samaa muotoa:
I2C-tapahtuma: START, 7-bittinen osoite + R/W, ACK, rekisteri, ACK, data, NACK, STOP.¶
Vaihto etenee bitti kerrallaan:
START. Ohjain vetää SDA:n alas SCL:n ollessa vielä korkealla. Tämä epätavallinen reuna kertoo jokaiselle väylän laitteelle, että tapahtuma on alkamassa.
Osoite + R/W. Ohjain kelloittaa ulos 7-bittisen oheislaiteosoitteen, jota seuraa yksi luku/kirjoitus-bitti (
0kirjoitukselle,1luvulle).ACK / NACK. Jokaisen tavun jälkeen vastaanottaja ajaa SDA:ta yhden kellojakson ajan kuitatakseen ACK (matala) tai NACK (korkea). Osoitetavussa oheislaite kuittaa, jos se tunnistaa oman osoitteensa; jos mikään laite ei kuittaa, ohjain näkee NACK:n ja tietää, ettei osoite ole väylällä.
Datatavut. Jokaista seuraa vastaanottajan ACK. Kirjoituksessa oheislaite kuittaa jokaisen tavun; luvussa ohjain kuittaa jokaisen tavun, jota se haluaa lisää, ja NACK:aa viimeisen tavun kertoakseen oheislaitteelle, että se lopettaa.
STOP. Ohjain vapauttaa SDA:n korkealle SCL:n ollessa korkealla, mikä päättää tapahtuman.
Toistettu start (repeated start) on toinen START, joka annetaan ilman välissä olevaa STOPia – ohjain vaihtaa suuntaa (kirjoita osoite, sitten lue osoite) samalla oheislaitteella luopumatta väylästä.
3.23.3. Osoitteistus¶
7-bittinen osoiteavaruus kattaa 0x08 – 0x77; päissä olevat arvot on varattu erityistarkoituksiin. Jokaisen laitteen osoitteen asettaa sirun suunnittelija; monet komponentit sallivat muutaman alimman bitin muuttamisen korttitasolla (sitomalla nasta korkealle tai matalalle), jotta kaksi samaa sensoria voivat olla samalla väylällä.
Jos kaksi laitetta jakaa saman osoitteen, ei ole mitään tapaa puhua toiselle niistä ilman, että toinen häiritsee, joten tarkista datalehti ennen komponenttien yhdistämistä. i2c.scan() (käsitelty sivulla I2C koodissa) käy läpi osoiteavaruuden ja raportoi, mitkä osoitteet vastaavat, mikä on vakiotapa selvittää, mitä väylällä on.
3.23.4. Vahvuudet ja heikkoudet¶
Väylän vahvuudet ja heikkoudet määrittävät sen kapean alan:
Kaksi nastaa monille laitteille. Yksi SCL/SDA-pari voi kuljettaa kymmeniä sensoreita. SPI tarvitsisi ylimääräisen CS-nastan laitetta kohden.
Vakionopeudet.
100 kHz(”standard mode”) ja400 kHz(”fast mode”) kattavat lähes jokaisen sensorin.1 MHzon saavutettavissa, mutta se alkaa vaatia enemmän väyläkapasitanssilta ja ylösvetovastusten mitoitukselta.Hidas SPI:hin verrattuna. Mikä tahansa, joka siirtää enemmän kuin muutaman sadan kilobitin sekunnissa, haluaa SPI:n sen sijaan.
Osoiteristiriidat. Kaksi laitetta, joilla on sama osoite yhdellä väylällä, on laitteistovirhe, jota protokolla ei voi kiertää.