Tutorials - Elettronica

 
 

I2C


L' hardware del bus

Va osservato che la Vdd del bus non è specificata come valore, ma solo attraverso i parametri  

  • livello alto VIH = 0.7 Vdd e
  • livello baso VIL = 0.3 Vdd,

per cui, se normalmente il bus utilizza la Vdd di alimentazione dei componenti digitali (da 2.5 a 5 V), nulla vieta che essa sia maggiore, ad esempio 15 V.
Il limite della tensione Vdd dipenderà dalle caratteristiche dei dispositivi e dalla corrente che possono commutare. La specifica indica i limiti 3 mA per il modo standard e 20 mA per il modo Fast, ma molti dispositivi possono trattare anche correnti maggiori.
La corrente sarà limitata dal valore dei pull-up:

Rp (min) = [Vdd - VOL(max) ] / IOL

La necessità dei pull-up rende pure necessario adeguarne il valore alla capacità della linea, abbassandone il valore con l' aumentare della frequenza di comunicazione. I valori tipici vanno da 2 k per clock a 400 kHz, fino a 10 k per clock inferiori a 100 kHz. Microchip, nel documento Getting Started:I2C Master Mode consiglia:

<100 kHz 100 kHz 400 kHz
4k7 2k2 1k

Va notato che, con il ridursi del valore dei pull-up, aumenta la corrente quando i dispositivi comunicano, il che rende  il bus I2C non ideale per applicazioni a basso consumo. 

In ogni caso, la documentazione di NXP fornisce indicazioni per il calcolo del valore dei pull-up.
Considerando che il livello alto è definito come VIH = 0.7 Vdd e il livello baso come VIL = 0.3 Vdd, occorre conoscere il valore della capacità Cb della connessione per determinare il valore della costante RC di capacità e resistenza del pull-up Rp.
Il valore dei pull-up sarà dato da:

Rp (max) = tr / 0.8473 Cb

dove tr è il tempo minimo di salita della commutazione, dipendente dal clock e rilevabile dalle tabelle fornite dal costruttore. Come ordine di grandezza, ecco dei valori approssimati in dipendenza dalla frequenza del clock:

in funzione della capacità
Cp
[pF]

Rp [kohm]

standard fast fast plus
100 12 4 1.5
200 6 2 0.5
300 4 1 0.5
400 3 1 0.5
          

in funzione della tensione

Vdd
[V]

Rp [kohm]

standard
 
e fast
fast plus
2.5 0.5 0.2
5 1.5 0.3
10 2.7 0.4
15 3.5 0.5

I valori sopra riportati sono puramente indicativi, tratti dai diagrammi forniti nella documentazione di NXP.

Se la frequenza e/o la capacità di linea aumentano, il bus richiederà dei pull-up attivi, ovvero dei generatori di corrente, in modo da avere una compensazione del carico capacitivo e quindi una buona qualità dei fronti di commutazione.
Ci sono vari metodi base per implementare questo:

  • uno specchio di corrente (current mirror)
  • una resistenza ed un diodo di calmping a partire da una tensione più elevata
  • una generatore di corrente costante a FET o un diodo a corrente costante bipolare
  • un integrato specifico, ad esempio LTC4311 di Linear Technology

Qui sotto, come esempio, l' applicazione di LT4311, presa dal foglio dati del componente, e, a lato, la forma d' onda della commutazione sulla linea in cui si nota chiaramente l' effetto positivo del generatore di corrente rispetto al solo pull-up.

Per quanto riguarda i collegamenti del bus, occorre essenzialmente che le capacità parassite sia contenute entro un valore tale da non creare problemi ai fronti di commutazione. Anche se il nome dello standard fa riferimento a connessioni tra circuiti integrati, quindi all' interno dello stesso circuito stampato, sono stati realizzati buffer per trasportare la connessione I2C a molti metri di distanza, come il repeater P82B96 che consentirebbe di arrivare a 1000 m, ma con la riduzione del clock ad una trentina di kHz. Tipicamente il limite di capacità della connessione è 400 pF, il che consente di superare vari metri utilizzando cavi che non abbiano capacità superiore a 40-50 pF/m (Belden, cavi STP, ecc). Però, come è evidente, la frequenza massima a cui la trasmissione è possibile sarà in funzione non solo delle caratteristiche dei dispositivi collegati, ma anche di quelle del collegamento e,
come per ogni altro caso di bus remotati, la trasmissione è possibile con sicurezza in relazione alla frequenza di trasmissione, alle caratteristiche dei cavi, al rumore indotto dall' ambiente e, dato che si tratta di una connessione sigle-ended, ai ground bounces..  Ne deriva che, pur essendo possibile remotare elementi di un bus I2C anche a distanze considerevoli, sarà più sensato dare la preferenza ad altri tipi di interfaccia previsti proprio per questa situazione (CAN, RS-422/485, Ethernet, ecc). 
All' atto pratico, al di fuori del circuito stampato, è consigliabile usare:

  • flat cables fino a qualche decina di centimetri
  • cavi piatti twistati (dati+gnd e clock+gnd) per distanze dell' ordine del metro
  • cavi schermati e twistati per lunghezze maggiori

