venerdì 25 giugno 2010

Il Protocollo I2C

Cos'è il protocollo I2C?

Un protocollo è un insieme di regole condivise tra 2 o più dispositivi al fine di trasmettersi informazioni, senza un protocollo è impossibile avere una comunicazione corretta.

Il protocollo I2C (Inter Integrated Circuit) utilizza un bus di 2 fili bidirezionali, rispettivamente SDA(dati) e SCL(clock).

I segnali che transitano sulle linee sono in codice binario quindi avremo 2 livelli: 1 livello alto, 0 livello basso. Le linee sono a livello alte di default, quindi collegate a resistenze di Pull Up[1], in modo che, quando nessuno trasmette, non si abbiano livelli di incertezza dovuti al rumore.

Questo protocollo nasce negli anni 80 e fu brevettato dalla Philips inizialmente per far comunicare dispositivi all interno di tv e pc, successivamente fu standardizzato e reso più veloce (oggi si parla di 3.4Mbit/s), ma soprattutto la Philips non ebbe più il monopolio su questo standard.

Quali dispositivi I2C possiamo trovare?

I principali dispositivi che possiamo trovare nei cataloghi sono diversi, ma ricordiamoci che con l'I2C non avremo mai comunicazioni in REAL TIME di grosse quantità di dati.In foto un esempio di un bus con varie periferiche I2C collegate.


bus i2c generico


Il numero di periferiche I2C su uno stesso bus di solito dipende dalle capacità parassite introdotte sulla linea dai vari dispositivi, il limite è 400pF.

Definizioni di protocollo

Gli attori principali della comunicazione sono 2, il MASTER e lo SLAVE. Non avremo mai 2 MASTER sulla stessa linea, eccetto casi particolari e in genere il MASTER è un microcontrollore, gli altri dispositivi sono SLAVE. Il master gestisce la tempistica e inizia la trasmissione, lo slave gestisce le richieste del master.

Ogni dispositivo sul bus ha un indirizzo univoco a 7 o 10 bit.

Il master trasmette sulla linea data l'indirizzo dello slave sia che voglia ricevere dati, sia che li voglia trasmettere . Dopo il bit di acknowledge il master procede a trasmettere i dati, oppure li trasmette lo slave se il master lo richiede. L'Ack viene trasmesso dopo ogni byte[2].

In figura vediamo un esempio di comunicazione, è importante osservare come la comunicazione inizi con una condizione di Start (o repeated START) e finisca con una condizione di Stop.

Una volta trasferiti i dati con il secondo byte, se vogliamo trasmettere o ricevere nuovamente, invece di stoppare la trasmissione con la condizione di STOP, ripetiamo la condizione di START[3]. In questo modo il Master non smette mai di trasmettere sul bus e nessun altro eventuale master può prenderne il controllo. La condizione di Repeated Start nel caso in cui abbiamo un solo master è ha la stessa funzione della condizione di STOP.

start stop i2c

In questa foto potete vedere come viene ripartito il bus SDA tra Master e Slave che comunicano.

trasmissione generica

In una comunicazione I2C avremo quindi tre possibili tipi di trasmissioni:

Il master vuole trasmettere dati allo slave

  • Il master trasmette l'indirizzo dello slave a cui vuole trasmettere su SDA

  • Il master invia i dati che vuole trasmettere

  • Il master termina la comunicazione

In questo caso è lo slave che genera il segnale di ack, quando un segnale di NOT ACKNOWLEDGE ('1') viene ricevuto il master dovrà generare una condizione di STOP o di REPEATED START.

master to slave

Il ma ster vuole ricevere dati dallo slave

  • Il master trasmette l'indirizzo dello slave da cui vuole ricevere dati su SDA

  • Lo slave trasmette i dati al master

  • Il master termina il trasferimento

In questo caso il master genera l'ACK dopo aver ricevuto i dati, ma per indicare allo slave che non ha più bisogno di dati genera un NOT ACKNOLEDGE.

