3.23. Grunderna i I2C¶
I2C (Inter-Integrated Circuit, uttalas ”I-kvadrat-C” eller ”I-två-C”) är en tvåtrådig seriebuss avsedd för kortdistanslänkar mellan chip på samma kort. Den ligger mellan SPI och UART i prioriteringar: långsammare än SPI men snålare med stift, och adresserad (flera enheter på samma två trådar) där SPI behöver en dedikerad CS-ledning per enhet.
I2C är den föredragna bussen för lågtakts-sensorer – accelerometrar, temperatursensorer, fuktsensorer, magnetometrar, realtidsklockor, EEPROM:er – där det att spara stift och bussens komplexitet betyder mer än ren genomströmning.
3.23.1. Två trådar, båda open-drain¶
En I2C-buss har bara två signaler:
SCL (seriell klocka). Drivs av styrenheten (för det mesta).
SDA (seriella data). Drivs av vilken enhet som än talar för tillfället – styrenheten under adressen och utgående data, kringutrustningen under läsningar och ACK-bitar.
Båda ledningarna är open-drain: varje enhet på bussen kan dra ledningen ned till jord men driver den aldrig hög. Två uppdragningsmotstånd på bussen (vanligtvis 2.2 kΩ till 10 kΩ mot matningsskenan) drar ledningarna höga när ingen drar dem låga. Det trådade-ELLER-beteendet faller ut av detta – vilken enhet som helst som drar ledningen låg vinner, och det höga tillståndet är bara ”ingen talar”.
MCU:ns interna uppdragningar på dess SCL- och SDA-stift är vanligtvis inte starka nog att ensamma fungera som bussens uppdragningar; externa motstånd på bussen behövs normalt. Många sensor-breakout-kort innehåller dem redan; kontrollera databladet innan du lägger till fler.
3.23.2. Transaktionen¶
Varje I2C-transaktion följer samma form:
En I2C-transaktion: START, 7-bitars adress + R/W, ACK, register, ACK, data, NACK, STOP.¶
Utbytet utvecklas bit för bit:
START. Styrenheten drar SDA låg medan SCL fortfarande är hög. Denna ovanliga flank talar om för varje enhet på bussen att en transaktion är på väg att börja.
Adress + R/W. Styrenheten klockar ut en 7-bitars kringutrustningsadress följd av en läs/skriv-bit (
0för skrivning,1för läsning).ACK / NACK. Efter varje byte driver mottagaren SDA under en klockpuls för att ACK:a (lågt) eller NACK:a (högt). På adressbyten ACK:ar kringutrustningen om den känner igen sin egen adress; om ingen enhet ACK:ar ser styrenheten en NACK och vet att adressen inte finns på bussen.
Databyte. Varje byte följs av en ACK från mottagaren. Vid en skrivning ACK:ar kringutrustningen varje byte; vid en läsning ACK:ar styrenheten varje byte den vill ha mer av och NACK:ar den sista byten för att tala om för kringutrustningen att sluta.
STOP. Styrenheten släpper SDA hög medan SCL är hög, vilket avslutar transaktionen.
En upprepad start är en andra START som utfärdas utan en STOP emellan – styrenheten byter riktning (skrivadress, sedan läsadress) på samma kringutrustning utan att lämna ifrån sig bussen.
3.23.3. Adressering¶
Det 7-bitars adressutrymmet täcker 0x08 – 0x77; värdena i ändarna är reserverade för speciella ändamål. Varje enhets adress sätts av chipkonstruktören; många komponenter tillåter att några av de låga bitarna ändras på kortnivå (genom att binda ett stift högt eller lågt) så att två av samma sensor kan sitta på samma buss.
Om två enheter delar en adress finns det inget sätt att tala med en av dem utan att den andra stör, så kontrollera databladet innan du parar komponenter. i2c.scan() (behandlas i I2C i kod) går igenom adressutrymmet och rapporterar vilka adresser som svarar, vilket är standardsättet att ta reda på vad som finns på bussen.
3.23.4. Styrkor och svagheter¶
Bussens styrkor och svagheter sätter dess nisch:
Två stift för många enheter. Ett enda SCL/SDA-par kan bära ett dussin sensorer. SPI skulle behöva ett extra CS-stift per enhet.
Standardhastigheter.
100 kHz(”standardläge”) och400 kHz(”snabbläge”) täcker nästan varje sensor.1 MHzär uppnåeligt men börjar ställa större krav på busskapacitansen och uppdragningsmotståndens dimensionering.Långsam jämfört med SPI. Allt som flyttar mer än några hundra kilobit per sekund vill ha SPI istället.
Adresskonflikter. Två enheter med samma adress på en buss är ett hårdvarufel som protokollet inte kan kringgå.