Posso usare cavi I2C oltre 2m?


24

Nel mio progetto attuale, devo comunicare tra un microcontrollore e alcuni sensori su I2C. Uno di questi è un sensore di temperatura, deve essere posizionato a circa 2 metri dal microcontrollore. Non riesco a scegliere un altro protocollo (il sensore si trova su un modulo con un determinato connettore / pin / protocollo).

Pensi che sia possibile comunicare in questa configurazione? Quali informazioni devo cercare per assicurarmi che possano o meno essere possibili? Hai qualche consiglio?

È la prima volta che comunico con IC al di fuori del PCB.


5
Si prega di aggiungere ulteriori informazioni. Quale sarebbe la velocità i2c? Resistenze di pull-up? Cavo usato e sua capacità? Cos'è l'MCU host e qual è il sensore? Ma in generale, I2C funziona a diversi metri su cavi come HDMI, quindi dovrebbe funzionare quando le cose sono fatte correttamente.
Justme,


6
"Non riesco a scegliere un altro protocollo" Puoi mettere un secondo microcontrollore vicino al sensore, leggere i dati e inviarli con qualsiasi protocollo che ti piace.
FooBar,

1
Hai una velocità minima in kbit / s?
Albero

2
Se rallenti l'orologio puoi andare abbastanza lontano.
Copper.hat

Risposte:


36

I2C non è progettato per essere utilizzato su lunghe distanze ma conosco diverse applicazioni in cui viene effettivamente utilizzato su una distanza di circa 2 metri. Conosco anche un caso in cui avevano problemi con quello ed è stato eventualmente risolto riparando anelli di massa credo.

Per essere sicuro che funzionerà, è necessario utilizzare un extender del bus I2C come il P82B715.

Tuttavia, la scheda tecnica del PB2B715 riporta quanto segue nella sezione 8.2:

Per i tipici cavi a doppino intrecciato o piatti, utilizzati per la telefonia o il cablaggio Ethernet (Cat5e), tale capacità è compresa tra circa 50 pF e 70 pF / metro, quindi il cavo potrebbe, in teoria, essere lungo fino a 50 m . Per esperienza pratica, 30 m hanno dimostrato che una lunghezza del cavo sicura può essere guidata in questo modo semplice, fino a 100 kHz, con i valori indicati. Sono possibili distanze più lunghe e velocità più elevate ma richiedono una progettazione più attenta.

Quindi gli esperti (NXP è l'ex Philips, l'inventore di I2C) affermano che a 30 metri è stata dimostrata una distanza percorribile. La mia esperienza dice che 2 metri sono una distanza percorribile e le esperienze che mi sono state segnalate indicano che sono possibili anche bus I2C più carichi senza estensore.

I punti chiave per lavorare bus I2C su lunghe distanze sono:

  • Utilizzando un cavo a bassa capacità (doppino / Ethernet);
  • Limitare la velocità del bus;
  • Avere pull-up che sono dimensionati correttamente.

Calcolo del pullup

Texas Instruments ha una buona nota applicativa (SLVA689) sul calcolo pull-up .

  • (3.6 V1 V) / 20 mA=130 Ω
  • Rmax=tr/(0.8473Cb)trCbCbtrRmax=2950 Ω. La nota applicativa di TI ha grafici in modo da poter trovare rapidamente i valori appropriati.
  • Naturalmente il valore per il pullup è il valore equivalente di tutti i pullup in parallelo combinati. È possibile che sia presente un pullup sull'estremità master, sull'estremità slave e su qualsiasi altro slave / master sul bus.
  • Più sei "al limite", più devi anche tenere conto di "parassiti" come la caduta di tensione nel cavo.

Avere pull-up che sono dimensionati correttamente? Come determinare il valore e la potenza nominale?
Quantum0xE7,

Mentre Nick B ha commentato un'altra risposta, diffidare della possibilità del chip di estensione del bus o di qualsiasi altra cosa che riscaldi il sensore di temperatura di un paio di gradi.
Peter Cordes,

