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 till 10 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:

SCL- och SDA-spår. SDA faller medan SCL är hög (START), sedan klockar SCL ut byte på SDA -- en 7-bitars adressbyte med en läs/skriv-bit och en ACK, sedan en registerbyte och en ACK, sedan en databyte och en NACK, sedan stiger SDA medan SCL är hög (STOP).

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 (0 för skrivning, 1 fö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 0x080x77; 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”) och 400 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å.