Inter-Integrert Krets (I2C buss er en chip-nivå seriell kommunikasjon mekanismen som opererer i løpet av bare to ledninger. Noen utviklere uttale buss’ navnet eye-to-se, andre eye-squared-se, men begge refererer til det samme. Utviklet av Philips tidlig på 1980-tallet, I2C ble etablert for å standardisere kommunikasjon mellom selskapets chips, men det har siden blitt en de facto standard som støttes av mange mikrokontroller enheter fra Arduino styrene til Raspberry Pi og, selvfølgelig, imps.,
De Fysiske Buss
I2C seg selv består av to ledninger. En I2C linje overfører data, den andre klokken signaler som synkronisere samtalen mellom enheter. Dataene linje kalles «SDA», den clock line ‘SCL’.
Vanligvis, både SCL SDA og er knyttet til hver 3,3-eller 5V strøm-linje gjennom et enkelt «pull-up» – motstand, ett på hver linje. Dette er nødvendig fordi enheter’ SDA og SCL-tilkoblinger er «åpent avløp’ linjer: de kan tvinge spenningen på linjen til 0V, eller «lav», men kan ikke heve den til 3,3 V, eller «høy»., Høyt og lavt er de elektriske representasjoner av 1s og 0s som er den grunnleggende komponenter av digital informasjon. Å legge til disse to motstander — og buss-må bare to, uansett hvor mange enheter er koblet til det — sikrer at spenningen stiger tilbake til 3,3 V uten en kortslutning.
I2C insisterer enheter har åpent avløp linjer for å sikre at ingen del-skade høye strømmer er i stand til å flyte når to enheter prøv og signal samtidig.
I de fleste tilfeller, du vil bli forventet å legge til disse motstander selv, men noen enheter, typisk de som opererer på 3.,3V, inkludere dem i, for å være kompatibel med enheter som leverer 5V. Husk, trenger du bare et par av pull-up motstander per buss, så det kan være nødvendig å fjerne en pull-up motstander koblet til andre enheter på bussen. Selv om imp har interne pull-up motstander av sin egen, disse er for svak til å være nyttig for I2C og slik at de er automatisk deaktivert når pinnene er satt til å håndtere I2C-signaler.
– Kontrollere Og-Tilbehør
I2C buss skiller enheter i ‘kontrollere’ og ‘enheter’., Bare en enhet kan sende ut timing pulser på SCL linje av gangen, og det er ett valgt å være kontrolleren. Alle de andre synkronisere sine timings til kontrolleren, og er dermed ansett som tilbehør. Kontrolleren — vanligvis imp — og periferiutstyr alle kan sende og motta data, men bare kontrolleren kan fortelle en perifer når du skal overføre data tilbake.
Adressering
for en I2C-enheten til å kommunisere med en annen på en en-til-en basis, begge enhetene må være unikt identifiserbar. Denne identiteten er den enheten som er I2C-adresse., I2C-adresser er vanligvis 7-bits tall, slik at en buss kan bestå av opptil 127 enheter i det hele tatt. En byte består av åtte bits; den ekstra biten brukes til å indikere om signalet blir sendt av kontrolleren til perifere — en ‘skrive’ — eller i den andre retningen — en «lese». Denne åttende bit er faktisk bit null i adresse-byte som er sendt ut på bussen. 7-bit-postadressen er plassert i biter én til sju av adressen byte.
I tråd med dette formatet, imp API tar en I2C-adresser som et 8-bits verdi., Enheten leverandører vanligvis gi sine produkter’ adresser som en 7-bits tall, så det er nødvendig å konvertere adressen fra syv bits til åtte. Dette er oppnådd med Ekorn ‘ s <<
operatør, som beveger seg et antall individuelle bit-verdier til venstre. Denne prosessen er tilsvarende å gange med to. I kode, kan denne prosessen ser ut som dette:
local sevenBitAddress = 0x39;local eightBitAddress = sevenBitAddress << 1;
Ekorn setter automatisk bit null til riktig I2C-definert verdi: 0 til en skrive operasjon, 1 for en leser., Nå er du klar til å bruke en av imp ‘ s i2c metoder til å skrive data til buss:
i2c.write(eightBitAddress, dataInStringForm);
7-bit-adressen til enheten som du vil din imp til å kommunisere med vil bli levert av komponenten produsenten, og som er oppført på enhetens dataark. Det kan ikke være fast, men valgte fra en rekke adresser i henhold til den spenningen som brukes til et annet av enheter pinner., For eksempel, en TAOS TSL2561 lyssensor har tre mulige adresser: 0x29
, 0x49
eller 0x39
, avhengig av om sin ADR pin-koden er satt til 0V, 3,3 V eller «flytende» mellom de to. Vi si verdien er flytende fordi det ikke har vært aktivt valgt å fungere på en bestemt spenning; det kan være alt fra 0 til 3,3 V inclusive.
Signalering
I2C-buss’ controller bruker en perifer s 7-bit-adresse for å identifisere en komponent som den ønsker å snakke med., Faktisk, signaleringen er mer komplisert enn som så, men heldigvis alle detaljer er håndtert av imp, slik at du trenger bare oppgi adresse som et 8-bits verdi.
Hvis du skriver til den eksterne, må du også levere data til å skrive, som ofte inkluderer registrere verdier som instruere de perifere hva med data å gjøre. Imp API-dokumentasjonen henviser til disse registrene som «sub-adresser’:
i2c.write(eightBitAddress, dataString);
skriv() krever data i streng form. Følgelig kan det hende du må konvertere verdien som er lagret i andre typer variable i streng form.,
Lese informasjon fra en enhet som krever en kommando for å fortelle den enheten som har data å hente. Forteller imp til å lese data fra I2C buss innebærer også å gi en tredje parameter, antall byte som du kan forvente å motta:
i2c.read(eightBitAddress, controlDataString, numberOfBytesToRead);
Bak disse operasjonene er I2C elektriske signaler som brukes til SDA linje synkronisert med timing pulser brukes til SCL-linje. Å skrive til bussen innebærer en startmerket: slippe SDA til 0V mens SCL er 3.3 V. Endre SDA spenning når SCL er spenningen er høy definerer start-og stopp-markører., Hvis SDA spenning endres ikke mens SCL er høy, I2C-enheter vite at data, snarere enn markører, er blitt sendt.
SDA nå går høyt eller lavt for å sende ut hver bit av adresse-byte: 7-bit-enheten adresse etterfulgt av lese/skrive-bit. Byte s bits er sendt ut venstre-bit — den mest signifikante bit’ — først med SDA går høyt om biters verdi er 1 eller lavt hvis det er null. Målet perifer vil nå trekke SDA lav til å signal bekreftelse av mottak av data, og deretter går ut åtte biter av kontroll, informasjon eller data, etterfulgt av mer data hvis det er nødvendig., Det er en enkelt puls ‘ack’ bekreftelse pause på SDA mellom hver åtte bits som sendes, tidsbestemt til en niende SCL-puls. Hvis de perifere ikke bekrefte mottak denne måten, kontrolleren vil oppdage at SDA har holdt seg høy og vil signalisere en feil.,
Når data strømmer fra perifer til kontrolleren, sistnevnte på samme måte erkjenner mottak av åtte bits ved å trekke SDA lavt på niende SCL-puls med mindre dette er det siste byte i en batch, i hvilket tilfelle kontrolleren ikke trekke SDA lav — det gjør en ‘nak’ signal, eller ‘nei takk’ — for å la de perifere vet at det er ferdig.
Når vi er ferdig, SDA går høyt som en stop-markør.,
start for overføring som er angitt av SDA slippe fra Høy til Lav spenning (rektangelet på venstre),
stopp ved omvendt (høyre rektangel). SCL må være Høy når dette foregår
Timing
standard klokke hastighet for I2C kommunikasjon er 100kHz — 100,000 SCL-pulser per sekund. Det er mulig å gå raskere, opp til 400kHz. Enkelte enheter vil kanskje ikke være i stand til å støtte denne hastigheten; kontroller dataark som følger med enheten du vil koble til imp., Imidlertid, mange slow-enheter bruker en teknikk som kalles «klokke strekke’ – å tvinge raskere enheter til å arbeide til deres hastighet. Imp støtter enheter som gjør bruk av denne teknikken. I hovedsak, de holder SCL lav, mens de henter de dataene du vil ha dem til å sende til imp. Imp oppdager dette, utgivelser SCL-linje og venter til SCL går høyt igjen før du fortsetter.
du må Imidlertid kanskje å senke I2C hastighet selv om de elektriske egenskapene av set-up bremse ned hastigheten på overgangen mellom 0V og 3,3 V, kalt «rise tid’., Dette er ofte forårsaket av lange ledninger, noe som øker kapasitans av kretsen. For at enheter for å lykkes oppdage overføring av hver bit, bussen må kjøre saktere. Data korrupsjon eller uventede resultater er ledetrådene du bør se opp for. Redusere I2C buss hastighet før data blir vellykket lese.
imp API for tiden har fire forhåndsdefinerte klokke verdier: 10, 50 100 og 400kHz., De er valgt ved å sende en konstant I2C konfigurasjon metode som parameter:
i2c.configure(speedConstant);
hvor verdien av speedConstant er en av
- CLOCK_SPEED_10_KHZ
- CLOCK_SPEED_50_KHz
- CLOCK_SPEED_100_KHZ
- CLOCK_SPEED_400_KHZ
Sette Opp En imp For I2C
Den i2c objekt i eksempel linjer med kode som er gitt ovenfor er ikke gitt direkte av imp, men som er valgt av deg i henhold til hvilke av dine valgte imp ‘ s pinner du skal bruke for I2C kommunikasjon., Hver type imp har flere I2C buss, alle gjort tilgjengelig på start-up. Sjekk ut pin-mux for den type imp du bruker for å se hvilke I2C objekter som er tilgjengelige for deg. Her vil vi anta at du bruker en imp001. Den imp001 er to I2C busser er på pinne 1 og 2, og pinne 8 og 9, henholdsvis instanced som egenskaper i2c12 og i2c89 av maskinvare objekt når imp starter opp. Pinne 1 og 8 er tilordnet til SCL, 2 og 9 til SDA.,
Det er vanlig å referere til ditt valg med en global variabel:
i2c <- hardware.i2c12;i2c.configure(CLOCK_SPEED_100_KHZ);
Eksempel Kode
følgende koden fungerer med de TAOS TSL2561 synlig og infrarødt lys-sensor, en 3,3 V-enhet som bruker I2C til å kommunisere med sin vert mikrokontroller. Brikken har datablad kan lastes ned fra nettstedet Mer. Mer selger chip på en lav-kost breakout styret som inkluderer egnet pull-up motstander på power-pin-koden, VCC. Dette betyr at den er klar til å koble direkte til en imp ‘ s I2C pinner.,
Mer er TSL2561 avslapnings bord
Merk Etter at denne artikkelen ble skrevet, Mer oppdatert sin TSL2561 styret sensor. Den nye versjonen fungerer med gjeldende kode.
Her er koden, for agent og deretter enheten:
Hva Koden Gjør
agent koden svarer på et innkommende HTTP-forespørsel ved å varsle den enheten som det krever en leser. For enkelthets skyld er det å lese er rett og slett som vises i loggen.
enheten kode leser sensor og beregner en lux verdi i henhold til matematikk som er satt ned i TSL2561 dataark., Den første delen av programmet setter opp konstanter for TSL2561 sentrale registre og innstillinger, inkludert dens I2C-adresse valg. Andre konstanter er brukt i den glød konvertering prosessen.
Kabling opp imp
Ved program start point, koden aliaser en av imp ‘ s I2C-pin-koden er angitt som en global variabel, konfigurerer buss hastighet til 100kHz og deretter skifter TSL2561 er I2C-postadresse litt til venstre slik at den er klar til å brukes med imp I2C funksjoner. Det setter deretter opp sensoren., Bare for å sjekke dette har fungert, vi leser kontroll registrere: retur-verdien bør være 3 hvis TSL2561 har nettopp startet opp, eller 51 hvis enheten allerede er slått på.
Neste, koden angir sensoren ADC oppløsning gjennom TSL2561 er timing registrere deg, og setter deretter signal få til høy.
til Slutt, vi forteller imp hvordan du skal reagere på "sense"
meldinger fra agent. Dette krever en funksjon som leser TSL2561 er to lyssensorer, digitale verdier som er lagret i brikken har fire 8-bit ADC registre., De to første gir en 16-bit kombinert optisk og Infrarød å lese, det andre kobler du en 16-bit IR-bare verdi. Funksjonene readSensorAdc0() og readSensorAdc1() konverterer individuelle registrere verdier inn i 16-bit tall ved å multiplisere den mest signifikante byte med 256-og å legge til verdien av de minst signifikante byte. Multiplikasjon utføres av skiftende åtte-bits tall s bits venstre åtte steder med Ekorn ‘ s << operatør.,
– koden deretter gir begge disse målingene til en tredje funksjonen til å beregne en endelig klarhet, ‘lux’ verdi.
Mer å Lese
- I2C Feil — Hvordan å feilsøke I2C lese og skrive problemer