3.23. Nozioni di base su I2C¶
I2C (Inter-Integrated Circuit, pronunciato «I-squared-C» o «I-two-C») è un bus seriale a due fili progettato per collegamenti a corto raggio tra chip sulla stessa scheda. Si colloca tra SPI e UART per priorità: più lento di SPI ma più parsimonioso nell’uso dei pin, e indirizzato (più dispositivi sugli stessi due fili) dove SPI richiede una linea CS dedicata per ogni dispositivo.
I2C è il bus preferito per i sensori a bassa velocità – accelerometri, sensori di temperatura, sensori di umidità, magnetometri, orologi in tempo reale, EEPROM – dove risparmiare pin e ridurre la complessità del bus conta più del throughput puro.
3.23.1. Due fili, entrambi open-drain¶
Un bus I2C ha solo due segnali:
SCL (clock seriale). Pilotato dal controller (la maggior parte delle volte).
SDA (dati seriali). Pilotato dal dispositivo che sta parlando in quel momento – il controller durante l’indirizzo e i dati in uscita, la periferica durante le letture e i bit ACK.
Entrambe le linee sono open-drain: ogni dispositivo sul bus può portare la linea verso massa ma non la pilota mai verso l’alto. Due resistori di pull-up sul bus (tipicamente da 2.2 kΩ a 10 kΩ verso la linea di alimentazione) portano le linee in alto quando nessuno le sta portando basse. Da questo deriva il comportamento wired-OR – qualsiasi dispositivo che porta la linea bassa vince, e lo stato alto è semplicemente «nessuno sta parlando».
I pull-up interni del microcontrollore sui suoi pin SCL e SDA di solito non sono abbastanza forti da fungere da soli da pull-up del bus; normalmente sono necessari resistori esterni sul bus. Molte schede breakout per sensori li includono già; controlla il data sheet prima di aggiungerne altri.
3.23.2. La transazione¶
Ogni transazione I2C segue la stessa forma:
Una transazione I2C: START, indirizzo a 7 bit + R/W, ACK, registro, ACK, dati, NACK, STOP.¶
Lo scambio si svolge bit per bit:
START. Il controller porta SDA basso mentre SCL è ancora alto. Questo fronte insolito comunica a ogni dispositivo sul bus che sta per iniziare una transazione.
Indirizzo + R/W. Il controller invia in uscita un indirizzo di periferica a 7 bit seguito da un bit di lettura/scrittura (
0per la scrittura,1per la lettura).ACK / NACK. Dopo ogni byte, il ricevitore pilota SDA per un clock per dare un ACK (basso) o un NACK (alto). Sul byte di indirizzo la periferica dà l’ack se riconosce il proprio indirizzo; se nessun dispositivo dà l’ack, il controller riceve un NACK e sa che l’indirizzo non è presente sul bus.
Byte di dati. Ciascuno seguito da un ACK del ricevitore. In una scrittura, la periferica dà l’ack a ogni byte; in una lettura, il controller dà l’ack a ogni byte di cui vuole averne altri e dà il NACK all’ultimo byte per dire alla periferica di fermarsi.
STOP. Il controller rilascia SDA in alto mentre SCL è alto, terminando la transazione.
Un repeated start è un secondo START emesso senza uno STOP nel mezzo – il controller cambia direzione (indirizzo di scrittura, poi indirizzo di lettura) sulla stessa periferica senza cedere il bus.
3.23.3. Indirizzamento¶
Lo spazio di indirizzamento a 7 bit copre 0x08 – 0x77; i valori alle estremità sono riservati per scopi speciali. L’indirizzo di ogni dispositivo è impostato dal progettista del chip; molti componenti consentono di modificare alcuni dei bit bassi a livello di scheda (collegando un pin in alto o in basso) così che due sensori dello stesso tipo possano stare sullo stesso bus.
Se due dispositivi condividono un indirizzo non c’è modo di comunicare con uno di essi senza che l’altro interferisca, quindi controlla il data sheet prima di accoppiare i componenti. i2c.scan() (trattato in I2C nel codice) percorre lo spazio di indirizzamento e segnala quali indirizzi rispondono, ed è il modo standard per scoprire cosa c’è sul bus.
3.23.4. Punti di forza e di debolezza¶
I punti di forza e di debolezza del bus ne definiscono la nicchia:
Due pin per molti dispositivi. Una singola coppia SCL/SDA può gestire una dozzina di sensori. SPI richiederebbe un pin CS aggiuntivo per ogni dispositivo.
Velocità standard.
100 kHz(«modalità standard») e400 kHz(«modalità veloce») coprono quasi ogni sensore.1 MHzè raggiungibile ma inizia a richiedere di più alla capacità del bus e al dimensionamento dei pull-up.Lento rispetto a SPI. Qualunque cosa muova più di qualche centinaio di kilobit al secondo richiede SPI.
Conflitti di indirizzo. Due dispositivi con lo stesso indirizzo su un solo bus sono un errore hardware che il protocollo non può aggirare.