Domanda:
Perché le linee I2C utilizzano driver open drain invece di driver tri-state?
athedcha
2017-02-15 23:05:32 UTC
view on stackexchange narkive permalink

La mia comprensione è che le linee I2C utilizzano resistenze di pull-up per portare passivamente il bus a un valore logico alto perché i driver utilizzati sul bus sono driver attivi, ovvero open collector / open-drain.Poiché i driver open collector / open-drain possono portare la linea bassa ma non alta, il problema della contesa del bus è mitigato.

La mia domanda è, tuttavia, perché il protocollo I2C utilizza questi driver rispetto ai driver a tre stati?Se si dispone di più driver di uscita a tre stati collegati allo stesso bus, a condizione che i segnali di abilitazione per i tre stati si escludano a vicenda, non dovremmo essere in grado di occuparci della contesa del bus e anche di ottenere tempi di salita più rapidi in confrontoa topologie a collettore aperto / scarico aperto?

Allungamento dell'orologio per un motivo.E come vi assicurate che le abilitazioni a tre stati si escludano a vicenda tra più dispositivi diversi?
Si noti inoltre che il problema con i tempi di salita può essere in qualche modo risolto utilizzando sorgenti di corrente invece di semplici resistenze di pull-up.
Sei risposte:
The Photon
2017-02-15 23:35:58 UTC
view on stackexchange narkive permalink

... fintanto che i segnali di abilitazione per i tre stati si escludono a vicenda ...

Il trucco è come farlo senza aggiungere un altro cavo o più cavi per indicare a ciascuna periferica quando è consentito guidare il bus.

Il vantaggio principale di I2C è che utilizza solo due fili e due pin su ciascun chip collegato al bus.

Se sei disposto a scambiare i pin per la velocità, considera l'utilizzo di SPI, che generalmente può raggiungere una velocità superiore a I2C, ma richiede 3 o 4 pin per dispositivo.

+ anche la negoziazione multi-master è abbastanza trasparente sui bus cablati-OR (a @athedcha: che ha tirato su open collector è uno di).
@Asmyldof, è vero, ma quale% di applicazioni I2C pensi che utilizzi effettivamente il multi-master?
Troppo pochi.Il multi-master è fantastico.Ma è una parte decente delle specifiche, quindi come motivo del "perché non diverso" è abbastanza rilevante.
@Asmyldof: Multi-master ha alcune funzioni interessanti, ma non ha un modo pulito di gestire determinati scenari.Ad esempio, se due master inviano simultaneamente una richiesta di "contatore di incremento" a uno slave, ognuno può pensare che la sua richiesta sia riuscita ma il contatore verrà avanzato solo di uno anziché di due.
@supercat in cui questo "contatore di incremento" è una qualche forma di un comando che qualcuno ha implementato su di esso.I comandi e le transazioni possono essere progettati abbastanza facilmente in modo tale che queste occorrenze non danneggino il livello del protocollo di comando di nessuno dei due master.
@Asmyldof: Molti dispositivi hanno comandi che non sono idempotenti;"contatore di incremento" è solo il più semplice da descrivere (due parole).A meno che la struttura di comando di un dispositivo non sia progettata dal basso verso l'alto per l'uso multi-master, è probabile che ci siano problemi.Inoltre, anche singolo master-due-slave senza allungamento del clock può entrare in uno stato irrecuperabile se uno slave non vede un impulso di clock;Penso che il multi-master aggiunga stati ancora più problematici.
Adam Haun
2017-02-16 00:01:21 UTC
view on stackexchange narkive permalink

Ci sono due caratteristiche specifiche che richiedono linee di scarico aperte.Il primo è il clock-stretching, in cui uno slave può mantenere basso il clock (SCL) per ritardare la transazione mentre elabora i dati.Il secondo è l'arbitrato multi-master, in cui due o più master cercano di trasmettere contemporaneamente.L'arbitrato viene eseguito facendo in modo che un master interrompa la trasmissione quando vede la linea dati mantenuta bassa da un altro master.

