Tutorials - Elettronica

 
 

I2C


Funzioni particolari

La manipolazione delle linee SDA e SCL consente di introdurre alcune condizioni speciali che aumentano la flessibilità e l' efficienza del bus. Sono:

  • clock stretching
  • clock synchronization
  • arbitraggio

 

CLOCK STRETCHING

Una delle caratteristiche più significative del protocollo è il clock stretching (letteralmente "allungamento del clock"). Questa azione ha lo scopo di dare ai dispositivi "lenti" abbastanza tempo per rispondere. 

Se un dispositivo è lento, è possibile che occorra un certo tempo prima di aver elaborato il dato ricevuto; in questo caso la periferica Slave è autorizzata a portare a livello basso la linea SCL e a mantenerla a questo livello fino a che è necessario, indicando che non è ancora pronta per elaborare i altri dati. 
Da parte sua il Master, rilasciando la linea del clock, dovrà verificare che essa ritorni effettivamente a livello alto per via dei pull-up; se questo non succede è indice che lo Slave sta chiedendo più tempo. Ne deriva che il Master arresta le operazioni fino a che SCL non viene rilasciata (questo è possibile perchè, ricordiamo, le linee del bus sono open drain - open collector e vanno a livello alto attraverso i pull-up).

Anche se il Master può tenere la linea SCL a livello basso come desidera, il termine "clock stretching" è normalmente utilizzato solo quando l' azione è eseguita da uno Slave.
Il clock stretching è l' unico momento in cui uno Slave può manipolare la linea SCL
Se su un bus nessun dispositivo può richiedere il clock stretching, il Master non ha necessità di controllare questa funzione.

A livello di bit, in teoria qualsiasi impulso di clock può essere allungato, come nel caso in cui il clock del Master sia troppo rapido per lo Slave. A livello di byte, un dispositivo può essere in grado di ricevere un dato, ma richiedere tempo per elaborarlo e quindi operare un clock stretching dopo l' ACK con lo scopo di arrestare la trasmissione del Master per il tempo necessario. In modo High Speed il clock stretching è ammesso solo a livello di byte.

Alcuni dispositivi non hanno la possibilità di supportare il clock stretching e potranno essere indicati come "2-wires interface" e non come I²C puri.
Da notare che, per garantire un transfer rate minimo, SMBus pone dei limiti alla lunghezza del clock e i dispositivi non possono bloccare il bus oltre un certo tempo.

Clock synchronization

Due Master possono iniziare a trasmettere contemporaneamente sul bus inattivo. E' evidente che questa circostanza è inaccettabile, in quanto la trasmissione dei dati sarebbe corrotta dall' accesso contemporaneo di due unità che cercano di inviare bit differenti. Occorre, quindi, un sistema di arbitraggio per decidere quale unità prenderà il controllo del bus e completerà la sua trasmissione.
Questa operazione è svolta dal clock synchronization e dall'arbitraggio.
Ovviamente se sul bus è presente un solo Master, queste funzioni non sono necessarie.

La sincronizzazione del clock si basa sulla linea SCL che è un wired-AND di open collector-open drain. 
Tutti i Master generano il proprio clock e i dati sono validi durante il periodo di livello alto del clock.
E' possibile che i clock di diversi Master siano differenti ed è necessario per l' arbitraggio, che procede bit per bit, che i clock siano uguali.

Il diagramma rende graficamente la situazione.

La transizione da livello alto a livello basso della linea SCL causerà da parte dei Master un conteggio basato sul proprio periodo di clock. Se il Master rilascia SCL, ma la linea non ritorna a livello alto, questo significa che un altro Master la sta impegnando. Non  si può cambiare lo stato della linea di SCL se un altro clock la sta tenendo a livello basso; quindi SCL resterà a livello basso per il periodo del clock più lento, mentre il Master con il periodo più breve porterà il suo switch della linea SCL ad alta impedenza e aspetterà in wait state.

Quando tutti i master interessati hanno esaurito il loro conteggio del periodo a livello basso, la linea di clock sarà rilasciata e andrà a livello alto. Non ci sarà quindi alcuna differenza tra i clock dei Master e lo stato della linea SCL; tutti i Master inizieranno a contare i loro periodi di livello alto nello stesso momento. Il primo Master che completa il suo periodo, costringerà nuovamente la linea SCL basso. In questo modo viene generato un clock SCL sincronizzato nel periodo a livello basso, determinato dal Master con il più lungo periodo di livello basso e il periodo a livello alto determinato da quello con il più breve periodo a livello alto.

 

Arbitraggio

