Come risolvere gli scontri degli indirizzi I2C?


39

Voglio collegare più dispositivi slave I2C a un microcontrollore tutti sullo stesso set di pin, ma i dispositivi I2C condividono tutti lo stesso indirizzo. Gli indirizzi sono fissi nell'hardware.

Esiste un modo per connettere più dispositivi con lo stesso indirizzo?

Forse una sorta di modulo di traduzione degli indirizzi I2C con ogni dispositivo con un indirizzo configurabile in modo da poter assegnare i miei indirizzi a ciascuno.

Risposte:


24

In I2C non è integrato nulla per farlo, normalmente i dispositivi slave avranno alcuni pin esterni che possono essere impostati su 0 o 1 per attivare un paio di bit di indirizzo per evitare questo problema. In alternativa, ho avuto a che fare con alcuni produttori che hanno 4 o 5 numeri di parte per una parte, l'unica differenza è il suo indirizzo I2C.

La maggior parte dei dispositivi ha hardware specifico che gestisce la comunicazione I2C, ovvero lo slave ACK è nell'hardware, quindi non puoi davvero hackerarlo.

Per quanto riguarda il modulo di traduzione, è possibile acquistare PIC $ 0,50 con 2 bus I2C e scrivere un codice rapido per farli agire come traduttori di indirizzi.


Grazie. Sì, questi dispositivi hanno un indirizzo selezionato, ma solo tra due indirizzi e voglio connettere più di 5 dispositivi, quindi finirei comunque con scontri. Non avevo pensato di usare un PIC. Dovrebbe funzionare. Non c'è niente fuori dallo scaffale che fa questo genere di cose?
Simon P Stevens,

11
NXP crea un sacco di multiplexer / switch per I2C, potresti essere in grado di truccare qualcosa da quelli: ics.nxp.com/products/i2cmuxes per esempio, potresti creare nel tuo caso 3 rami secondari, ciascuno con 2 dispositivi su di esso e usa uno degli switch di NXP per raggiungere il tuo obiettivo.
Segna l'

Fantastico, è esattamente il tipo di cosa che stavo cercando. Non sapevo proprio il nome. Grazie.
Simon P Stevens,