14

In genere, la capacità del bus massima di 400 pF è limitata.

Dovrebbe funzionare bene se si abbassa la frequenza a qualcosa come 1 kHz e si fornisce il disaccoppiamento dell'alimentazione accanto al sensore.

Se hai bisogno di qualcosa di più robusto, puoi utilizzare i convertitori I2C differenziali su entrambe le estremità come PCA9615 .


Ricordo vagamente alcuni sensori con una frequenza I2C minima (non so perché).
Michael,

14

Puoi, ma non è raccomandato.

Autobus diversi per scopi diversi

I2C, come SPI, è progettato per la comunicazione all'interno di una scheda o di un gruppo di schede (si pensi a Raspberry Pi e ai suoi cappelli o arduino e ai suoi scudi). Può funzionare su lunghe distanze (vedi altre risposte) ma non dovrebbe essere usato in quei casi, semplicemente perché non è quello per cui è stato progettato, ottimizzato e qualificato.

Il rischio che correte è che potreste non essere in grado di aggiungere altri sensori in futuro, o che il vostro sistema non funzionerà ovunque, o fallirà in determinate circostanze.

Quello che dovresti cercare è un bus di campo, qualcosa come 1 filo, CAN, RS-485, Ethernet, ecc.

Anche i sistemi wireless come il bluetooth o lo zigbee potrebbero essere un'opzione.


9

Come notato da @filo, I2C è generalmente limitato dalla capacità del bus. Tuttavia, ci sono modi per aggirare questo:

  1. Utilizzare un'estensione bus. Il P82B96 o PCA9600 sarebbero entrambi buone opzioni nel tuo caso.
  2. Se sono necessarie velocità più elevate o cavi estremamente lunghi, è possibile utilizzare un ricetrasmettitore I2C differenziale come il PCA9600 . Tuttavia, ciò renderà il tuo circuito notevolmente più complicato e avrai bisogno di un circuito integrato ad entrambe le estremità del cavo.

Dai un'occhiata a AN10658 e AN11084 di NXP per ulteriori informazioni.


1
Funzionerà bene con un extender di autobus, come molti altri hanno già detto. Qualcosa non immediatamente ovvio da tenere in considerazione è che l'estensione del bus all'estremità del sensore può dissipare abbastanza calore da aumentare la lettura dei sensori di temperatura di un paio di gradi se il sensore e l'estensione del bus sono vicini.
Nick B,

4

Mi piacciono le risposte di filo e Caleb.

Un'altra opzione consiste nell'utilizzare uno o più ponti master 1-Wire-to-I2C DS28E17 sui singoli sensori e cablare il bus come Onewire. Questo è utile per bus> 100m e ben si adatta alle applicazioni di array di sensori a basso rendimento come la temperatura distribuita e la gestione della batteria.


Pensiero interessante, sebbene possa introdurre un sovraccarico di software aggiuntivo se il master non ha un'interfaccia a 1 filo.
Caleb Reister,

Per lo più è un'opzione se si dispone di un host Linux, in quanto ha l'intero stack di driver per questa acrobazia. Su un Raspberry Pi, devi solo collegare GPIO4 all'ingresso da 1 W del DS28E17 attraverso quei 100m di filo (più GND ovviamente), modificare config.txt e il gioco è fatto. È completamente trasparente, sembra un I²C locale. Solo più lento.
Janka

Grazie. Sono rimasto davvero sorpreso dal fatto che 1-Wire possa fare quel tipo di distanza. Immagino abbia senso, poiché i resistori sono più piccoli.
domen

Onewire non si basa sulla temporizzazione del fronte di salita ma, invece, tutta la temporizzazione dei bit viene eseguita in relazione al fronte di discesa, che è guidato attivamente. Ecco perché è meno suscettibile al carico capacitivo elevato. Alcuni nF sono ok.
Janka
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.