I²C-Bus Extender: amplia la distanza di collegamento dei tuoi dispositivi

Estendiamo la distanza di collegamento tra dispositivi a interfaccia I²C-Bus, superando i limiti imposti da capacità parassite e resistori di pull-up.

Per quanto sia molto, anzi moltissimo utilizzato in elettronica per interconnettere dispositivi a bordo della stessa scheda o sensori e componenti nello stesso apparato, il bus I²C (e il suo derivato, l’SM-Bus) soffre di un paio di limiti, che derivano essenzialmente da come funziona: la velocità di comunicazione e la distanza massima alla quale possono trovarsi i device Slave rispetto al Master.

La copertura, se così vogliamo chiamarla, è limitata dal fatto che nell’I²C-Bus, per avere una linea dati bidirezionale si sfruttano dispositivi di output open-collector (o open-drain) che consentono di portare la linea a livello basso senza danneggiarsi reciprocamente, mentre lo stato logico alto vene mantenuto, in assenza di conduzione da parte dei transistor, grazie a un resistore di pull-up.

Il valore di quest’ultimo forma, insieme alle capacità parassite (tipicamente 400 pF) dei dispositivi affacciati sul bus (nel caso di input a MOSFET si tratta della capacità di gate, che è rilevante), una costante di tempo parassita tale da limitare il massimo data-rate implementabile.

La situazione viene peggiorata dalla distanza di collegamento e dalla lunghezza delle linee.

Questo limite può essere superato, almeno se basta collegare tra loro solamente due apparati (un Master e uno Slave), interfacciando i dispositivi mediante una coppia di transceiver come quello descritto in queste pagine, che nasce per irrobustire il segnale quanto basta a superare distanze interessanti per molte applicazioni domotiche o IoT; unico vincolo è l’utilizzo, per la connessione, di un doppino ritorto, ovvero di un cavo dati a coppia twistata o un cavo di rete ethernet cat. 5e.

Un transceiver avrà come ingresso/uscita il dispositivo Master I²C-Bus e l’altro il dispositivo Slave.

Breakout board I2C Extender

Schema elettrico del I²C-Bus Extender

Il circuito è molto semplice e lo potete vedere dal relativo schema elettrico che trovate in queste pagine; il merito è tutto dell’integrato P82B715 che contiene un doppio driver in grado di elevare la corrente assorbita a livello basso dalla linea, la quale ha ovviamente la possibilità di erogarla dall’alimentazione tramite i resistori di pull-up.

Sostanzialmente opera come una sorta di driver a loop di corrente, capace di convertire i 3mA tipici di partenza in 30 mA sui cavi di collegamento.

Nella Fig. 1 potete vedere lo schema a blocchi dell’integrato, che nello schema elettrico abbiamo siglato U1.

Fig. 1 Schema a blocchi dell’integrato

 

Questo componente, in un package SMD SO-8 a quattro piedini per lato integra due buffer in grado di erogare, pilotati dai segnali applicati alle linee di ingresso, una corrente che arriva a 30 mA e perciò garantisce connessioni fino a 20 metri con ottima immunità ai disturbi, tanto più se realizzata tramite cavo dati schermato come, ad esempio, quello per reti a 100 Mbit (cat. 5e).

Ciascun buffer ha un piedino di ingresso ed uno di uscita, perciò nell’integrato abbiamo due linee di input (SCL ed SDA) facenti capo ai piedini Sx (SDA) e Sy (SCL) che si interfacciano al dispositivo I²C-Bus da affacciare sul “bus potenziato” e altrettante di output localizzate ai piedini Lx (corrispondente a Sx, quindi relativa all’SDA) e Ly (relativa a Sy e quindi all’SCL) che affacciano il bus sul cavo che lo interconnetterà al dispositivo gemello.

In verità non è esatto parlare di input e output perché la linea dati del bus I²C è bidirezionale, quindi a stretto rigore si dovrebbe definire il canale Sx (pin 3)/Sy (piedino 6) come lato dispositivo I²C-bus e quello Lx (pin 2)/Ly (pin 7) come lato cavo o interfaccia long-range o extender.

In ogni caso, come vedete nello schema elettrico, sono presenti i canonici resistori di pull-up sia sul lato device sia su quello del cavo di interconnessione con il circuito gemello; però R1 e R2 (lato device I²C-Bus) sono di valore relativamente elevato e standard per la connessione I²C-Bus, mentre quelli dal lato del cavo, dovendo il driver erogare correnti più elevate, hanno valore inferiore. Il tutto funziona comunque a 5 V, sia lato device, sia lato cavo.

I resistori di pull-up servono perché di fatto i buffer contenuti nell’integrato non sono altro che dei ripetitori degli stati logici, ovvero del funzionamento dei transistor (sovente MOSFET…) presenti sui pin SDA ed SCL dei canonici dispositivi a interfaccia I²C-Bus: quindi, prendendo in considerazione la linea SDA, in presenza dello zero logico su Sx la linea Lx si porta in modalità sink e chiude a massa il piedino 2, mentre con 1 logico (open) da parte del device I²C-Bus la stessa rimane open e consente al dispositivo che si trova dall’altro lato del cavo di condizionare lo stato della linea SDA.

