Sarjaliikenne – I2C

Alunperin julkaistu: 11.2.2017

Viimeksi muokattu: lauantai 9.12.2017

Sarjamuotoisista tiedonsiirtoväylistä yhtenä paljon käytössä olevana väylänä on I2C-väylä. Tämä väylä on Philipsin (nykyisin NXP) kehittelemä sarjaväylä, josta voidaan käyttää myös nimitystä IIC (Inter-Integrated Circuit) tai pelkästään I2C (ilman numeron kaksi yläindeksointia). Atmelin käyttämä TWI (Two Wire Interface) on fyysisesti samanlainen, mutta protokolla ei 100%:sti ole yhteneväinen I2C:n kanssa, mutta yleensä TWI ja I2C laitteet ovat keskenään yhteensopivia.

I2C-väylä ei ole kaikista aloittelijaystävällisin väylä, mutta pienen painiskelun jälkeen sen kanssa tulee kyllä toimeen.

I2C-laitteet ovatkin suosittuja helpon liittämisen ansiosta ja suhteellisen yksinkertaisen protokollan vuoksi, vaikka protokollan yksinkertaisuudesta voidaan toki olla montaa mieltä. Myös väylän fyysinen kytkentä on hyvin yksinkertainen, koska tarvitaan vain kaksi johdinta.

I2C-väylää käytetäänkin paljon esimerkiksi televisioiden ja näyttöjen kaapeleissa, mistä liitettävä laite tunnistaa näytön tyypin ja valmistajan ja voi näin ollen hakea vaikkapa laitekohtaisia asetuksia.

Tällä sivulla koitan selittää aloittelijalle sopivaan sävyyn I2C-väylän perusasioita, jotta mystinen väylä hieman avautuisi. Aloitetaankin väylän fyysisestä rajapinnasta ja tarkastellaan lopuksi kuinka kommunikaatio väylällä prokotollan mukaan hoituu.

I2C-väylän fyysiset signaalit

Väylä perustuu kahteen signaaliin, joista toinen vie kellopulssia ja toinen dataa orjalaitteelle. Signaalien nimet ovat vastaavasti SCK tai SCL ja SDA tai DATA, tai jotain tähän suuntaan olevaa. Logiikkajännite voi olla 3.3V tai 5V, vaikka on mahdollista että muitakin jännitteitä käytetään, nämä ovat ne yleisimmät.

 

Kuvan lähde.

Väylällä on kaksi ylösvetovastusta, jotka pitävät signaalit "1"-tilassa. Näin ollen väylän perustila on helppo esimerkiksi yleismittarilla tarkistaa. Ylösvetovastusten arvo riippuu hieman käytetyn väylän nopeudesta, mutta aika yleisesti näkee käytettävän 4700 ohmin vastuksia, jota voidaan pitää ihan hyvänä nyrkkisääntönä I2C-väylän ylösvetovastuksena (ainakin kun laitteita on vain muutama).

Vastuksien arvot eivät ole niin kriittisiä, joten jos kaapissa ei satu olemaan 4k7-vastuksia, niin aivan hyvin voi käyttää jotain muutakin vastusarvoa, kunhan sen arvo mitataan kilo-ohmeissa. Vastukset on kuitenkin oltava, sillä muuten väylä ei toimi.

Orjalaite on mikä tahansa laite, joka ei lähetä kellopulssia kyseisenä ajanhetkenä, jolloin tietoa siirretään. Tästä voitkin jo varmaan päätellä, että siellä missä on orja niin täytyy olla isäntäkin. Isäntälaite näin ollen on väylää hallitseva laite ja hoitaa kellotuksen ja datan lukemisen sekä kirjoituksen.

Ennen tiedonsiirron käsittelyä selvitetään kuitenkin, miten ihmeessä on mahdollista että väylällä voi olla useampi laite yhtäaikaa?

I2C-väylän laitteet ja osoitteet

Koska I2C-väylällä voi olla useampi laite, niin laitteet erotellaan toisistaan osoitteiden avulla. Osotteita voidaan lunastaa NXP:ltä, mutta harrastelijan taikka antureita käyttävän ohjelmoijan kannalta tästä ei tarvitse huolehtia, tämä on enemmänkin I2C-laitevalmistajan huoli. Tärkeintä on, että samalla väylällä ei ole kahta samaa osoitetta käyttävää laitetta.

I2C-laitteet voivat käyttää 7- tai 10-bittistä osoitetta, joista 7-bittinen osoite on yleisempi.

Erilaisilla laitteilla on erilaiset osoitteet ja samaan perheeseen kuuluvat laitteet voidaan yleensä konfiguroida useampaan eri osoitteeseen. Tätä varten laitteissa on monesti osoitepinnit (address) joita 1:een tai 0:aan kytkemällä saadaan haluttu osoite käytettävälle laitteelle. Mikrokontrollerit voidaan ohjelmallisesti puolestaan asettaa mihin tahansa haluttuun osoitteeseen. Alla olevassa kuvassa on esimerkin vuoksi esitetty TMP101 I2C-lämpötila-anturin jalat, joista huomataan mainitut osoitepinnit (ADD0).

