Hvorfor I2C-bussen (Inter-Integrated Circuit) gjør det enkelt å koble til IC-er – og hvordan du bruker den

Av Art Pini

Bidrag fra DigiKeys nordamerikanske redaktører

Kommunikasjon og styring mellom integrerte kretser som bruker en parallell buss på et trykt kretskort (PC-kort) er ikke praktisk. Selv en 8-bits prosessor krever 16 linjer kun for data, og mange flere for en adressebuss. Det er enda mer problematisk hvis flere IC-er må være på en delt kommunikasjonsbuss. Det er ikke nok plass til alle disse sporingskjøringene på kretskortet. Løsningen er å koble til IC-er ved hjelp av en seriell kommunikasjonsbuss, for eksempel I2C-bussen (Inter-Integrated Circuit), en totråds seriell buss som løser dette problemet.

Denne artikkelen beskriver opprinnelsen til I2C-bussen og hvordan den driftes for å gi en effektiv seriell kobling mellom IC-er. Den ser deretter på hvordan I2C-bussen er fysisk implementert, protokollstrukturen og vanlige anvendelser av denne utbredte kommunikasjonsbussen. Eksempler på I2C-grensesnitt og -løsninger fra Microchip Technology blir brukt til demonstrasjonsformål. Artikkelen ser også på likhetene og ulikhetene mellom I2C og System Management Bus (SMBus).

Hva er I2C-bussen?

I2C-bussen ble utviklet av Phillips Semiconductors, nå NXP Semiconductors, tidlig på 1980-tallet som en enkel toveis, totråds buss for effektiv kommunikasjon og styring av integrerte kretser på et vanlig kretskort. Den første spesifikasjonen ble fullført i 1992, og bussen har siden den gang blitt en av de faktiske standardene som tilbys i komponenter fra over 50 IC-produsenter. Med denne store distribueringen kan du ha en systemtilnærming til design der IC-ene kan inkluderes i I2C-busstrukturen uten å kreve tilpasset design. Flere andre spesialiserte busser, slik som SMBus og strømstyringsbussen (PMBus) med flere, deler den grunnleggende arkitekturen.

I2C-bussen kan lenke flere IC-er og sensorer, fordi den er en adresseringsbuss. Med et sju- eller ti-bits adressefelt kan hovedenheten sende meldinger til en valgt enhet. Den opprinnelige I2C hadde en maksimal takthastighet på 100 kilohertz (kHz), men med tiden har driftsmoduser med høyere hastighet skjøvet denne grensen til 3,4 megahertz (MHz).

I2C-bussen bruker to ledninger som er laget spesielt for en seriell datalinje, eller SDA, og en seriell taktlinje, eller SCL. SDA og SCL er åpne toveislinjer for utløp/innsamling og er koblet til den positive strømbussen via en strømkilde eller sluttmotstand. Flere enheter kan kobles til bussen, og det maksimale antallet begrenses av bussens kapasitet. En hovedenhet styrer bussen, og hver enhet på bussen har en unik adresse. Hovedenheten kan sende og motta data via bussen (figur 1). I2C støtter drift med flere hovedenheter og kollisjonsdeteksjon og mekling for å forhindre at to eller flere hovedenheter starter dataoverføringer samtidig. Denne artikkelen fokuserer imidlertid på konfigurasjoner med enkelthovedenheter.

Skjematisk oversikt over et demonstrasjonskretskort fra Microchip Technology (klikk for å forstørre)Figur 1: Skjematisk oversikt over et demonstrasjonskretskort fra Microchip Technology som implementerer I2C-bussen og kobler den til fem ulike enheter. Hovedenheten er intern via en P1-konnektor. SCL- og SDA-linjene er uthevet i grønt, og de to sluttmotstandene er merket med en blå sirkel. (Bildekilde: Microchip Technology)

Figur 1 viser en skjematisk oversikt over et Microchip Technology PKSERIAL-I2C1 I2C-demonstrasjonskort. Dette kortet implementerer I2C-bussen og kobler den til fem ulike enheter, inkludert en EEPROM, en temperatursensor, en 12-bits analog-til-digital-omformer (ADC), en 10-bits digital-til-analog-omformer (DAC) og en 8-bits seriell-til-parallell-omformer. Hovedenheten er ikke på kortet og er tilkoblet via P1-konnektoren. SDA- og SCL-busslinjene er uthevet i grønt, og sluttmotstandene er merket med en blå sirkel.