mantenendo le alimentazioni separate e ben disaccoppiate ad ogni periferica. Peraltro lo standard non specifica particolari cavi o connettori, per cui ogni costruttore è ragionevolmente libero nella scelta dei componenti da utilizzare. La stessa documentazione di Philips, però, consiglia di usare connessioni a 4 fili intrecciati; i conduttori dei segnali (clock e dati) non vanno intrecciati tra di loro per limitare la mutua induzione, o crosstalk,  ma preferenzialmente sono associati ad un cavo di massa (gnd) con lo scopo di mantenere costante l' impedenza e di minimizzare il crosstalk.

Nel caso in cui le capacità parassite siano superiori al limite di 400 pF, si potrà suddividere il bus in sezioni attraverso un buffer o dei multiplexer.

Come nel caso esemplificato ( o in quello più complesso presentato all' inizio del tutorial). Tra l' altro, una simile configurazione permette l' impiego di due Vdd differenti.
Sempre nel caso di Vdd differenti, sono disponibili traslatori di livello per adeguare le periferiche sullo steso bus.

NXP ha realizzato numerosi dispositivi per il supporto hardware al bus e sono virtualmente coperte tutte le possibili applicazioni. Le application notes di NXP AN255, I2C / SMBus Repeaters, Hubs and Expanders e AN262, PCA954x Family of I2C / SMBus Multiplexers and Switches illustrano queste possibilità.

Una ulteriore nota è utile dare riguardo alla possibilità di proteggere i dispositivi sul bus da possibili sovratensioni, inserendo in serie delle resistenze.

L' aggiunta delle resistenze Rs richiede un ricalcolo dei pull-up.

La documentazione di NXP fornisce informazioni anche relativamente a questo aspetto.

Come ordine di grandezza per le resistenze serie:

Rp

Rs (ohm)

Vdd  = 2.5V Vdd = 5 V
10 k 500 1k5
4 k 200 600
2 k 100 300
1 k 75 100

Esistono comunque dispositivi che integrano già sistemi di protezione contro sovratensioni.

In applicazioni critiche è indispensabile aggiungere un sistema di isolamento completo tra unità a microcontroller e periferiche remote: questo evita i potenzialmente dannosi loop di terra, i rischi per l' operatore e i disturbi raccolti dalle linee.

Un esempio è rappresentato da un componente specifico di Analog Devices.

Si tratta di isolatore galvanico ADUM1250, hot swappable a due canali (due bus I2C oppure PBUS o SMBUS). Può operare fino a 1 MHz e con un isolamento di 2.5 kV.
Altri produttori di dispositivi analoghi sono Silicon Labs o Linear technology.
Un efficace isolamento può essere effettuato anche con opto isolatori.


I moduli di comunicazione sincrona

Un drive per shift register può essere scritto con semplicità per qualsiasi microcontroller, ma clock elevati e trasmissioni complesse come quella di I2C costituiscono situazioni gravose da emulare in software.
In particolare risulta molto impegnativo realizzare gestioni che non siano in polling e del genere bit-banging.

Per evitare questo carico all' utente, nei principali microcontroller viene integrata una periferica specifica per la comunicazione sincrona, dotata di meccanismi di buffer e di flag per la gestione sia in polling che in interrupt. In genere questi moduli sono in grado di gestire diversi formati, ad esempio SPI, I2C e SMBus.

Nel modulo di gestione seriale sincrona tipico di un microcontroller, per i PIC chiamato MSSP o SSP (Master Synchronous Serial PeripheralSynchronous Serial Peripheral), sono presenti, oltre agli shift register (SSPSR nell' immagine sotto), anche dei buffer (SSPBUF nell' immagine) per conservare il dato ricevuto.

Possiamo notare la complessità che non si limita ad un solo registro di spostamento, ma ha come elemento essenziale una complessa logica per il riconoscimento delle condizioni e per l' arbitraggio del clock e le collisioni sul bus e la generazione delle corrette temporizzazioni dei segnali.
Osserviamo anche che, pur avendo gli I/O dei PIC una struttura push-pull (totem pole), i pin configurati per connettersi al bus I2C sono programmati come open drain, con associato il buffer di ingresso a trigger di Schmitt.
I moduli integrati nei microcontroller ricalcano questa struttura, ma possono essere strutturati in modo differente, per cui occorrerà, prima di utilizzarli, documentarsi sui fogli informativi.

Va considerato che, se il rilevamento delle condizioni di Start e Stop, ACK e NACK sono eseguite hardware dai moduli di gestione delle comunicazioni sincrone, la gestione delle operazioni di trasmissione, delle conseguenze dell' arbitraggio, della gestione multi-master, di multiplexer o, comunque, delle periferiche, è demandata al software che controlla il dispositivo.

Quando si comunica con un altro dispositivo I2C, gli 8 bit di dati possono essere un codice di controllo, un indirizzo o dati grezzi. Occorrerà verificare i manuali dei vari dispositivi per individuare le specifiche necessità: diverse periferiche potranno usare codici uguali con fini differenti e per ognuna si dovrà scrivere la struttura di controllo e comunicazione adeguata.

In questo senso, I2C può presentare un non indifferente livello di complicazione, ma, per contro, può dare origine a sistemi complessi dotati di prestazioni elevate. 


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