Kyseisen piirin datasivulla mainitaan, että laitteen 7-bittinen osoite on 0x90, mikäli laitteen ADD0 -pinni on kytketty maahan. Mikäli ADD0 on jätetty kellumaan (eli ei ole kytketty mihinkään), niin laitteen osoite on 0x91. Laitteen osoite on 0x92 mikäli ADD0-pinni on jätetty kellumaan. Alla oleva taulukko on peräisin datalehdestä, missä osoitteet mainitaan.

TMP101 osoite

Tarkkasilmäinen lukija huomaa, että osoite ei itse asiassa kuitenkaan ole 0x90, 0x91 tai 0x92, koska käytössä on vain 7 bittiä. Tähän palataankin hieman myöhemmin tarkemmin, mutta sanottakoon jo nyt tässä vaiheessa, että I2C-väylän laiteosoitteen jälkeen tuleva R/W-bitti kertoo onko kyseessä kirjoitus vai lukukomento, jolloin osoitetta siirretään bitin verran vasemmalle ja siihen lisätään tämä R/W-bitti ja saadaan näin yllä mainitut osoitteet.

I2C-väylällä voi siis olla maksimissaan 3 eri TMP101 anturia, mutta ei enempää. Maksimimäärän rajoittaakin osoiteavaruus, joka on tässä tapauksessa 3.

Koska ainoastaan isäntälaite kellottaa väylää, niin kommunikointi tapahtuu isännän ehdoilla ja sen nopeudella. Isäntälaitteita voi olla väylällä aktiivisena kerrallaan vain yksi kappale, mutta väylässä voi toki olla useampi isäntälaite liitettynä. Tällöin väylä on ns. multi-master -väylä.

Orjalaitteiden tehtävänä on osoitteen kohdalla aina vastata, onko väylälle kirjoitettu osoite oikein vai ei. Mikäli orjalaitteen osoite väylälle ilmaantuu, orjalaite vastaa siihen ACK-bitillä (acknowledge), jolloin väylän SDA-linja menee nollaan. Mikäli orjalaitteen osoitetta väylälle ei ilmaannu (eli osoitetta ei ole kirjoitettu ollenkaan tai se on väärin), SDA-linjassa ei tapahdu muutoksia ja ACK-bitti tulkitaan NACK-bitiksi (not acknowledge).

Lyhyestä jälleen virsi kaunis, joten todetaan yhteenvetona että I2C väylässä on siis aina olemassa vähintään yksi isäntälaite (master) ja yksi tai useampi orjalaite (slave). Kullakin orjalaitteella on osoite, jonka avulla isäntälaite erottaa laitteet toisistaa ja orjat vastaavat omaan osoitteeseensa ACK-bitillä.

I2C Tiedonsiirtonopeudet

Normaalisti lähes kaikki laitteet tukevat oletuksena 100 kHz:n kellopulssia. Hidas kellopulssi mahdollistaa pitkät tiedonsiirtomatkat (pitkät kaapelit), mutta tietoa ei kuitenkaan mahdottoman nopeasti voida tällöin siirtää. Yleensä kuitenkin I2C-laitteet ovat piirilevyllä isäntälaitteen kanssa, jolloin nopeutta eli kellopulssin taajuutta voidaan nostaa ja näin ollen tiedonsiirtonopeutta kasvattaa. Käytännössä väylän pituus rajoittuu muutamaan metriin, mutta usein ei ole tarvetta siirtää pitkiä matkoja tietoa juuri I2C-väylää käyttäen vaan tähän käytetään muita yhteyksiä.

Philipsin spesifikaatio määrittelee myös nopeamman yhteysnopeuden, joka toimii 400 kHz:n nopeudella. Tästä käytetään myös nimitystä fast-mode.

Fast-modesta nopeampi yhteysnopeus on High-Speed-mode jonka kellona 3,4 Mhz:n nopeus.

I2C Tiedonsiirto

Tiedonsiirtoprotokollassa määritellään, kuinka kommunikointi väylällä tapahtuu. Mutta jotta tekstistä ei tulisi liian tekniikkapainotteista, koitan alle selittää "maallikon" sanoin miten isäntälaite kommunikoi orjalaitteiden kanssa.

Data siirretään I2C-väylässä 8-bitin ryhmissä ja tähän ryhmään kuuluu myös 7-bittinen osoite. Osoitteeseen lisätään R/W-bitti, joka ilmaisee laitteelle onko komento luku-vai kirjoituskomento ja kun bitti on osoitteeseen lisätty, saadaan siitä 8-bittinen rimpsu väylälle kirjoitettavaksi.

R/W-bitti on 1 silloin, kun laitteelta luetaan dataa ja 0 kun laitteelle kirjoitetaan dataa. Kun ajattelee osoitetta 8-bittisenä lukuna, on se helpompi tulkita. Mikäli luku on jaollinen kahdella, niin laitteelle kirjoitetaan dataa ja jos ei, niin siltä luetaan dataa.

