Esiste un numero massimo di slave i2c che un master i2c può pilotare? Quali sono i fattori fisici limitanti?
Esiste un numero massimo di slave i2c che un master i2c può pilotare? Quali sono i fattori fisici limitanti?
Risposte:
Il fattore limitante del software è la dimensione dell'indirizzo utilizzato per gli slave: 7-bit o 10-bit, che supportano rispettivamente i dispositivi 127 e 1023. Fisicamente, ci sono due restrizioni. In primo luogo, la dimensione fisica del bus perché il bus è pensato solo per le corse brevi (la parte inter IC). Se il bus è troppo grande, ci sono effetti di ritardo capacitivo e di caricamento che devono essere affrontati. In secondo luogo, alcuni dispositivi non possono supportare l'intera gamma di indirizzi I2C. Ad esempio, il giroscopio MPU6050 supporta solo due indirizzi e alcuni dispositivi riservano indirizzi specifici per scopi speciali.
L'indirizzamento limita il numero di dispositivi: alcuni possono utilizzare l'indirizzamento a 10 bit (usato abbastanza raramente), il che limita il numero di indirizzi a 1024. Ci sono una manciata di indirizzi "riservati".
I2C (al contrario di "bus a due fili" o qualunque altra cosa voglia chiamare un bus simile), dovrebbe seguire lo standard NXP (née Philips), le specifiche del bus I2C UM10204 e il manuale dell'utente . Questo dovrebbe essere il tuo documento di riferimento principale, non le varie interpretazioni e sottoinsiemi esistenti altrove.
Il numero massimo di dispositivi sarà influenzato dalla capacità di azionamento dell'uscita più debole (che a sua volta determina la resistenza minima di pullup), dal cablaggio e dalla capacità di ingresso e dalla modalità / frequenza operativa. Vedere la sezione 7.2 Funzionamento al di sopra della capacità massima consentita del bus se la capacità massima deve essere superata:
Un bus i2c è limitato principalmente dalla capacità del bus (e quindi dalla velocità) e dagli indirizzi dei dispositivi accessibili. E spazio sulla tavola fisica.
Ma non esiste un limite superiore reale, quando si tiene conto di buffer bus, extender, ripetitori, hub, multiplexer, switch (o qualsiasi altro nome per un dispositivo che può passare da più bus). Questi aggiungono un certo sovraccarico di i2c, che può essere accessibile tramite lo stesso bus i2c. Il PCA9548A, ad esempio, è uno switch bus a 8 bit.
Questo singolo chip può teoricamente quadruplicare il numero di slave i2c (127 * 8) altrimenti disponibili. E il PCA9548A può essere configurato per un massimo di 8 indirizzi su un singolo bus, quindi 8 * 8 * 127 dispositivi. (la matematica potrebbe essere disattivata). E questo è solo con questo dispositivo e non di più.
Francamente, non ci sono limiti teorici se ti adegui alla capacità.
I2C specifica 2 lunghezze di indirizzo, 7 e 10 bit , che fornisce rispettivamente un massimo teorico di 128 e 1024 indirizzi distinti.
Tuttavia, ci sono alcuni indirizzi riservati, come 0x00 (chiamata generale). Ciò limita ulteriormente lo spazio degli indirizzi.
Se stai costruendo un sistema in cui hai il controllo diretto sui dispositivi I2C, puoi farlo utilizzare gli indirizzi riservati per uso personale, ma il sistema non sarà più conforme allo standard I2C.
Oltre all'indirizzamento, esistono le limitazioni del bus fisico. Ogni dispositivo sul bus deve essere in grado di abbassare il bus in un determinato intervallo di tempo (a seconda della velocità del bus). Se il bus ha molta capacità, i dispositivi potrebbero non essere in grado di tirare SDA abbastanza velocemente e i pull-up potrebbero non riportare SDA abbastanza velocemente.
Ora, i problemi hardware possono essere superati con un po 'di hardware del driver. Sto lavorando a un progetto in questo momento che utilizza I2C per comunicare con dispositivi su diversi 10 metri. L'autobus principale utilizza 24v e ogni scheda ha un driver che scende a 3,3v.
In poche parole, la limitazione fisica di I2C può essere superata. L'indirizzamento può essere superato, ma solo se si ha il controllo diretto sul dispositivo.
La limitazione primaria sul numero di slave che un master può pilotare generalmente proviene da fattori elettrici come capacità del bus, dispersione, resistenza del convertitore, ecc. Se si possono costruire slave con capacità parassita zero e perdita zero e se è possibile collegarli con tracce di scheda a capacità zero, quindi la capacità del bus non sarebbe un fattore, ma in pratica nessuno dei due presupporterà.
L'indirizzamento di dispositivi che "si conoscono" l'uno dell'altro, invece, non è davvero un problema. Sarebbe banale progettare una periferica che consenta di collegare miliardi di chip usando un indirizzo di lettura e uno di scrittura. Basta specificare che ogni dispositivo deve avere un ID univoco a quattro byte ed è tenuto ad ascoltare sempre l'indirizzo di scrittura, ma deve abbandonare ogni transazione i cui primi quattro byte di dati trasmessi non corrispondono al proprio ID. Specificare inoltre che i dispositivi possono rispondere all'indirizzo di lettura solo se l'ultima transazione di scrittura ascoltata corrisponde al loro indirizzo.
Se si desidera aggiungere la possibilità che il master determini gli ID di tutti gli slave collegati, è possibile riservare alcuni intervalli di ID speciali per tali scopi. Ad esempio, si potrebbe dire che se il primo byte ID è FF, i successivi quattro byte saranno una maschera e i quattro successivi un ID; un dispositivo dovrebbe rimanere connesso (e acquisire l'ultimo byte ID) se la parte del suo ID specificata dalla maschera corrisponde a quella indicata nel comando. Ciò consentirebbe a un master di identificare almeno un dispositivo che utilizza 64 transazioni e dispositivi aggiuntivi che utilizzano 62 o meno transazioni ciascuno. Forse non è il mezzo più veloce possibile per l'identificazione del dispositivo, ma non è male dato uno spazio di ricerca di miliardi di ID dispositivo.
Risposta breve: dipende
Se si dispone di dispositivi (comuni) con indirizzi a 7 bit fino a 104 dispositivi (128 indirizzi - indirizzi riservati (0x00-0x07 e 0xF0-0xFF sono riservati)) (si applicano alcune limitazioni) Se si dispone di dispositivi (meno comuni) che supportano 10 bit indirizzare fino a 1024 dispositivi (è possibile combinare dispositivi a 7 bit e 10 bit e raggiungere fino a 1136 dispositivi in quel modo)
Ora ai limiti: la maggior parte dei dispositivi semplici può essere configurata solo da 2 a 8 indirizzi diversi. È possibile ovviare a ciò ordinando dispositivi personalizzati con indirizzi di base diversi (ma ciò normalmente significa che si ordina un numero minimo di dispositivi) Esistono anche limitazioni hardware (principalmente capacità del bus) ma questo può essere risolto con speciali driver i2c.
Se si desidera collegare molti dispositivi su distanze maggiori, suggerirei comunque di utilizzare un bus di campo! I2C è destinato alla comunicazione all'interno di un dispositivo (come un televisore). Sto usando I2C me stesso con un RaspberyPi con cavi esterni fino a 50 cm (anche con sezioni a T che non dovresti mai avere in un sistema di bus). Funziona sorprendentemente bene.
Il numero di dispositivi collegati al bus è limitato solo dalla capacità totale consentita del bus di 400 pF. Poiché la maggior parte dei circuiti integrati con un'interfaccia I²C utilizza la tecnologia CMOS a bassa potenza e ad alta impedenza, è possibile collegare molti circuiti integrati al bus I²C prima che venga raggiunta la capacità massima
Con chip multiplexer aggiunti (come TCA9544A) o buffer (come PCA9515B) è possibile superare tutti i limiti , sia la capacità del bus che l'indirizzamento.
È possibile posizionare 3 dispositivi con indirizzi identici dietro un multiplexer e selezionarne solo uno, comunicare con esso e successivamente selezionarne un altro. Naturalmente il software diventa più complesso.
Se si dispone di un cablaggio lungo, è possibile posizionare un buffer nel mezzo e superare il limite di capacità.