L'arbitrato è quello più importante, credo.Probabilmente potresti sostituire il clock-stretching con qualcosa basato sul protocollo, ma se vuoi più master sullo stesso bus, devi evitare in qualche modo la contesa.A meno che tu non possa aggiungere un altro filo, sei bloccato con lo scarico aperto.(Vedi anche: il livello fisico CAN, che utilizza uno schema di arbitraggio simile.)

pipe
2017-02-15 23:36:11 UTC
view on stackexchange narkive permalink

fintanto che i segnali di abilitazione per i tre stati si escludono a vicenda

Non c'è modo di accertarsene in I2C.Avresti bisogno di un segnale di abilitazione per dispositivo: ora hai inventato un cugino di SPI.

Non inventato, implementato.Esiste già ed è ampiamente utilizzato in modo diverso da tutti coloro che lo implementano.
supercat
2017-02-16 03:01:57 UTC
view on stackexchange narkive permalink

I protocolli che coinvolgono più dispositivi che comunicano su un bus comune utilizzando driver a tre stati generalmente richiedono l'aggiunta di un cavo di controllo esterno per prevenire conflitti di bus o driver di limitazione di corrente per evitare danni in caso di conflitto di bus. Mentre il livello di corrente di guasto che si può tollerare in caso di conflitto sul bus può essere superiore al livello di corrente che si potrebbe tollerare ogni volta che una linea è bassa, i driver bidirezionali a corrente limitata sono più complicati dei driver a collettore aperto combinati con pull-up passivi .

Se si è disposti ad accettare la spesa aggiuntiva dei driver con limitazione di corrente, ciò consentirà la progettazione di protocolli più veloci e più robusti di I2C. D'altra parte, l'aggiunta di driver active-high a un master I2C può consentire di ottenere vantaggi simili anche con I2C. Il raggiungimento di tali vantaggi in modo sicuro può richiedere l'aggiunta di resistori in serie sulla linea SDA tra il master e gli slave, ma se si utilizza un resistore separato tra il master e ogni slave, la capacità del master di guidare in alto la linea SDA come si vede da qualsiasi slave che non lo sta guidando attivamente verso il basso può consentire al master di riprendersi da scenari che altrimenti potrebbero causare il blocco permanente del bus (nessun singolo dispositivo può mantenere basso SCL continuamente per più di 9 cicli di SCL, quindi un master sarebbe in grado di generare una condizione di arresto per qualsiasi dispositivo entro 9 cicli, ma se due dispositivi potessero tenere premuta la linea SCL vista l'uno dall'altro, potrebbero entrare in uno stato in cui, a turno, abbassano SCL in modo che non vengono mai rilasciati, lasciando il master incapace di generare una condizione di stop.

Milliways
2017-02-16 12:30:43 UTC
view on stackexchange narkive permalink

La risposta REALE a questa domanda, come con la maggior parte delle domande simili, è perché questo è il modo in cui è stata progettata.L'estensione del clock e l'arbitrato del bus sono certamente validi, ma la soluzione è adeguata al suo scopo di progettazione, che è la comunicazione a bassa velocità a breve distanza (spesso a bordo).

Esistono molti protocolli più recenti e più veloci, che compromettono una certa complessità con velocità e distanza.Se ne hai bisogno usa uno di questi protocolli.

Sebbene I²C sia un protocollo relativamente moderno (~ 1982), prima di Tri-State o TTL (~ 1963) i primi IC usavano RTL e open-collector era il bus standard per i primi computer.(E potrei aggiungere una vera sfida ai designer.)

dannyf
2017-02-15 23:20:02 UTC
view on stackexchange narkive permalink

Open drain è una forma di driver di stato provato.È necessario qui per evitare conflitti logici, ad esempio lo schiavo che si tiene sul bus.

Lo scarico aperto ha due stati.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...