Inter-Integrated Circuit (I2C) linja on siru-tason serial viestintä mekanismi, joka toimii yli vain kaksi johtoa. Jotkut kehittäjät lausuvat bussin nimen eye-two-see, toiset Eye-squared-see, mutta molemmat viittaavat samaan asiaan. Kaavailemat Philips 1980-luvun alussa, I2C perustettiin yhtenäistää viestintää yhtiön pelimerkkejä, mutta se on sittemmin tullut de facto-standardi tukee monia mikro-laitteet Arduino levyt Raspberry Pi ja, tietenkin, imps.,
fyysinen väylä
I2C itsessään käsittää kaksi johtoa. Yksi I2C-linja välittää dataa, toinen kellosignaaleja, jotka synkronoivat laitteiden välisen keskustelun. Datalinjan nimi on ”SDA”, kellolinjan ”SCL”.
tyypillisesti sekä SDA että SCL ovat kukin kytkettyinä 3,3-tai 5V-voimalinjaan yhden ”pull-up” – vastuksen kautta, yhden kullakin rivillä. Tämä on tarpeen, koska laitteet’ SDA-ja SCL-yhteydet ovat ’tulppaa’ rivejä: ne voivat pakottaa jännite linjalla 0V, tai ”matala”, mutta ei voi nostaa sen 3.3 V, tai ”korkea”., Korkeat ja matalat ovat 1S: n ja 0s: n sähköiset representaatiot, jotka ovat digitaalisen tiedon peruskomponentteja. Lisäämällä nämä kaksi vastusta-ja linja tarvitsee vain kaksi, riippumatta siitä, kuinka monta laitetta on kytketty siihen – varmistaa jännite nousee takaisin 3,3 V ilman oikosulkua.
I2C vaatii, että laitteissa on avoimet tyhjennysjohdot, joilla varmistetaan, ettei komponenttia vahingoittavia suuria virtauksia pääse virtaamaan, kun kaksi laitetta yrittää signaalia samanaikaisesti.
useimmissa tapauksissa sinun odotetaan lisää nämä vastukset itse, mutta jotkin laitteet, tyypillisesti ne, jotka toimivat 3.,3V, ovat niitä, jotta voidaan yhteensopivia laitteita toimittaa 5V. Muista, sinun tarvitsee vain pull-up-vastukset per linja, joten se voi olla tarpeen poistaa pull-up vastukset kiinnitetty muihin laitteisiin bussissa. Vaikka peikko on sisäinen pull-up vastukset omaa, nämä ovat liian heikko ollakseen hyödyllinen I2C-ja niin ne ovat automaattisesti pois käytöstä, kun sen nastat on asetettu käsittelemään I2C-signaaleja.
– Ohjaimet Ja Oheislaitteet
I2C-väylän erottaa laitteet ’valvojat’ ja ’oheislaitteet’., Vain yksi laite voi lähettää ulos pulsseja ajoitus on SCL-linja kerrallaan, ja se on yksi valittu ohjain. Kaikki muut synkronoivat ajantajunsa ohjaimeen, jolloin niitä pidetään oheislaitteina. Ohjain — tyypillisesti imp — ja sen oheislaitteet voivat kaikki lähettää ja vastaanottaa tietoja, mutta vain rekisterinpitäjä voi kertoa reuna, kun lähettää dataa takaisin.
Käsitellään
jotta yksi I2C-laitteen kommunikoida toisen yksi-yhteen perusteella, molemmat laitteet täytyy olla yksilöllisesti tunnistettavissa. Tämä henkilöllisyys on laitteen I2C-osoite., I2C-osoitteet ovat yleensä 7-bittisiä numeroita, joten väylä voi käsittää kaikkiaan jopa 127 laitetta. Tavu sisältää kahdeksan bittiä; ylimääräinen bitti on käyttää osoittamaan, onko signaali lähetetään rekisterinpitäjän reuna — a ’kirjoittaa’ — tai toiseen suuntaan — on ”lukea”. Tämä kahdeksas bitti on itse asiassa bit zero bussiin lähetetyssä osoitteessa byte. 7-bittinen osoite on sijoitettu Byte-osoitteen bitteihin yksi-seitsemän.
tämän formaatin mukaisesti imp API ottaa I2C-osoitteet 8-bittisenä arvona., Laitetoimittajat antavat yleensä tuotteidensa osoitteet 7-bittisenä numerona, joten osoite on tarpeen muuntaa seitsemästä bitistä kahdeksaan. Tämä saavutetaan Oravan <<
operaattorilla, joka siirtää numeron yksittäiset bittiarvot vasemmalle. Tämä prosessi vastaa kertomista kahdella. Koodi, tämä prosessi näyttää tältä:
local sevenBitAddress = 0x39;local eightBitAddress = sevenBitAddress << 1;
Orava asettaa automaattisesti hieman nollasta oikea I2C-määritelty arvo: 0 kirjoitustoiminnon, 1 luku., Nyt olet valmis käyttämään yksi imp on i2c-menetelmiä kirjoittaa tietoja linja:
i2c.write(eightBitAddress, dataInStringForm);
7-bittinen osoite laitteen, johon haluat imp kommunikoida toimittaa komponentin valmistaja ja listattu laitteen datalehdestä. Sitä ei saa kiinnittää, vaan se valitaan eri osoitteista toiseen laitteisiin kiinnitetyn jännitteen mukaan., Esimerkiksi, TAOS TSL2561 valon anturi on kolme mahdollista osoitteet: 0x29
, 0x49
tai 0x39
riippuen siitä, onko sen ADDR pin on vahvistettu 0V, 3.3 V tai ”kelluva” näiden kahden välillä. Voimme sanoa arvo kelluu, koska se ei ole ollut aktiivisesti valittu toimimaan tietyllä jännite; se voi olla mitä tahansa 0-3,3 V inclusive.
Merkinanto
I2C-bus ohjain käyttää reuna on 7-bittinen osoite, tunnistaa komponentti, se haluaa puhua., Itse asiassa, signalointi on monimutkaisempi kuin, mutta onneksi kaikki yksityiskohdat käsitellään imp niin, että sinun tarvitsee vain toimittaa osoite 8-bittinen arvo.
Jos olet kirjallisesti reuna, sinun täytyy myös toimittaa tiedot kirjoittaa, joka sisältää usein rekisteröidä arvoja, jotka määrää perifeerisen mitä tehdä tietojen kanssa. Imp API-dokumentaatio viittaa rekistereihin kuten ’sub-osoitteita:
i2c.write(eightBitAddress, dataString);
write() vaatii dataa merkkijonon muodossa. Näin ollen, saatat joutua muuntaa arvo tallennetaan muuntyyppisiä muuttuja merkkijono muodossa.,
laitteen tietojen lukeminen voi vaatia käskyn kertoa laitteelle, mitä tietoja haetaan. Kertoo imp lukea tietoja I2C-väylän kuuluu myös antaa kolmas parametri, tavujen voit odottaa saada:
i2c.read(eightBitAddress, controlDataString, numberOfBytesToRead);
Takana nämä toiminnot ovat I2C on sähköisiä signaaleja, sovelletaan SDA-linja synkronoitu ajoitus pulssin soveltaa SCL-linja. Kirjoittamisen linja liittyy start-marker: pudottamalla SDA 0V kun SCL on 3,3 V. Muuttuvat SDA jännite, kun SCL: n jännite on korkea, määritellään käynnistää ja pysäyttää markkereita., Jos SDA-jännite ei muutu SCL: n ollessa korkea, I2C-laitteet tietävät, että tietoja lähetetään merkkiaineiden sijaan.
SDA menee nyt korkealle tai alas lähettääkseen jokaisen Byte-osoitteen bitin: 7-bittisen laiteosoitteen, jota seuraa luku / kirjoitus-bitti. Tavun bitit lähetetään ulos, vasemmalle-eniten hieman — ’eniten merkitsevä bitti’ — ensinnäkin SDA menossa suuri, jos bitin arvo on 1 tai alhainen, jos se on nolla. Kohde perifeerinen nyt vetää SDA alhainen signaalin vahvistus tietojen vastaanottamisesta, ja sitten menee ulos kahdeksan bittiä ohjaus tai tiedot, jonka jälkeen lisää tietoja tarvittaessa., On single-pulse ’ack’ tunnustus tauko SDA välillä aina kahdeksan bittiä lähetetään, ajoitettu yhdeksäs SCL pulssi. Jos reuna ei saaneeni tällä tavalla, ohjain tunnistaa, että SDA on pysynyt korkeana ja signaalin virhe.,
Kun data virtaa reuna-ohjain, jälkimmäinen myös toteaa, vastaanottamisesta kahdeksan bittiä vetämällä SDA alhainen yhdeksäs SCL pulssi, ellei tämä on viimeinen tavu erän, jolloin säädin ei vedä SDA alhainen — se tekee ’ek’ – signaalia, tai ei kuittaus’ — jotta reuna tietää, että se on valmis.
kun olemme valmiit, SDA menee korkealle pysäytysmerkkinä.,
käynnistä siirto on merkitty SDA pudottamalla Korkea Matala jännite (suorakulmion vasemmalla),
pysähtyä taakse (oikea suorakulmio). SCL on oltava Korkea, kun tämä tapahtuu
Ajoitus
standardin kellon nopeus I2C viestintä on 100kHz — 100,000 SCL pulssia sekunnissa. Se on mahdollista mennä nopeammin, jopa 400kHz. Jotkut laitteet eivät ehkä pysty tukemaan tätä nopeutta; tarkista datalehti, joka liittyy laitteeseen haluat liittää imp., Kuitenkin, monet hidas laitteet käyttävät tekniikkaa kutsutaan ’clock venyttely’ pakottaa nopeammin laitteet toimimaan niiden nopeus. Imp tukee laitteita, jotka käyttävät tätä tekniikkaa. Pohjimmiltaan ne pitävät SCL Alhainen, kun he hakevat tiedot haluat ne lähettää imp. Imp havaitsee tämän, vapauttaa SCL-linjan ja odottaa, kunnes SCL menee taas korkealle ennen kuin jatkaa.
Kuitenkin, sinun täytyy ehkä alentaa I2C nopeus itse, jos sähköiset ominaisuudet set-up hidastaa nopeutta siirtyminen 0V ja 3.3 V, nimeltään ”nousuaika”., Tämä johtuu usein pitkistä johdoista, jotka lisäävät piirin kapasitanssia. Jotta laitteet pystyvät havaitsemaan jokaisen bitin lähetyksen onnistuneesti, väylän on kuljettava hitaammin. Tietojen korruptio tai yllättävät tulokset ovat vihjeitä, joita kannattaa varoa. Vähennä I2C-väylän nopeutta, kunnes tiedot luetaan onnistuneesti.
imp API: ssa on tällä hetkellä neljä ennalta määriteltyä kelloarvoa: 10, 50 100 ja 400khz., Ne valitaan kulkee jatkuvasti I2C-määritys parametri:
i2c.configure(speedConstant);
missä arvo speedConstant on yksi
- CLOCK_SPEED_10_KHZ
- CLOCK_SPEED_50_KHz
- CLOCK_SPEED_100_KHZ
- CLOCK_SPEED_400_KHZ
perustaa yhdennetyn meripolitiikan I2C
I2c-objektin esimerkkiä riviä koodia edellä ei ole säädetty suoraan imp, mutta valitsemanne jonka mukaan valitsemasi imp on nastat voit käyttää I2C-viestinnän., Jokaisessa imp-tyypissä on useita I2C-linja-autoja, jotka kaikki ovat saatavilla käynnistyksen yhteydessä. Tutustu pin mux tyyppi imp käytät nähdä, mitkä I2C esineitä ovat käytettävissä sinulle. Oletamme, että käytät imp001: tä. Se imp001 on kaksi I2C-bussit ovat nastat 1 ja 2, ja nastat 8 ja 9, vastaavasti instanced kuten ominaisuuksia i2c12 ja i2c89 laitteisto esine, kun imp käynnistyy. Nastat 1 ja 8 osoitetaan SCL: lle, 2 ja 9 SDA: lle.,
on tavallista, että viittaus valinta globaali muuttuja:
i2c <- hardware.i2c12;i2c.configure(CLOCK_SPEED_100_KHZ);
Esimerkki Koodi
seuraava koodi toimii TAOS TSL2561 näkyvä ja infrapuna-valon anturi, 3.3 V, laite, joka käyttää I2C-kommunikoida sen isäntä mikro. Sirun datalehden voi ladata Adafruit-sivustolta. Adafruit myy siru edullinen breakout aluksella, joka sisältää sopivia pull-up vastukset Power pin, VCC. Tämä tarkoittaa, että se on valmis kytkeytymään suoraan imp: n I2C-nastoihin.,
Adafruit on TSL2561 breakout board
Huomautus Kun tämä artikkeli on kirjoitettu, Adafruit päivitetty sen TSL2561 anturi aluksella. Uusi versio toimii nykyisellä koodilla.
Tässä on koodi, agentti, ja sitten laite:
Mitä Koodi Tekee,
agentti-koodi vastaa saapuvan HTTP-pyynnön ilmoittamalla laite, että se vaatii käsittelyä. Yksinkertaisuuden vuoksi lukema näkyy yksinkertaisesti lokissa.
laitteen koodi lukee anturin ja laskee lux-arvo mukaan matematiikka on määritelty TSL2561 datasheet., Ensimmäinen osa ohjelmaa määrittää vakioita varten TSL2561 keskeiset rekisterit ja asetukset, mukaan lukien sen I2C-osoite vaihtoehdot. Muita vakioita käytetään luminositeetin muuntoprosessissa.
Johdot ylös imp
At program start point, koodi aliakset yksi imp on I2C-pin asettaa globaali muuttuja, määrittää väylänopeus 100 khz, ja sitten siirtää TSL2561 on I2C-osoite, yksi vähän vasemmalle, joten se on valmis käytettäväksi imp I2C-toimintoja. Sitten se asettaa sensorin., Vain tarkistaa tämä on toiminut, luemme control register: paluu arvo olisi 3, jos TSL2561 on juuri aloittanut, tai 51, jos laite on jo kytketty päälle.
seuraavaksi koodi asettaa sensorin ADC-resoluution TSL2561: n ajoitusrekisterin kautta ja asettaa sitten signaalivoiton korkealle.
Lopuksi, me kertoa imp miten vastata "sense"
ilmoitukset agentti. Tämä kutsuu funktiota, joka lukee TSL2561: n kaksi valoanturia, joiden digitaaliset arvot tallennetaan sirun neljään 8-bittiseen ADC-rekisteriin., Kaksi ensimmäistä antavat 16-bittisen yhdistetyn optisen ja Infra-punaisen lukeman, toinen pari 16-bittisen IR-arvon. Toiminnot readSensorAdc0() ja readSensorAdc1() muuntaa yksittäisen rekisterin arvot osaksi 16-bittinen numerot, kertomalla eniten merkitsevä tavu 256 ja lisäämällä arvo vähiten merkitsevä tavu. Kertolasku suoritetaan siirtämällä kahdeksan-bittinen numero bittejä vasemmalle kahdeksan paikkoja Oravan << operaattori.,
koodi sitten tarjoaa nämä molemmat lukemat kolmannen tehtävän laskea lopullinen kirkkaus, ’lux’ – arvo.
kirjallisuutta
- I2C-Virheet — Miten debug I2C lukea ja kirjoittaa ongelmat