slave to master

Comunicazione mista ( ogni parte di questa comunicazione è scomponibile in uno dei due casi precedenti)

mista

Nei casi sopracitati possiamo osservare che la comunicazione da master a slave è gestita completamente dal master e a seconda di come poniamo il bit di indirizzo possiamo leggere o scrivere dati nello slave.

Indirizzamento delle periferiche

La procedura di indirizzamento a 7 bit specifica che il primo byte trasmesso sulla linea I2C,dopo la condizione di START, conterrà l'indirizzo dello slave che vorremo selezionare. C'è un'eccezione chiamata 'general call' in cui il master trasmette un indirizzo generico e ogni slave manda un ack. Tuttavia gli slave possono anche essere stati configurati in modo che ignorino la 'general call'.

primo byte


Il secondo byte che sarà trasmesso sulla linea sarà quello che conterrà le informazioni importanti per definire la comunicazione, quindi le azioni che saranno fatte.

L'indirizzo dello slave può essere fisso o variabile, tutto questo dipenderà dalla casa costruttrice. Ci sono dei dispositivi I2C che lasciano al progettista la libertà di scegliere (via Hardware) l'indirizzo del dispositivo stesso. Infatti ci sono dei pin ,che in genere rappresentano i bit meno significativi dell'indirizzo, che se messi a massa o a Vcc cambieranno i rispettivi bit a 0 o a 1. Un esempio pratico è il PCA9555 che ha 3 pin che rappresentano i bit meno significativi dell'indirizzo I2C, mentre i 4 bit più significativi sono posti a 0100 di default dalla casa madre. Quindi potremo indirizzare 23 PCA9555 sullo stesso bus.

In questa tabella vediamo vari tipi di indirizzi che vengono inviati sul bus per diversi scopi.

Tabella indirizzi

E' necessario dire che utilizzeremo soltanto lo Start byte e al limite il 10-bit slave addressing nei nostri progetti a microcontrollori, però per completezza inserisco informazioni riguardanti anche gli altri metodi di indirizzamento.

1. General call, serve per indirizzare tutte le periferiche sulla linea capaci di gestirla.

Se una periferica riceve una general call ed è capace di gestirla manderà un ack e si comporterà come uno slave-ricevitore. Il secondo byte sulla linea e i successivi saranno riconosciuti da ogni periferica che ha generato un ack. Se una periferica non sarà in grado di gestire questo tipo di dati allora ignorerà la general call.

Il senso della general call si capisce dal secondo byte trasmesso, in particolare dal bit B.

general call

Sono possibili quindi due casi

  • se il bit B=0 allora il secondo byte avrà 3 diverse forme:
  1. 00000110 (H‘06’) : Resetta e abilita le periferiche a ricevere sull indirizzo programmabile via Hardware.

  2. 00000100 (H‘04’) : Abilita le periferiche a ricevere sull'indirizzo programmabile via Hardware ma non resetta le periferiche.

  3. 00000000 (H‘00’) : Questo codice non può essere utilizzato come secondo byte.
Le varie procedure di programmazione con relative sequenze di dati da inviare sono pubblicate sui vari datasheet delle periferiche I2C.
  • Se il bit B=1 allora la general call sarà una 'hardware general call'. Questo significa che la sequenza di due byte è stata trasmessa da una periferica hardware ad esempio una 'keyboard scanner' che non può essere programmata per indirizzare un singolo slave. Dato che queste periferiche hardware non conoscono all'inizio della comunicazione a quale periferica dovranno trasmettere, il secondo byte conterrà il proprio indirizzo per identificarsi. Un dispositivo intelligente come un microcontrollore, che può comportarsi sia da master che da slave, quindi reindirizzerà il traffico da questa periferica allo slave desiderato.

2.(1)Dopo il bit di start nessuna periferica è abilitata a dare l'ack.

3.(2)Questo tipo di indirizzo serve a rendere compatibile un bus di tipo C-BUS con il Bus I2C.

