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 V−1 V) / 20 mA=130 Ω
  • Rmax=tr/(0.8473∗Cb)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.