Ogni buffer è bidirezionale, quindi se quando il device collegato al lato I2C BUS del circuito è in stato open su una certa linea, per esempio SDA, quello dall’altra parte invia lo zero (ossia chiude a massa) SDA dal lato I2C EXTENDER del circuito, l’ingresso Lx va a condizionare in tal senso Sx. In breve, con Sx a zero logico Lx va a livello basso e non può essere mutata dal lato I2C EXTENDER, mentre se Sx è a livello alto (open) l’eventuale zero logico su Lx la porta anch’essa a zero.

Lo stesso vale per la linea SCL, che essendo il clock, tuttavia, è unidirezionale, cioè se il segnale di clock viene applicato ad SCL e quindi ad Sy, Ly lo segue e il piedino Sy dell’integrato che si trova sulla scheda gemella dall’altra parte del bus I²C esteso fa altrettanto.

Ovviamente il buffer della linea di clock è bidirezionale non perché SCL ammetta il passaggio in entrambe le direzioni, ma perché si utilizza lo stesso integrato nei due circuiti posti alle estremità del cavo di estensione dell’I²C-Bus e pertanto deve poter condizionare il livello o subirlo, a seconda di qual è il lato connesso al Master del bus; infatti il Master dell’I²C-Bus è il dispositivo che non solo può avviare la comunicazione, ma anche quello che genera il clock e lo invia ai device Slave.

Sul piano delle connessioni con l’esterno, il circuito che vi proponiamo prevede due possibilità di connessione con la linea estesa e i dispositivi a interfaccia I²C-Bus: tramite morsettiere o mediante spinotti, ovvero prese jack da 3,5” a quattro poli (opzionali).

Nello schema elettrico, i jack sono siglati BUS ed EXT: il primo si collega al dispositivo I²C-Bus da estendere (corrisponde all’ingresso I2C) e il secondo al cavetto che termina sulla scheda gemella (equivale al lato I2C EXTENDER).

Dato che in questa connessione transita anche l’alimentazione di ingresso del circuito, se si utilizzano le prese jack è consigliabile effettuare la connessione e disconnessione degli spinotti quando ancora non è stata applicata l’alimentazione.

In tema di alimentazione, il circuito accetta in ingresso tensioni continue di valore compreso fra 8 e 12Vcc e il regolatore integrato U2 (un comune 7805…) ottiene, a partire da tale valore, 5 volt ben stabilizzati e filtrati dal condensatore C5, che alimentano sia l’integrato U1, sia i resistori di pull-up delle linee I²C-Bus e linea estesa.

Realizzazione pratica del I²C-Bus Extender

Elenco Componenti:

R1, R2: ,7 kohm (0603)
R3, R4: 470 ohm (0603)
C1, C2: 100 nF ceramico (0603)
U1: P82B715TD,112
U2: LD1117S50TR
Varie:
- Morsetto 2 vie 
passo 2.54mm (4 pz.)
- Circuito stampato S1481 
(22x35 mm)

 

Dovrete realizzare o acquistare almeno una coppia di circuiti uguali e potranno servire per collegare a un’unità Master un sensore remoto o ad un altro dispositivo I²C-Bus, purché sia posto a una distanza non superiore ai 20 metri.

Rammentiamo che per avere le massime prestazioni in fatto di qualità del segnale e distanza raggiungibile, conviene utilizzare del cavo di rete Ethernet cat. 5e, impiegando uno dei doppini ritorti in esso contenuti per i dati e, possibilmente, collegare da entrambi i capi la maglia di schermo del cavo alla massa di ciascuna delle schede.

Collegare lo schermo consente di elevare l’immunità ai disturbi, contribuendo, insieme al funzionamento in corrente degli extender, a rinforzare la comunicazione sulle lunghe distanze.

L’alimentazione a 12 volt non è necessario trasportarla, o meglio, serve farlo solamente se il dispositivo remoto cui collegherete la scheda non ha una propria alimentazione ma va alimentato con il dispositivo locale: per esempio nel caso di sensori remoti per sistemi domotici e di monitoraggio ambientale, ovvero applicazioni IoT che prevedano il rilevamento di parametri ambientali o condizioni di funzionamento di macchinari e apparati di vario genere.

Insomma, quando non è possibile o risulta sconveniente trovare una fonte di alimentazione per ciò che si trova dal lato Slave.

Analogamente, potrebbe essere necessario disporre di un’unità Master remota e di sensori o comunque dispositivi Slave locali e avere la Master in un luogo privo di fonti di elettricità: è il caso di unità a microcontrollore che elaborano sul posto o comunicano in wireless.

Conclusioni

Il progetto descritto in queste pagine è un ottimo traslatore di livelli di corrente che permette di rendere immune ai disturbi la comunicazione su I²C-Bus a distanze che normalmente non potrebbero essere coperte da un protocollo che, per sua natura, è riservato alla comunicazione dati su scheda tra dispositivi (tipicamente microcontrollori) Master periferiche quali sensori, memorie, I/O Expander a interfaccia parallela.

Ricordiamo che per ciascuna linea si deve utilizzare una coppia di circuiti, uno da connettere all’unità Master e l’altro alla Slave; in teoria si potrebbero connettere anche più Slave sulla stessa linea I²C a valle del dispositivo periferico, in quanto nel bus I²C esiste un unico Master e ciascuno Slave impegna il canale dati solo quando il comando inviato dal Master è diretto ad esso, pertanto a comunicare ci sarà solo uno Slave alla volta.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Menu