miniatyr|Principskiss av I²CI²C ("Inter-Integrated Circuit") är en synkron seriell multimasterbuss från Philips som används för att koppla låghastighetsenheter till moderkort, inbyggda system, mobiltelefoner och andra elektroniska enheter. Från mitten av 90-talet har flera konkurrenter (såsom Siemens, NEC, Texas Instruments och Motorola) utvecklat I²C som är fullt kompatibla med Philips system. NXP, som tidigare var Philips halvledardivision, kräver dock fortfarande en avgift för att dela ut slavadresser för enheter, även om det är gratis att implementera I²C-protokollet.Licensinformation för I²C
SMBus som utvecklades av Intel 1995 är en delmängd av I²C som har en mer precis definition. Ett av målen för SMBus är att uppnå stabilitet och kompatibilitet. Som en följd av detta använder moderna I²C-system regler och policies från SMBus och stöder ibland båda protokollen med minimala inställningsskillnader.
Design miniatyr|350px|Ett exempeldiagram med en master (en mikrokontroller), tre slavnoder (en A/D-omvandlare, en D/A-omvandlare och en till mikrokontroller) och ett par motstånd Rp
I²C använder tvåvägskommunikation på två ledare med öppen kollektor – SDA (Serial Data Line, datasignal) och SCL (Serial Clock Line, klocksignal). Normalt används spänningar om +5 eller +3,3 volt, men andra spänningar tillåts.
Referensdesignen för I²C specificerar 7 eller 10 bitars minnesadressering, beroende på implementation.. Vanliga busshastigheter är 100 kb/s i standard mode eller 10 kb/s i low-speed mode, även om godtyckligt lägre klockfrekvenser tillåts. Sentida implementationer kan kommunicera med fler noder och klarar högre hastigheter (400 kb/s för Fast mode, 1 Mb/s för Fast mode plus eller Fm+, samt 3,4 Mb/s för High Speed mode). Dessa används mer i inbyggda system än i persondatorer. En ytterligare förbättring är 16 bitars minnesaddressering.
Notera dock att de datahastigheter som omnämns är för överföring mellan en masternod och en slavnod utan hänsyn tagen till overhead i hårdvara. Overhead i protokollet innefattar slavnodadressering och möjligen registeradressering inom slavnoden, såväl som ACK/NACK-bitar för varje byte. Den faktiska överföringshastigheten av nyttodata kan, beroende på dessa förhållanden, vara markant lägre.
Antalet slavnoder begränsas av minnesadresseringen och av bussens kapacitans på 400 pF, vilket i praktiken begränsar den fysiska busslängden till ett par meter.
Referensdesign Referensdesignen innehåller, som ovan nämnts, en buss med klocka (SCL) och data (SDA) samt 7 bitars minnesadressering. Bussen har två roller för noder - master och slav: Masternod — nod som ger klocksignal och adresserar slavnoder Slavnod — nod som mottar och använder klocksignal samt adressering Bussen är en multi-master buss, vilket innebär att fler än en master kan vara inkopplade. Dessutom kan noder byta från slav- till masterläge under drift.
Varje nod kan arbeta i fyra olika lägen, även om de flesta enheter använder en roll och dess två lägen: masternod sänder — masternoden sänder data till en slavnod masternod mottar — masternoden tar emot data från en slavnod slavnod sänder — slavnoden sänder data till masternoden slavnod mottar — slavnoden mottar data från masternoden
Masternoden börjar alltid i sändläge och sänder en startbit med efterföljande 7 bitars adressering för att bestämma vilken slavnod som ska kommuniceras med. Nästa bit indikerar om masternoden vill skriva data till (0) eller läsa data från (1) slavnoden.
Om slavnoden som adresseras är inkopplad på bussen kommer denna att svara med en ACK (acknowledgement) genom att sätta en bit låg för den adressen. Masternoden fortsätter sedan i antingen mottagar- eller sändläge, beroende på hur läs- och skrivbiten sattes, och slavnoden fortsätter i motsvarande slavläge (sändläge om masternoden är i mottagningsläge).
Adress- och databytes sänds med mest signifikanta siffra först. Startbiten (START) indikeras av en hög-lågövergång på SDA när SCL är hög. Stoppbiten (STOP) är en låg-högövergång på SDA när SCL är hög.
Om masternoden vill skriva data till en slavnod skickar den upprepade gånger en byte till slavnoden som svarar med en ACKbit. Masternoden är här i sändläge medan slavnoden är i mottagarläge.
Om masternoden vill läsa data från en slavnod mottar den upprepade gången en byte från slavnoden, och masternoden svarar med en ACKbit efter varje byte förutom den sista. Masternoden är här i mottagarläge och slavnoden i sändläge.
Masternoden avslutar en sändning med en stopbit, eller ännu en startbit om man önskar låta masternoden behålla busskontroll för ytterligare en sändning.
Meddelandeprotokoll I²C definierar tre grundläggade meddelandetyper som alla börjar med START och slutar med STOP: Ett meddelande där masternoden skriver till en slavnod; Ett meddelande där masternoden läser från en slavnod; Kombinerade meddelanden, där en masternod gör minst två läs- och/eller skrivoperationer till eller från en eller fler slavnoder.
I kombinerade meddelanden börjar varje meddelande med START och en adress till en slavnod. Efter den första START:en sänds flera START med slavnodsadresser utan mellanliggande STOP. Det är på det viset slavnoder tolkar dessa meddelanden som delar av ett fullständigt meddelande.
Slavnoder svarar bara på meddelanden eller kommandon som specificerats av tillverkaren, vanligtvis dokumenterade i produktdokumentationen.
Rena I²C-system stöder godtyckliga meddelandestrukturer medan SMBus begränsar antalet strukturer till nio, såsom read word N och write word N till en enda slavnod. PMBus utökar SMBus med ett grupprotokoll som tillåter att ett flertal sådana SMBusmeddelanden sänds inom samma meddelande. Det avslutande STOPkommandot anger att sådana grupperade meddelanden eller kommandon ska exekveras eller ta effekt. Ett exempel är en PMBusoperation som konfigurerar om tre spänningsaggregat via tre olika slavnodsadresser; den nya konfigurationen implementeras samtidigt när alla tre slavnoder mottar STOP.
Men få undantag bestämmer varken I²C eller SMBus meddelandesemantiken, det vill säga vad en viss byte ska betyda. Semantiken är produktspecifik. Bland undantagen märks meddelanden till I²C-bussens general calladress (0x00) eller till SMBus Alert Response Address, samt meddelanden som rör SMBus Address Resolution Protocol och för dynamisk adresshantering.
I praktiken använder de flesta slavnoder förfrågan / svarsmodeller, där en eller flera av byten efter ett skrivkommando behandlas som ett kommando eller adress. Dessa byte bestämmer hur de efterföljande skrivna byten behandlas och/eller hur slavnoden ska reagera på efterföljande läskommandon. De flesta SMBusoperationer använder kommandon som bara tar upp en byte.
Fysiskt lager miniatyr|SDA och SCL som de kan se ut när de mäts med ett oscilloskop. Eftersom både SCL och SDA har öppna kollektorer krävs pull-upmotstånd. En kollektor som kopplas till jord via motstånd (pull-down) anses beskriva en logisk nolla, medan en kollektor som varken kopplas till spänning eller jord anses beskriva en logisk etta.
En viktig följd av detta är att om en av många noder sätter en av ledarna låg, sätts den till låg för alla anslutna enheter. Om en slavnod försöker sända en logisk etta kan varsebli detta och på så sätt se att en annan nod försöker sända samtidigt.
På SCL-ledaren kallas detta "clock stretching", eller "klocksträckning" och ger slavnoder en mekanism för flödeskontroll. På SDA-ledaren kallas det "arbitration", eller "arbitrering", och det säkerställer att bara en enhet sänder åt gången.
Om ingen trafik pågår sätts båda ledarna höga. För att påbörja en sändning (START) dras SDA låg medan SCL förblir hög. Om SDA sedan släpps till hög utgör det en STOP. medan detta inte bryter mot designen är det ofta meningslöst, och normalt efter START är att dra SCL låg.
START och STOP undantaget, ändras spänningen på SDA bara då SCL är låg, och att sända en bit består av att pulsera SCL hög medan SDA läggs på önskad nivå. Medan SCL är låg sätter sändaren (inledningsvis masternoden) SDA till önskad nivå. Efter en kort paus släpps SCL till hög - en process som tar ett kort ögonblick på grund av tidskonstanten hos svängningskretsen som utgörs av pull-upmotståndet och bussens kapacitans, samt klocksträckning av en annan inkopplad nod.
Sedan SCL satts hög väntar masternoden en kort stund (4 µs för standard speed) för att säkerställa att mottagaren sett biten, och drar sedan ner SCL låg. Detta repeteras för varje bit som ska överföras. Efter 8 bitar i en riktning skickar mottagaren en ACK-bit i andra riktningen. De två noderna byter roll och en logisk nolla sänds tillbaka. Om den då mottagande noden istället ser en logisk etta (NACK), betyder det att:
(Om masternoden sänder till slavnoden) Slavnoden kan inte ta emot data. Slavnod ej funnen, kommando ej förstått, eller oförmögen att ta emot mer data. (Om slavnoden sänder till masternoden) Masternoden vill avsluta överföringen efter denna byte.
Sedan ACK-biten förståtts kan masternoden göra en av tre saker:
Förbereda sändning av ännu en byte - sändaren sätter SDA och masternoden pulsar SCL hög. Sänd ett STOP: Sätt SDA låg, släpp SCL till hög, släpp SDA hög. Detta släpper bussen fri. Sänd ytterligare ett START: Släpp SDA hög, släpp SCL hög, dra SDA låg. Detta påbörjar en ny överföring utan att släppa bussen fri.
Klocksträckning med SCL
En av de viktigaste egenskaperna hos I²C-protokollet är "klocksträckning". En slavnod kan hålla klockledaren låg efter mottagande eller sändande av en byte, vilket då innebär att slavnoden inte ännu är redo för mer data. Masternoden som kommunicerar med slavnoden får då inte avsluta sändningen av dåvarande bit, utan måste vänta till slavnoden släpper SCL hög. Om slavnoden använder klocksträckning kommer SCL att hållas låg. Detsamma gäller om en annan långsammare masternod försöker dra ner SCL samtidigt. I situationer med fler än en masternod kommer normalt sett alla utom en att förlora genom arbitrering.
Masternoden måste vänta till SCL släpps hög, och sedan ytterligare en kort tid (4 µs för 100 kbps) innan den tillåts dra SCL låg igen.
Även om en masternod kan hålla SCL låg så länge som önskas, används uttrycket klocksträckning normalt bara när en slavnod använder metoden. Teoretiskt kan vilken klockpuls som helst sträckas, men oftast används klocksträckning i intervallet före eller efter en ACK. Om till exempel slavnoden är en mikrokontroller kommer den att sträcka klockan efter varje byte medan mjukvaran i kontrollern bestämmer sig för att skicka en ACK eller NACK.
Den enda gången en slavnod driver SCL är just när klocksträckning används. Många slavnoder behöver inte använda metoden och hanterar således SCL som en insignal utan möjlighet att påverka denna. Vissa masternoder, som till exempel ASICar, stöder inte klocksträckning och kallas då "two-wire interface" istället för I²C.
För att kunna garantera en lägsta trafikhastighet använder sig SMBus av en begränsning på hur länge en klockpuls kan sträckas. Master- och slavnoder kan således inte låsa bussen längre än korta ögonblick, något som inte garanteras i rena I²C-system.
Arbitrering med SDA
Varje masternod bevakar bussen för START- och STOPbitar och påbörjar inte sändningar medan en annan masternod sänder. Det kan dock hända att två masternoder börjar sända ungefär samtidigt, och denna situation leder till arbitrering. Slavnodssändningar kan även de arbitreras när en masternod sänder till flera slavnoder, men detta är mindre vanligt. Till skillnad från protokoll som använder slumpvisa fördröjningar (till exempel Ethernet) använder I²C en deterministisk arbitreringspolicy. Varje sändare kontrollerar spänningen på SDAledaren, och om spänningen inte stämmer överens med förväntat värde, har den sändaren förlorat arbitreringen och avslutar sändningen.