¿Por qué las líneas I2C usan un controlador de drenaje abierto en lugar de controladores de tres estados?

5

Tengo entendido que las líneas I2C usan resistencias pull-up para elevar pasivamente el bus a nivel lógico alto porque los controladores usados en el bus son controladores activos, es decir, colector abierto / drenaje abierto. Dado que los controladores de colector abierto / drenaje abierto pueden conducir la línea baja pero no alta, se mitiga el problema de la contención del bus.

Sin embargo, mi pregunta es: ¿por qué el protocolo I2C usa estos controladores en lugar de los controladores de tres estados? Si tiene varios controladores de salida triestados conectados al mismo bus, siempre que las señales de habilitación para los triestados sean mutuamente excluyentes, no deberíamos poder ocuparnos de la contención del bus y también lograr tiempos de aumento más rápidos en comparación ¿A topologías de colector abierto / drenaje abierto?

    
pregunta athedcha

6 respuestas

11
  

... siempre que las señales de habilitación para los tri-estados sean mutuamente excluyentes ...

El truco es cómo hacer esto sin agregar otro cable, o varios cables para indicar a cada periférico cuándo está permitido conducir el bus.

La principal ventaja de I2C es que solo usa dos cables y dos pines en cada chip conectado al bus.

Si está dispuesto a cambiar los pines por velocidad, considere usar SPI, que generalmente puede alcanzar una velocidad mayor que I2C, pero necesita 3 o 4 pines por dispositivo.

    
respondido por el The Photon
4

Hay dos características específicas que requieren líneas de drenaje abierto. El primero es el estiramiento del reloj, donde un esclavo puede mantener el reloj bajo (SCL) para retrasar la transacción mientras procesa los datos. El segundo es el arbitraje de múltiples maestros, donde dos o más maestros intentan transmitir al mismo tiempo. El arbitraje se realiza haciendo que un maestro deje de transmitir cuando ve que otro maestro mantiene la línea de datos baja.

El arbitraje es el grande, creo. Probablemente podría reemplazar el alargamiento del reloj con algo basado en el protocolo, pero si quiere varios maestros en el mismo bus, debe evitar la contención de alguna manera. A menos que puedas agregar otro cable, estás atascado con un drenaje abierto. (Ver también: la capa física CAN, que utiliza un esquema de arbitraje similar).

    
respondido por el Adam Haun
2
  

siempre que las señales de habilitación para los tri-estados sean mutuamente excluyentes

No hay forma de asegurarse de esto en I2C. Necesitaría una señal de habilitación por dispositivo; ahora ha inventado un primo para SPI .

    
respondido por el pipe
0

Los protocolos que involucran múltiples dispositivos que se comunican en un bus común utilizando controladores de tres estados generalmente requieren la adición de un cable de control externo para evitar la contención del bus o controladores limitadores de corriente para evitar daños si se produce la contención del bus. Si bien el nivel de corriente de falla que uno puede tolerar en caso de contención en el bus puede ser más alto que el nivel de corriente que podría tolerar cada vez que una línea es baja, los controladores bidireccionales de corriente limitada son más complicados que los controladores de colector abierto combinados con detonaciones pasivas .

Si uno está dispuesto a aceptar el gasto adicional de los controladores limitados en la actualidad, eso permitirá el diseño de protocolos que son más rápidos y más robustos que I2C. Por otro lado, agregar controladores activos-altos a un maestro I2C puede permitir obtener ventajas similares incluso con I2C. Lograr tales ventajas de manera segura puede requerir agregar resistencias en serie en la línea SDA entre el maestro y los esclavos, pero si uno usa un resistor separado entre el maestro y cada esclavo, la capacidad del maestro para elevar la línea SDA como lo ve cualquier esclavo que no esté conduciendo de forma activa puede permitir que el maestro se recupere de situaciones que de otra manera podrían hacer que el bus se bloquee permanentemente (ningún dispositivo puede mantener bajo el nivel de SCL durante más de 9 ciclos de SCL, por lo que un maestro sería capaz de generar una condición de parada para cualquier dispositivo dentro de 9 ciclos, pero si dos dispositivos pudieran mantener presionada la línea SCL vista uno por el otro, podrían entrar en un estado en el que tomaron turnos para bajar el SCL de manera que pudiera nunca se libere, dejando al maestro incapaz de generar una condición de detención.

    
respondido por el supercat
0

La respuesta REAL a esta pregunta, como en la mayoría de las preguntas similares, es porque esta es la forma en que fue diseñada. El estiramiento de reloj, el arbitraje de bus son ciertamente válidos, pero la solución es adecuada para su propósito de diseño, que es una comunicación de baja velocidad a corta distancia (a menudo a bordo).

Hay muchos protocolos más nuevos y rápidos, que intercambian cierta complejidad por velocidad y distancia. Si necesita esto, use uno de estos protocolos.

Si bien I²C es un protocolo relativamente moderno (~ 1982), antes de Tri-State o TTL (~ 1963), los primeros IC utilizaban RTL y el colector abierto era el diseño de bus estándar para las primeras computadoras. (Y podría agregar un verdadero desafío a los diseñadores).

    
respondido por el Milliways
-2

El drenaje abierto es una forma de controlador de estado probado. Aquí se necesita para evitar conflictos lógicos, por ejemplo, el esclavo que se mantiene en el bus.

    
respondido por el dannyf

Lea otras preguntas en las etiquetas