Questa risposta ha 7 anni, quindi credo che avrebbe potuto essere la migliore al momento in cui è stata offerta. Per altri che arrivano ora, tuttavia, alcune delle risposte molto più recenti (attualmente classificate in basso nell'elenco) offrono approcci potenzialmente migliori basati su componenti più recenti che sono ora sul mercato.
Mattone,

6

Ho appena riscontrato questo problema con più dispositivi I2C con un indirizzo fisso. La nostra soluzione era quella di utilizzare le linee I / O sul microcontrollore per forzare le linee SDA in alto sui dispositivi che non vogliamo indirizzare, mentre la linea I / O per il dispositivo a cui ci stiamo indirizzando è impostata come input (alta impedenza ). Ciò significa che solo il dispositivo target corrisponde al suo indirizzo I2C e gli altri ignorano tutti i dati successivi.

Più dispositivi I2C con lo stesso indirizzo

I resistori sulla linea SDA per i dispositivi inattivi finiscono per fungere da pull-up per il bus, quindi il valore esatto dipenderà da quanti dispositivi hai e da quale pull-up hai bisogno per il tuo bus. Quindi, se scegli resistori da 10K, 3 dispositivi inattivi danno un pullup 3K3.

I diodi schottky assicurano che il dispositivo possa comunque tirare la linea SDA abbastanza in basso quando si trasmettono i dati all'host.


Apprezzo che tu abbia seguito e pubblicato questo. Questa è una soluzione abbastanza ingegnosa, sono certo che sarà utile per gli altri.
Simon P Stevens,

Una bella nicchia che può essere utilizzata su alcune applicazioni. Mi piace molto.
Harry Svensson,

5

Se nessuno dei dispositivi I2C utilizza il clock stretching (handshaking) e se si esegue il bit bang del master I2C, un semplice trucco consiste nel far sì che alcuni dei dispositivi scambino l'orologio e i pin dei dati. Durante la trasmissione di un byte, il dispositivo che ha scambiato l'orologio e i pin dati vedrà ogni bit "0" come un non evento (i dati salgono e scendono senza orologio) e vedranno ogni bit "1" come un arresto I2C e inizia (orologio in aumento mentre i dati sono bassi, incerti dall'aumento e dalla diminuzione dei dati, seguiti da una diminuzione dell'orologio). Le condizioni di arresto e avvio intenzionali per un dispositivo possono essere viste come bit di dati dall'altro, ma a meno che un dispositivo non abbia un numero eccessivo di condizioni di avvio e arresto tra i bit "1", è improbabile che un dispositivo venga "accidentalmente"


6
Non sto effettuando il downvoting, ma questo mi sembra un po 'rischioso. La mia esperienza con I2C è che è abbastanza soggetto al rumore con la solita connessione. Tuttavia, si utilizza la parola "hack" e si menziona l'avvertenza "se nessuno dei dispositivi i2c utilizza il clock stretching", quindi se può funzionare per qualcuno, quindi maggiore potenza per loro.
Jason S,

5

Prenderei in considerazione l'utilizzo di switch bus per multiplexare il bus I2C tra i dispositivi con indirizzi in conflitto. Gli switch bus hanno capacità e resistenza molto basse e, diversamente dai buffer / driver, sono veri switch che collegano o disconnettono due nodi di circuito.

Gli switch bus di solito hanno una caratteristica dispari, che non ha importanza per I2C perché utilizza dispositivi a drain aperto: uno switch bus ha una bassa resistenza all'accensione quando si collegano tensioni vicine a 0 (Vss), ma la resistenza aumenta drammaticamente quando le tensioni si avvicinano l'alimentatore Vdd. (Questo perché fondamentalmente sono MOSFET con tensioni di gate all'alimentazione quando si accendono, quindi quando le tensioni commutate si avvicinano a Vdd, il Vgs disponibile è molto più basso)


1
Il collegamento è interrotto. fairchildsemi.com/product-technology/bus-switches funziona meglio.
florisla,

4

Avevo due sensori di luce a colori TCS3414 che volevo confrontare (i pacchetti FN e CS, che hanno filtri diversi). L'indirizzo I2C è cablato. Dopo aver esaminato il modo in cui I2C funziona in termini di linee SCL (clock) e SDA (dati), è sembrato che la disattivazione della linea SDA avrebbe impedito al chip di iniziare o fermare un bit e quindi lasciarlo inattivo. Così utilizzato un interruttore analogico CMOS (4066B) per accendere o spegnere la linea SDA per ciascun dispositivo. Questo ha funzionato bene per il passaggio tra i due dispositivi. So che è un trucco e il PCA9548 sarebbe molto meglio, ma non ne avevo uno a portata di mano.


In realtà, questo non è affatto un trucco, e direi che questa dovrebbe essere la risposta accettata. Ho visto questo usato in diversi prodotti commerciali e non riesco a pensare a una soluzione migliore (a meno che tu non abbia GPIO disponibile e quindi abbia bisogno di una soluzione I2C pura come i mux specifici I2C). I buoni vecchi mux analogici hanno molta larghezza di banda e sono pazzeschi.
Jay Carlson,

4

Ora c'è una risposta: Linear Tech ha la serie LTC4316 / 17/18 di traduttori di indirizzi. Sono relativamente nuovi e la disponibilità è incerta.


Componente molto interessante. La maggior parte dei dispositivi I2C ha 2 indirizzi fissi e questo può LTC4316 potrebbe potenzialmente raddoppiare l'indirizzamento a un costo ragionevole.
Mehrad,

4

Diversi produttori offrono circuiti integrati multiplex e switch bus I2C.

Un mux può attivare un canale alla volta; un interruttore può abilitarne più in parallelo.

Controlla ad esempio le offerte di NXP , TI e Maxim .

Per la sperimentazione, Adafruit ha una scheda TCA9548a .

Se si dispone di 8 chip target con indirizzi identici, selezionare un MUX 8-to-one. Prima di accedere a uno qualsiasi dei chip target, configurare il MUX per attivare il bus I2C corretto.

vantaggi

  • Non richiede programmazione (rispetto all'approccio basato su microcontrollore)
  • Può supportare le funzionalità I2C e le velocità di cui hai bisogno (rispetto ai normali mux bus analogici / digitali). Ad esempio, un normale MUX (non I2C) non passerà gli indirizzi di chiamata generali a tutti i suoi canali.

-1

Utilizzare un semplice chip demux (ad es. 74HC139 afaik) e collegare il pin CLK I2C all'input (poiché il pin CLK I2C è solo output). Utilizzare i pin GPIO per controllare l'output desiderato. Quindi il pin dati I2C può essere condiviso tra tutti gli slave.


6
SCL non è solo in uscita. Uno schiavo può allungare l'orologio se deve rallentarlo.
Stevenvh,

È possibile utilizzare un multiplexer analogico (che è bidirezionale) ma un decodificatore potrebbe non funzionare per il motivo indicato da Stevenh. Se usi il multiplexer avrai bisogno di una polpa debole sul lato slave per assicurarti che rimanga inattiva. Modificare anche la selezione del multiplexer solo quando il bus è inattivo.
Kevin White,
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.