SDA- og SCL-nivåene er som regel en fast prosentandel av den positive forsyningsspenningen, vanligvis merket som VDD. Referansenivåene er satt til 70 % og 30 % av VDD for henholdsvis logikk «1» (høy) og logikk «0» (lav).

Taktsignaler oppstår i støt med én takt for hver databit som overføres. Data på SDA-linjen må være gyldig når takten er høy. Data kan bare endres når takten er lav.

Når I2C-grensesnittene integreres i IC-ene, blir nye prosjekter enklere for utviklerne, fordi det er ikke nødvendig å designe et grensesnitt. Hver enhet kobles direkte til bussen. IC-er kan legges til eller fjernes fra bussen uten at det påvirker de andre kretsene (forutsatt at totalt antall IC-er ikke presser kapasitansgrensen). Den enkle totrådsbussen minimerer antall pinner på hver IC og antall kjøringer på kretskortet.

I2C-protokoll

Bussen er 8-bits-orientert og kommuniserer i byte. Som nevnt var den opprinnelige maksimale delingstakten 100 kHz i det som nå ses på som standardmodus. Bussen støtter nå 400 kilobit per sekund (kbit/s) i hurtigmodus, opptil 1 megabit per sekund (Mbit/s) i hurtigmodus pluss og opptil 3,4 Mbits/s i høyhastighetsmodus (Hs-modus).

I2C-protokollen illustreres best ved å se på en typisk overføring på bussen (figur 2). Kilden til skjermbildet er et Teledyne LeCroy-oscilloskop med lavhastighets seriell datautløser og lesealternativ WS4KHD-EMB TD. Dette oscilloskopalternativet kan utløse og lese opptil 19 lavhastighets serielle datagrensesnitt, inkludert I2C.

Bilde av en typisk I2C-datapakke (klikk for å forstørre)Figur 2: En typisk I2C-datapakke består av en startdel, et adressefelt, en anerkjennelsesdel, 17 databyte hver med egne ACK-deler, og en stoppdel. Hvert felt identifiseres av et fargekodet overlegg. Den øverste (gule) sporingen er hele SDA-pakken, SCL-takten (rød) er under denne. De tredje og fjerde sporene er horisontalt utvidede visninger av begge signalene. (Bildekilde: DigiKey)

Oscilloskopet kan utløses på bestemte serielle hendelser, inkludert start, stopp, manglende bekreftelse (ACK), adresse, data, adresse pluss data, rammelengde og EEPROM-dataoverføring. Protokollelementene i den serielle datastandarden identifiseres av et fargekodet overlegg. Hvert protokollfelt leses i enten binær, hex eller ASCII med den valgte koden vist i overlegget.

SDA-signalet vises som et gult spor, og SCL-signalet vises som et rødt spor. Den grå overleggsboksen indikerer start- og stoppfunksjonene. De røde overleggene merker adressedata, det blå feltet er pakkedataene og olivengrønne overleggsbokser markerer ACK-funksjonene.

Den øverste sporingen viser hele I2C SDA-pakken fra start til slutt. Like under denne finner du det tilsvarende SCL-signalet. Den tredje sporingen er en tidsutvidet zoomsporing av SDA-signalet, og under dette er det synkrone SCL-signalet.

Både SDA- og SCL-linjene er i den høye tilstanden mellom overføringer når bussen er fri. SCL-signalet består av støt av ni pulser ved delingstakten, én for hver databit som overføres og én ekstra for ACK-biten.

Alle busstransaksjoner starter med en hovedgenerert startbit som vises i det zoomede SDA-sporet som en gråfarget overleggsboks. Start indikeres av at hovedenheten trekker SDA-linjen lavt, mens SCL-linjen er i en høy tilstand. Når hoved utsteder startbiten, anses bussen som opptatt. Hovedenheten kan utstede flere starter, en situasjon der de påfølgende startene ofte kalles omstarter.