I dispositivi C-Bus possono essere connessi ad un bus I2C in modalità Standard, tuttavia servirà un terzo filo chiamato DLEN e l'ack dovrà essere omesso. In questo tipo di struttura le periferiche I2C e le C-Bus condivideranno un bus di 2 fili, ma le I2C non risponderanno ai dati C-Bus e viceversa.

c-bus

4.(3)Riservato ad altri tipi di bus compatibili con l'I2C

5.Riservato per usi futuri

6.Riservato alle comunicazioni I2C in Hs-mode che è una delle tre modalità di comunicazione I2C, in questo caso la bit rate sarà 3.4MBits/s. Le altre 2 modalità sono Fast-mode (400 kbits/s) e 10-bit addressing.

7.Riservato per usi futuri

8. Riservato a comunicazioni tra periferiche che hanno un indirizzo di 10 bit. Per indirizzare una periferica a 10 bit, semplicemente si invia in 2 diversi byte l'indirizzo a 10 bit. Periferiche indirizzate a 7bit e a 10 bit possono essere collegate allo stesso bus e possono comunicare sia in HS-mode e in Fast-mode.

Nel primo byte inviato dopo la condizione di Start o di Sr (repeated start) si invia 11110 e i 2 bit più significativi dell'indirizzo a 10 bit, il bit R/W viene posto a zero e il secondo byte conterrà gli 8 bit meno significativi dell'indirizzo.

La comunicazione con periferiche a 10bit è spiegata in questa figura

10 bit

CONCLUSIONI

Il protocollo I2C visto così, può sembrare molto complesso, ma se avrete la pazienza di leggere il tutorial sulla comunicazione i2c e arduino vi accorgerete che bastano poche funzioni per riuscire a indirizzare e trasferire dati a questo tipo di periferiche.

Io personalmente trovo questo protocollo utilissimo, pensate che con soltanto un bus di 2 fili potrete espandere il vostro port di I/O di ben 320 bit. Inoltre esistono anche sensori, display e memorie i2c che potrete utilizzare con soltanto 2 fili. Per avere più bus inoltre esistono hub i2c prodotti dalla NXP (la maggior parte delle periferiche i2c viene prodotta dalla NXP, un'azienda della Philips che produce semiconduttori).

NOTE

[1]Pull Up: se tra una linea e il valore alto (stabilito dal tipo di logica che utilizziamo, es nella logica TTL il valore 1 o High o H è uguale a 5v per definizione), mettiamo una resistenza questa prenderà il nome di resistenza di pull up. Come dice il nome tiene a livello H in tensione la linea, allo stesso tempo il valore alto è debole quanto basta da permettere la commutazione al livello basso senza far circolare grandi quantità di corrente che andrebbe sprecata.

[2] Un byte sono 8 bit. 1 bit è l'elemento fondamentale e può valere 1 o 0.

[3]La ricezione di una condizione di START o di Repeated START, comporta il reset di ogni periferica sul bus. Su questa cosa dobbiamo stare molto attenti in fase di programmazione del Master.

BIBLIOGRAFIA

1. THE I 2C-BUS SPECIFICATION VERSION 2.1 JANUARY 2000 by Philips Semiconductors

2. Simulazione di una comunicazione fra dispositivi che utilizzano il protocollo i2c by Piccolo Fabio

3. Wikipedia

giovedì 24 giugno 2010

Circuit Snippets

Salve a tutti cari lettori, scusate la lunga assenza. Il trasferimento del blog e` avvenuto con successo, molti dei miei articoli li potete trovare su www.gioblu.com, ma ho deciso di ripostarli pure qui.
Arriviamo al dunque, oggi mi sono imbattuto in circuiti che sono molto utili per crearsi effetti da chitarra e li voglio ripostare qui per non perderli se eventualmente il sito da cui li ho presi venisse cancellato :D
I circuiti sono stati progettati da Tim Escobedo.
Ho scoperto questi circuiti grazie a questo video:

Visite