L' arbitraggio, come la sincronizzazione del clock, si riferisce ad una porzione del protocollo richiesto solo se verrà utilizzato più di un Master nel sistema. Gli Slave non sono coinvolti in queste procedure.

Un Master può iniziare un trasferimento solo se il bus è libero, ovvero entrambe le linee a livello alto, sostenute dai pull-up. Il Master che rileva il bus libero genererà una condizione di Start entro il tempo minimo di attesa stabilito dalle specifiche (tHD; STA); però è possibile che due Master cerchino di accedere al bus nello stesso momento: l'arbitraggio è quindi necessario per determinare quale Master prenderà il controllo. L' arbitraggio procede bit per bit: durante ogni bit, mentre SCL è a livello alto, ogni Master controlla il livello di SDA per vedere se corrisponde a quello che ha inviato. Questo processo potrebbe richiedere un certo numero di bit: i Master sono effettivamente in grado di completare un'intera transazione senza errore, fintanto che il dato trasmesso è identico, ma se il Master 1 tenta di inviare un livello alto mentre l' altro invia un livello basso, sa che ha perso l'arbitrato e disconnette il driver di uscita SDA, mentre il Master 2 va a completare la transazione. Nessuna informazione viene persa durante il processo di arbitraggio. 

Un Master che perde l'arbitraggio può generare impulsi di clock fino alla fine del byte in cui perde l'arbitraggio e dovrà riavviare la transazione quando il bus sarà libero. 
Se un Master incorpora anche una funzione di Slave e perde l' arbitraggio durante la fase di indirizzamento, è possibile che il Master vincente stia cercando di indirizzarlo; il Master perdente deve quindi passare immediatamente alla sua modalità di Slave

Siccome il controllo del bus è deciso esclusivamente sull'indirizzo e i dati inviati dai Master concorrenti, il protocollo non prevede alcun Master a livello superiore, né alcun ordine di priorità sul bus.

Di conseguenza si potrebbero verificare condizioni non definite nelle seguenti situazioni: 

  • Un Master invia una condizione di Restart mentre un'altro sta inviando bit di dati.
  • Un Master invia una condizione di STOP e l' altro sta inviando dati.
  • Un Master invia una condizione di Restart e l' altro invia uno Stop

 

Auto incremento

Dispositivi I2C dotati di un'area dati di dimensioni consistenti, come RAM o EEPROM o Flash, implementano un automatismo per cui il dispositivo mantiene un puntatore interno che viene incrementato automaticamente su dati da leggere o scrivere; questa funzione che può essere impostato manualmente oppure interamente automatica. Questo è utile per acedere ad una succesione di dati in modo ordinato ed efficiente.
L' incremento automatico non è parte dello standard I2C, ma è una caratteristica comune in molti dispositivi I2C.
Una tipica sessione di comunicazione è questa:

  • Il Master invia una condizione di Start
  • Segue un byte dell'indirizzo dello Slave con il bit di lettura/scrittura in modo da impostare il il puntatore dell'auto incremento
  • Se la funzione è supportata, il Master invia il dato di auto incremento
  • Il Master invia una condizione di Restart per leggere dati a partire da posizione iniziale dell' area puntata
  • Il Master invia un byte dell'indirizzo a cui accedere
  • e legge/scrive un numero arbitrario di byte dal dispositivo: la caratteristica auto incremento fa si che il puntatore interno, ad ogni accesso, sia modificato, permettendo di accedere a byte consecutivi senza ulteriori invii di indirizzo
  • Terminato il trasferimento, il Master rilascia il bus con una condizione di Stop

Ovviamente sarà necessario consultare i fogli dati dei singoli dispositivi per verificare la possibilità di auto incremento e i le relative operazioni necessarie. 

 

Rilevamento degli elementi sul bus e auto configurazione

Utilizzando, ad esempio, il byte di Start  è possibile implementare sistemi di identificazione delle periferiche sul bus e modalità di auto configurazione del sistema molto complessi. La sequenza tipica è

  • < Indirizzo primario > + W
  • <byte di Start 00000001>
  • < Indirizzo secondario >
  • < DeviceType> < Sensor String > < Indirizzo Sensore >

Sono classificabili i DeviceType, che contiene la descrizione della classe di appartenenza del dispositivo (ad esempio Sensori, battery manager, dispositivi di comunicazione, GPS, terminatori, ecc) e i SensorString, che contengono le specifiche del sensore (temperatura, pressione, velocità, umidità, ecc) in modo da permettere al un Master di configurazione di operare una configurazione dinamica del bus


Copyright © afg. Tutti i diritti riservati.
Aggiornato il 04/01/12.