Alle dataoverføringer er 8 bits (én byte) lange, og alle er etterfulgt av en ACK-bit. Bits overføres med den viktigste biten (MSB) først. Hver byteoverføring må anerkjennes. Hvis slaveenheten er opptatt og ikke kan motta eller overføre data, kan den trekke ned SCL-linjen. Dette tvinger hovedenheten inn i en ventetilstand til slaveenheten frigir SCL-linjen.

ACK-biten dannes etter at overføringsenheten frigir SDA-linjen før den niende bekreftelsestaktpulsen. Hvis den mottakende enheten har mottatt databyte, trekker den ned SDA-linjen. I zoomvisningen av SDA-en i figur 2 vises en smal spiss like før den niende taktpulsen, dette er den SDA-linjen som blir frigitt for å gå tilbake til en høy tilstand. Mottakeren trekker ned SDA-linjen og genererer ACK-signalet, som er merket symbolsk av det olivengrønne boksoverlegget. Hvis mottakeren ikke trekker ned SDA-linjen før den niende taktpulsen, er det en negativ bekreftelsesrespons (NACK). Hvis det oppstår en NACK, kan hovedenheten generere et stoppsignal og avbryte overføringen eller utstede en ny omstart for å prøve på nytt.

Det utstedes en slaveadresse rett etter omstarten. Dette indikeres av en rød overleggsboks. Det finnes to mulige adresseformater: 7-bit eller 10-bit. 7-bit-adresse er vanligst. De første 7 bitene etter starten representerer adressedataene. Den 8. biten indikerer dataretningen – enten lesing eller skriving. En skriveoperasjon indikeres av at SDA-linjen er i en lav tilstand, og hvis SDA-linjen er i en høy tilstand, indikeres en leseoperasjon. 10-biters adressering bruker de to første bytene etter starttilstanden. I2C reserverer flere adresser for interne funksjoner. Avlesningsadressedataene vises i Adresse-boksen i binær-, hex-, eller ASCII-format.

De blå overleggsfeltene markerer dataoverføringene. Alle er 8 bit lange og etterfølges av en ACK/NACK-respons. Antall databyte i en I2C-pakke er ubegrenset, men figur 2 inneholder 17. Leste data, som adresselesing, vises i dataoverleggsboksen. Datastrømmen etterfølges av en hovedgenerert stoppbit mot slutten av dataoverføringen, indikert av en grå overleggsboks i det øverste datasporet. Stopbiten er en lav-til-høy-overgang på SDA-linjen, mens SCL-linjen er i høy tilstand. Etter stoppsignalet er bussen fri igjen.

Tabellen nederst på skjermen oppsummerer all informasjonen om den relaterte datapakken, inkludert tiden det har gått siden aktivering, adresselengde, adresse, lese- eller skriveoperasjon, pakkelengde og et sammendrag av datainnholdet. Antall oppføringer i tabellen samsvarer med antall I2C-pakker innhentet av omfanget, som i dette tilfellet kun er én linje.

Hvis det oppstår en protokollfeil, vises den med en skarp rød boks bak de andre protokolloverleggsboksene.

I2C-enheter

En av de største fordelene med I2C-bussen er det ekstremt store antallet enheter som har den innebygget i designet. Demokortet til Microchip Technology viser noen eksempler på IC-typene som inkluderer I2C-bussen eller en av avledningene, som SMBus.

Microchip Technologys PIC16F677 er en 8-bits mikrostyring som kan brukes i mange innebygde design. Den implementerer en synkron seriell port som kan styres for å kommunisere med enten det serielle periferigrensesnittet (SPI) eller I2C til andre styringer eller eksterne enheter (figur 3).

Skjema over Microchip Technology PIC16F677 8-bits mikrostyringFigur 3: Microchip Technology PIC16F677 er en 8-bits mikrostyring som inkluderer en synkron seriell port (fremhevet i oransje) som kan programmeres som en SPI- eller en I2C-buss. (Bildekilde: Microchip Technology)

Denne mikrostyringen støtter både hoved- og slavemodus av I2C ved bruk av 7- eller 10-bits adressering. Den bruker SCK/SCL-pinnen for I2C SCL-taktsignalet og SDI/SDA-pinnen for datasignalet.

