In questo articolo, impareremo su cosa sia il protocollo di comunicazione I2C, il suo hardware, come vengono trasferiti i dati e le diverse configurazioni in cui opera.
Outline
Introduzione alla comunicazione I2C
La comunicazione I2C è la forma abbreviata per i circuiti inter-integrati., Si tratta di un protocollo di comunicazione sviluppato da Philips Semiconductors per il trasferimento di dati tra un processore centrale e più circuiti integrati sullo stesso circuito utilizzando solo due fili comuni.
Grazie alla sua semplicità, è ampiamente adottato per la comunicazione tra microcontrollori e array di sensori, display, dispositivi IoT, EEPROM ecc.
Questo è un tipo di protocollo di comunicazione seriale sincrona. Significa che i bit di dati vengono trasferiti uno per uno a intervalli regolari di tempo impostati da una linea di clock di riferimento.,
Caratteristiche
Le seguenti sono alcune delle caratteristiche importanti del protocollo di comunicazione I2C:
- Solo due linee di bus comuni (fili) sono necessari per controllare qualsiasi dispositivo/IC sulla rete I2C
- Non c’è bisogno di previo accordo sulla velocità di trasferimento dati come nella comunicazione UART. Così la velocità di trasferimento dati può essere regolata ogni volta che richiesto
- Semplice meccanismo per la convalida dei dati trasferiti
- Utilizza il sistema di indirizzamento a 7 bit per indirizzare un dispositivo specifico / IC sul bus I2C
- Le reti I2C sono facili da scalare., I nuovi dispositivi possono essere semplicemente collegati alle due linee di bus I2C comuni
Hardware
Il bus I2C fisico
I2C Bus (Interface wires) è costituito da soli due fili e sono denominati Serial Clock Line (SCL) e Serial Data Line (SDA). I dati da trasferire vengono inviati attraverso il filo SDA e sincronizzati con il segnale di clock da SCL. Tutti i dispositivi / circuiti integrati sulla rete I2C sono collegati alle stesse linee SCL e SDA come mostrato di seguito:
Entrambe le linee bus I2C (SDA, SCL) sono gestite come driver open drain., Significa che qualsiasi dispositivo / IC sulla rete I2C può guidare SDA e SCL in basso, ma non possono guidarli in alto. Quindi, un resistore di pull up viene utilizzato per ogni linea di bus, per mantenerli alti (a tensione positiva) per impostazione predefinita.
Il motivo per cui si utilizza un sistema di scarico aperto è che non ci saranno possibilità di cortocircuito, che potrebbe accadere quando un dispositivo tenta di tirare la linea in alto e qualche altro dispositivo tenta di tirare la linea in basso.
Dispositivi Master e Slave
I dispositivi collegati al bus I2C sono classificati come master o slave., In qualsiasi momento solo un singolo master rimane attivo sul bus I2C. Controlla la linea di clock SCL e decide quale operazione deve essere eseguita sulla linea dati SDA.
Tutti i dispositivi che rispondono alle istruzioni di questo dispositivo master sono slave. Per differenziare tra più dispositivi slave collegati allo stesso bus I2C, a ciascun dispositivo slave viene assegnato fisicamente un indirizzo permanente a 7 bit.
Quando un dispositivo master desidera trasferire dati da o verso un dispositivo slave, specifica questo particolare indirizzo del dispositivo slave sulla linea SDA e quindi procede con il trasferimento., Così efficacemente la comunicazione avviene tra il dispositivo master e un particolare dispositivo slave.
Tutti gli altri dispositivi slave non rispondono a meno che il loro indirizzo non sia specificato dal dispositivo master sulla linea SDA.
Protocollo di trasferimento dati
Il seguente protocollo (insieme di regole) è seguito da dispositivi master e slave per il trasferimento di dati tra di loro.
I dati vengono trasferiti tra il dispositivo master e i dispositivi slave attraverso una singola linea dati SDA, tramite sequenze modellate di 0 e 1 (bit)., Ogni sequenza di 0 e 1, è definito come una transazione e i dati di ogni transazione è strutturata come di seguito:
Condizione
ogni volta che un dispositivo master/IC decide di avviare una transazione, si passa la SDA della linea ad alta tensione, livello a basso livello di tensione prima che la linea SCL passa da alto a basso.
Una volta che una condizione di avvio viene inviata dal dispositivo master, tutti i dispositivi slave diventano attivi anche se sono in modalità sleep e attendono i bit di indirizzo.,
Address Block
Si compone di 7 bit e sono riempiti con l’indirizzo del dispositivo slave a/da cui il dispositivo master ha bisogno di inviare / ricevere dati. Tutti i dispositivi slave sul bus I2C confrontano questi bit di indirizzo con il loro indirizzo.
Bit di lettura / scrittura
Questo bit specifica la direzione del trasferimento dei dati. Se il dispositivo master / IC deve inviare dati a un dispositivo slave, questo bit è impostato su “0”. Se il master IC deve ricevere dati dal dispositivo slave, è impostato su ‘1’.,
ACK/NACK Bit
Sta per Acknowledged / Not-Acknowledged bit. Se l’indirizzo fisico di qualsiasi dispositivo slave coincide con l’indirizzo trasmesso dal dispositivo master, il valore di questo bit viene impostato su ” 0 ” dal dispositivo slave. Altrimenti rimane alla logica ‘ 1 ‘ (default).
Blocco dati
Comprende 8 bit e sono impostati dal mittente, con i bit di dati di cui ha bisogno per trasferire al ricevitore., Questo blocco è seguito da un bit ACK/NACK ed è impostato su ‘0’ dal ricevitore se riceve correttamente i dati. Altrimenti rimane alla logica ‘1’.
Questa combinazione di blocco di dati seguita da ACK/NACK bit viene ripetuta fino a quando i dati sono completamente trasferiti.
Condizione di arresto
Dopo che i blocchi di dati richiesti vengono trasferiti attraverso la linea SDA, il dispositivo master commuta la linea SDA dal livello di bassa tensione al livello di alta tensione prima che la linea SCL passi da alto a basso.,
NOTA: La logica ‘ 0 ‘o l’impostazione di un bit su ‘0’ equivale all’applicazione di bassa tensione sulla linea SDA e viceversa.
Come funziona praticamente la comunicazione I2C?
Una comunicazione / transazione I2C viene avviata da un dispositivo master per inviare dati a un dispositivo slave o per ricevere dati da esso. Impariamo a lavorare di entrambi gli scenari in dettaglio.,
l’Invio di Dati a un Dispositivo Slave
La seguente sequenza di operazioni avvengono quando un dispositivo master tenta di inviare i dati ad un particolare dispositivo slave tramite I2C bus:
- La periferica master invia la condizione di avvio
- dispositivo master invia il 7 bit di indirizzo che corrisponde al dispositivo slave a essere preso di mira
- dispositivo master imposta la Lettura/Scrittura di un bit ‘0’, che significa scrivere
- Ora due scenari possibili sono:
- Se nessun dispositivo slave corrisponde con l’indirizzo inviato dal dispositivo master, la prossima ACK/NACK po ‘ rimane a ‘1’ (default)., Questo segnala al dispositivo master che l’identificazione del dispositivo slave non è riuscita. Il master orologio terminare la transazione corrente mediante l’invio di una condizione di Arresto o di una nuova condizione di Avvio
- Se un dispositivo slave esiste con lo stesso indirizzo specificato dal dispositivo master, slave, l’apparecchio imposta l’ACK/NACK bit ‘0’, che segna il dispositivo master che slave dispositivo è correttamente mirate
- Se un dispositivo slave è successo mirati, il dispositivo master invia a 8 bit di dati che viene considerato solo e ricevuto dal mirati dispositivo slave., il dispositivo che controlla ciascuno di essi:
Lettura di Dati da un Dispositivo Slave
La sequenza di operazioni rimangono le stesse scenario precedente, fatta eccezione per i seguenti:
- dispositivo master imposta la Lettura/Scrittura di un bit a ‘1’ e ‘invece che ‘0’ che segnali mirati dispositivo slave che master dispositivo è in attesa di dati
- 8 bit corrispondente al blocco di dati inviati dal dispositivo slave e l’ACK/NACK bit viene impostato dal dispositivo master
- una Volta che i dati richiesti sono ricevuti dal dispositivo master, invia un NACK po’., Quindi il dispositivo slave smette di inviare dati e rilascia la linea SDA
Se il dispositivo master legge i dati da una posizione interna specifica di un dispositivo slave, invia prima i dati di posizione al dispositivo slave utilizzando i passaggi nello scenario precedente. Quindi avvia il processo di lettura dei dati con una condizione di avvio ripetuta.,
La figura seguente rappresenta la complessiva bit di dati inviati sulla linea SDA e il dispositivo che controlla ciascuno di essi:
Concetto di stretching orologio
Lasciate che dicono che il dispositivo master avviato una transazione e inviato i bit di indirizzo di un particolare dispositivo slave seguita da una Lettura di un bit a “1”. Il dispositivo slave specifico deve inviare un bit ACK, immediatamente seguito dai dati.
Ma se il dispositivo slave ha bisogno di un po ‘ di tempo per recuperare e inviare dati al dispositivo master, durante questo intervallo, il dispositivo master penserà che il dispositivo slave sta inviando alcuni dati.,
Per evitare ciò, il dispositivo slave mantiene bassa la linea di clock SCL fino a quando non è pronto a trasferire bit di dati. In questo modo, il dispositivo slave segnala al dispositivo master di attendere i bit di dati fino a quando la linea di clock non viene rilasciata.
Questo è tutto per questo articolo. Dai un’occhiata ai seguenti progetti per avere un’idea di come la comunicazione I2C è praticamente implementata, tra microcontrollori / Arduino e diversi sensori:
Sistema di parcheggio basato su RFID
Interfacciamento di Arduino con un’unità Motion Processor
Interfacciamento di Arduino con Real-Time Clock