3.23. Noțiuni de bază despre I2C

I2C (Inter-Integrated Circuit, pronunțat „I-pătrat-C” sau „I-doi-C”) este o magistrală serială cu două fire concepută pentru legături de scurtă distanță între chipuri de pe aceeași placă. Se situează între SPI și UART ca priorități: mai lentă decât SPI, dar mai economică în privința pinilor, și adresabilă (mai multe dispozitive pe aceleași două fire), acolo unde SPI are nevoie de o linie CS dedicată pentru fiecare dispozitiv.

I2C este magistrala preferată pentru senzorii cu rată mică – accelerometre, senzori de temperatură, senzori de umiditate, magnetometre, ceasuri în timp real, EEPROM-uri – unde economisirea pinilor și reducerea complexității magistralei contează mai mult decât debitul brut.

3.23.1. Două fire, ambele cu drenă deschisă

O magistrală I2C are doar două semnale:

  • SCL (ceas serial). Comandat de controler (în cea mai mare parte a timpului).

  • SDA (date seriale). Comandat de oricare dispozitiv care vorbește în acel moment – controlerul în timpul adresei și al datelor de ieșire, perifericul în timpul citirilor și al biților ACK.

Ambele linii sunt cu drenă deschisă: fiecare dispozitiv de pe magistrală poate coborî linia la masă, dar niciodată nu o comandă pe nivel înalt. Două rezistoare de ridicare pe magistrală (de obicei de la 2.2 la 10 către șina de alimentare) ridică liniile pe nivel înalt atunci când nimeni nu le coboară. Comportamentul de tip wired-OR rezultă din aceasta – orice dispozitiv care coboară linia câștigă, iar starea înaltă înseamnă pur și simplu „nimeni nu vorbește”.

Rezistoarele interne de ridicare ale MCU-ului de pe pinii săi SCL și SDA de obicei nu sunt suficient de puternice pentru a acționa singure ca rezistoare de ridicare ale magistralei; în mod normal sunt necesare rezistoare externe pe magistrală. Multe plăci breakout cu senzori le includ deja; verificați fișa tehnică înainte de a adăuga altele.

3.23.2. Tranzacția

Fiecare tranzacție I2C urmează aceeași formă:

Trasee SCL și SDA. SDA coboară în timp ce SCL este pe nivel înalt (START), apoi SCL tactează octeți pe SDA -- un octet de adresă pe 7 biți cu un bit de citire/scriere și un ACK, apoi un octet de registru și un ACK, apoi un octet de date și un NACK, apoi SDA urcă în timp ce SCL este pe nivel înalt (STOP).

O tranzacție I2C: START, adresă pe 7 biți + R/W, ACK, registru, ACK, date, NACK, STOP.

Schimbul se desfășoară bit cu bit:

  • START. Controlerul coboară SDA în timp ce SCL este încă pe nivel înalt. Acest front neobișnuit anunță fiecare dispozitiv de pe magistrală că urmează să înceapă o tranzacție.

  • Adresă + R/W. Controlerul tactează o adresă de periferic pe 7 biți, urmată de un bit de citire/scriere (0 pentru scriere, 1 pentru citire).

  • ACK / NACK. După fiecare octet, receptorul comandă SDA pentru un tact pentru a confirma cu ACK (nivel scăzut) sau NACK (nivel înalt). La octetul de adresă, perifericul confirmă dacă își recunoaște propria adresă; dacă niciun dispozitiv nu confirmă, controlerul vede un NACK și știe că adresa nu se află pe magistrală.

  • Octeți de date. Fiecare urmat de un ACK din partea receptorului. La o scriere, perifericul confirmă fiecare octet; la o citire, controlerul confirmă fiecare octet pe care vrea să-l continue și emite NACK pentru ultimul octet pentru a-i spune perifericului să se oprească.

  • STOP. Controlerul eliberează SDA pe nivel înalt în timp ce SCL este pe nivel înalt, încheind tranzacția.

Un repeated start este un al doilea START emis fără un STOP între ele – controlerul schimbă direcția (adresă de scriere, apoi adresă de citire) pe același periferic, fără a ceda magistrala.

3.23.3. Adresarea

Spațiul de adrese pe 7 biți acoperă 0x080x77; valorile de la capete sunt rezervate unor scopuri speciale. Adresa fiecărui dispozitiv este stabilită de proiectantul chipului; multe componente permit modificarea câtorva biți de jos la nivelul plăcii (prin legarea unui pin pe nivel înalt sau scăzut), astfel încât doi senzori identici să poată sta pe aceeași magistrală.

Dacă două dispozitive au aceeași adresă, nu există nicio modalitate de a comunica cu unul dintre ele fără ca celălalt să interfereze, așa că verificați fișa tehnică înainte de a împerechea componente. i2c.scan() (tratat în I2C în cod) parcurge spațiul de adrese și raportează ce adrese răspund, fiind modalitatea standard de a afla ce se află pe magistrală.

3.23.4. Puncte forte și puncte slabe

Punctele forte și punctele slabe ale magistralei îi definesc nișa:

  • Doi pini pentru multe dispozitive. O singură pereche SCL/SDA poate susține o duzină de senzori. SPI ar avea nevoie de un pin CS suplimentar pentru fiecare dispozitiv.

  • Viteze standard. 100 kHz („mod standard”) și 400 kHz („mod rapid”) acoperă aproape orice senzor. 1 MHz este atins, dar începe să solicite mai mult din capacitatea magistralei și dimensionarea rezistoarelor de ridicare.

  • Lentă în raport cu SPI. Orice transferă mai mult de câteva sute de kilobiți pe secundă cere SPI în loc.

  • Conflicte de adrese. Două dispozitive cu aceeași adresă pe o magistrală sunt o eroare hardware pe care protocolul nu o poate ocoli.