Disse to pinnene er koblet til SCL- og SDA-linjene på I2C-bussen for å muliggjøre kommunikasjon med andre enheter. En vanlig forbindelse er til en I2C-basert sensor, for eksempel Microchip Technologys TCN75AVOA713 totråds serielle temperatursensor (figur 4).

Skjema over Microchip Technology TCN75A-temperatursensorFigur 4: Microchip Technology TCN75A-temperatursensor er koblet direkte til PIC16F677-mikrostyringen for å kommunisere temperaturdata. (Bildekilde: Microchip Technology)

Denne temperatursensoren har større funksjonalitet på grunn av serielle kommunikasjonsegenskaper. De interne brukerprogrammerte registrene kan brukes til å angi oppløsningen til temperaturmåleren, avslutningsmodus for strømsparing og varselseffekten for å indikere når temperaturområdet overstiger forhåndsinnstilte grenser.

Det finnes også en rekke enheter som leser den serielle I2C-dataflyten og deler den inn i parallelle data. Vurder Microchip Technology MIC74YQS-TR 2-tråds I/O-utvider og viftestyring (figur 5).

Skjema over Microchip Technology MIC74YQS-TR I/O-utviderFigur 5: Microchip Technology MIC74YQS-TR I/O-utvideren konverterer den serielle datastrømmen til åtte uavhengige parallelle I/O-linjer. (Bildekilde: Microchip Technology)

Denne IC-en er en fullt programmerbar I/O-utvider som gir åtte uavhengige I/O-linjer. I/O-linjene kan være individuelt programmert som en inngang eller en utgang. Figur 5 viser MIC74YQS-TR som driver åtte LED-er under kontroll av den serielle bussen. Dette ligner på bruken av MCO23008 på I2C-demonstasjonskortet i figur 1. MIC74YQS-TR, sammen med en strømregulator, kan også implementere hastighetskontroll for viftemotoren med de fire viktigste bitsene.

SMBus og I2C

Den serielle inngangen til I/O-utvideren er utformet for SMBus, men den er også kompatibel med I2C-bussen. SMBus-spesifikasjonen er basert på I2C og ble definert av Intel og Duracell i 1994. Hovedforskjellen er at standardmodus I2C-logikknivåer er proporsjonale til VDD, og for SMBus er de faste. Erfaring viser at i de fleste tilfeller der VDD er mellom 3 og 5 volt, er ikke dette et problem.

En annen forskjell er at SMBus er begrenset til delingstakter på 100 kHz eller mindre, mens I2C har flere moduser som støtter større delingstakter. Når du arbeider med busskompatibilitet, begrenser dette den maksimale delingstakten til 100 kHz eller I2C standard taktmodus.

Så, med unntak av svært spesielle situasjoner, er SMBus og I2C kompatible.

Konklusjon

I2C-bussen og avledningene er tilgjengelig i hundrevis av IC-er av alle typer, noe som gjør det enkelt å koble dem sammen i flerfasetterte design og bruksområder. Kobling av blandede signaler og analoge sensorer utvider omfanget av mikrostyringsbaserte innebygde systemer. Alt dette gjennom et enkelt, to-tråds, serielt digitalt grensesnitt.

DigiKey logo

Disclaimer: The opinions, beliefs, and viewpoints expressed by the various authors and/or forum participants on this website do not necessarily reflect the opinions, beliefs, and viewpoints of DigiKey or official policies of DigiKey.

Om skribenten

Image of Art Pini

Art Pini

Arthur (Art) Pini jobber som skribent hos DigiKey. Han har en bachelorgrad i elektroteknikk (electrical engineering) fra City College i New York og en Master i elektroteknikk (electrical engineering) fra City University of New York. Han har over 50 års erfaring innen elektronikk og har jobbet i viktige nøkkelroller innen konstruksjon og markedsførings hos Teledyne LeCroy, Summation, Wavetek og Nicolet Scientific. Han har interesser i måleteknologi og lang erfaring med oscilloskop, spektrumanalysatorer, arbitrære bølgeformgeneratorer, digitalisatorer og effektmålere.

Om denne utgiveren

DigiKeys nordamerikanske redaktører