Kaikki tiedonsiirto alkaa aina START-tilalla ja päättyy STOP-tilaan ja ainoastaan isäntälaite voi aloittaa tiedonsiirron. Orjalaitteet eivät koskaan aloita tiedonsiirtoa, mutta aloittavat kuuntelemaan väylää heti START-tilan jälkeen. Tämä mahdollistaa sen, että orjalaitteet voivat vastata (ACK) osoitteeseensa, mikäli sellainen väylälle ilmestuu.

Alla olevassa kuvassa on esitetty kuinka START ja STOP -tilat väylällä näkyvät.

I2C-väylän aloitus ja lopetus -sekvenssit

Kuvan lähde.

Kun START on väylälle annettu, lähetetään sinne seuraavaksi 7-bittinen osoite mihin on lisätty kahdeksas R/W-bitti. Esimerkiksi TMP101 anturin ollessa kyseessä (ja oletetaan että sen ADD0 pinni on ilmassa), kirjoitetaan väylälle 0x93 kun sieltä luetaan dataa ja kun TMP101-anturille kirjoitetaan dataa niin osoite on 0x92.

Käytännössä väylälle tehdään 8-bitin vaatima kellojaksojen määrä (eli 8 pulssia), sekä yhdeksäs pulssi minkä aikana I2C-orjalaite vastaa onko osoite oikein (ACK). Myös kirjoitettuun dataan vastataan orjan puolesta ACK-bitillä ja jos isäntälaite lukee dataa, yhdeksännen kellopulssin aikana isäntä vastaa ACK-bitillä luettuun tietoon. Alla olevassa kuvassa nähdään vaaditut kellosignaalit ja bitit START-tilan jälkeen.

I2C-väylän osoite ja RW-bitti

Kuvan lähde.

Loput tavuista, olipa ne luettavia tai kirjoitettavia tavuja kellotetaan väylälle 8-bitin ryhmissä peräjälkeen (+1 ACK/NACK bitin vaatima kellojakso). Tavujen välissä ei tarvitse pitää taukoa, joten käytännössä kellopulssi voi olla yhtenäinen sarja 1- ja 0-tiloja niin kauan että kaikki tieto on siirretty.

Kun kirjoitus- tai lukuoperaatiot on tehty, niin väylälle tehdään STOP-tila ja orjalaitteet lakkaavat kuuntelemasta väylää.

I2C-väylän luku- ja kirjoitusoperaatio pähkinänkuoressa

I2C-väylälle kirjoitettaessa toimitaan yleensä seuraavasti:

  1. Väylälle tehdään START-tila.
  2. Väylälle kirjoitetaan orjan osoite ja merkitään R/W-bitillä, että seuraava operaatio on kirjoitustoiminto.
  3. Kirjoitetaan väylälle rekisterin osoite, mihin kirjoitusoperaatio kohdistetaan.
  4. Kirjoitetaan haluttu data (vähintään 1 tavu).
  5. (Valinnainen kohta) Kirjoitetaan muut tavut jos tarpeellista.
  6. Tehdään STOP-tila.

I2C-väylältä luettaessa toimitaan yleensä seuraavasti:

  1. Väylälle tehdään START-tila.
  2. Väylälle kirjoitetaan orjan osoite ja merkitään R/W-bitillä, että seuraava operaatio on lukutoiminto.
  3. Kirjoitetaan väylälle rekisterin osoite, mihin lukuoperaatio kohdistetaan.
  4. Luetaan haluttu data (vähintään 1 tavu).
  5. (Valinnainen kohta) Luetaan muut tavut jos tarpeellista.
  6. Tehdään STOP-tila.

On myös mahdollista, että laitteella ei ole ollenkaan rekistereitä, vaan luku- ja kirjoitustoimintoja tehdään heti osoitteen ja R/W-bitin lähettämisen jälkeen. Tässä tapauksessa yllä olevista listoista voidaan ruksia yli kolmas kohta.

Lopuksi

Tässä oli lyhyt katsaus I2C-tiedonsiirtoon yleisellä tasolla. Laitteiden toiminta ja väylän käyttö selviää parhaiten, kun alkaa itse tekemään ja tutkimaan. Laitteiden datasivuissa on usein ohjeita sekä ajoituskaavioita, joista nähdään väylän toiminta kellopulsseineen kyseisellä laitteella.

Lisää infoa väylästä ja sen toiminnasta (mikäli tässä ei tullut selväksi) löytyy internetistä, useimmiten kuitenkin englannin kielellä. Linkit ja muut lähteet, joita tekstin kirjoituksen aikana on jonkun verran käytetty löytyy alta.

Lähteitä:
http://www.robot-electronics.co.uk/acatalog/I2C_Tutorial.html
http://en.wikipedia.org/wiki/I%C2%B2C
http://www.i2c-bus.org/twi-bus/
Opinnäytetyö: Karhu, Mika: I2C-väylä: ominaisuudet ja mittaukset