¿Por qué I²C solo tiene resistencias pull-up (pregunta de la entrevista)?

El entrevistador quería saber por qué se usan resistencias pull-up en SDA y SCL cuando también se puede implementar la lógica opuesta. ¿Hay alguna explicación de por qué el uso de la resistencia pull-up es el diseño elegido?

Solo como comentario El protocolo de bus I2C de modo ultrarrápido funciona como una configuración push-pull, consulte nxp.com/documents/user_manual/UM10204.pdf , sección 3.2 Protocolo de bus I2C de modo ultrarrápido
Me pregunto por qué NXP no especificó un protocolo I2C ultrarrápido que usaba SDA bidireccional y SCK unidireccional, tenía el disco maestro SDA duro cuando quería generar un alto y el maestro esperaba el tiempo suficiente para que la línea subiera. en los casos en que le importaría lo que un esclavo tenía que decir?
¿El entrevistador dio su versión de una respuesta?

Respuestas (9)

Para ampliar un poco la respuesta de Jon:

Sí, todo tiene que ver con qué MOSFET desea usar.

Los MOSFET de canal N son mucho mejores para la lógica de conmutación que los de canal P porque:

  • Por lo general, tienen una resistencia mucho más baja ( R D S O norte )
  • Se encienden y apagan más rápido

Entonces, para una configuración de drenaje abierto (que es lo que es I2C), es mucho más barato y más fácil crearla usando un arreglo "inactivo alto" con MOSFET de canal N en lugar de "inactivo bajo" con MOSFET de canal P.

Una tercera opción sería "inactivo bajo" usando MOSFET de canal N, pero para eso necesita un controlador de compuerta de alto voltaje para elevar el voltaje de la compuerta lo suficientemente por encima del voltaje de la fuente para que el MOSFET se encienda. No es práctico para los autobuses de comunicaciones pequeños, pero esta disposición se usa con bastante frecuencia en los puentes H para la conducción de motores en los que desea tener la misma (o similar) respuesta entre el lado alto y el lado bajo del puente H. El uso de pares de canal P y canal N en un puente H generalmente significa que tiene que incorporar una zona muerta entre apagar el canal P y encender el canal N, ya que lleva mucho más tiempo y eso reduce su eficiencia energética. .

Pero para los buses de comunicaciones pequeños como I2C, donde necesita alta velocidad, bajo costo y simplicidad de uso, el "inactivo alto" con MOSFET de canal N y resistencias pull-up es, con mucho, el más rentable.

No estoy de acuerdo con que la "alta velocidad" sea una consideración en I2C (al menos en su diseño inicial). Los pull-ups resistivos no son la forma de lograr una alta velocidad si ese es el objetivo.
No confunda la conmutación de mayor velocidad con un mayor ancho de banda. La conmutación de alta velocidad le brinda bordes mucho más nítidos, lo que significa una comunicación más confiable.
Los pull-ups resistivos tampoco son la forma de lograr una mayor velocidad de conmutación.
Por eso es importante seleccionar los valores de resistencia correctos para I2C y por qué Arduino es malo para usar los pullups internos de forma predeterminada.
Sí, puede elegir sus resistencias para obtener mejores tiempos de subida. Pero todo el sistema sigue siendo más lento y/o usa más energía de lo que sería con los controladores de tótem (lo que, por supuesto, agregaría otros costos).

Otra ventaja del pull up pasivo / pull down activo es que puede funcionar con un rango de voltajes de alimentación. Tenga en cuenta que los niveles digital alto y bajo se especifican explícitamente con IIC. Esos niveles son lo suficientemente bajos para trabajar con pullups de 3,3 V. Por lo tanto, se pueden construir dispositivos que funcionen tanto con alimentación de 5 V como de 3,3 V. De hecho, las líneas de bus IIC se pueden llevar hasta 3,3 V, y esto funcionará con una combinación de dispositivos en el bus que se alimentan por separado a diferentes voltajes.

Estoy casi al 100%, esta es la respuesta que estaban buscando, tengo un amigo al que le preguntaron eso en una entrevista para una gran empresa de fabricación de CPU (adivina cuál) y esa era la respuesta que estaban buscando.

Si bien NMOS tiene una ventaja sobre PMOS en términos de velocidad/área, esta diferencia es realmente mínima cuando se trata de un controlador en uno o dos pines. Y después de todo, la mayoría de los controladores de salida son en realidad tipos de tótem que requieren tanto NMOS como PMOS, por lo que si hubieran elegido una configuración desplegable o desplegable, habrían terminado con un controlador de salida más pequeño que un tótem. conductor de postes.

Pero hay un beneficio de las salidas de drenaje abierto NMOS sobre el drenaje abierto PMOS que no se aplica directamente a I2C: cuando VCC es positivo, el drenaje abierto NMOS permite que los chips con diferentes niveles de VCC se conecten entre sí. Esta es (parte de) la razón por la cual hay disponibles numerosos circuitos integrados lógicos discretos de drenaje abierto NMOS.

Por otro lado, no conozco NINGÚN chip de drenaje abierto PMOS disponible en el mercado. De hecho, no creo haber encontrado nunca una salida de drenaje abierto PMOS en ningún chip. (He usado ECL muchas veces, que tiene una salida de emisor abierto NPN con un comportamiento similar al drenaje abierto PMOS)

La disponibilidad de chips lógicos discretos de drenaje abierto NMOS hace que el drenaje abierto NMOS sea mucho más familiar para los diseñadores electrónicos que el drenaje abierto PMOS.

Tanto la familiaridad como la disponibilidad de los chips discretos (para la creación de prototipos, por ejemplo), probablemente influyeron en los diseñadores de I2C para elegir la configuración de drenaje abierto NMOS.

Supongo que la respuesta se remonta a por qué usamos una convención de tierra negativa en primer lugar (y esto ciertamente no era omnipresente antes de la era de los semiconductores). La razón de esto es que los dispositivos de canal N tienen un mejor rendimiento que los dispositivos de canal P debido a la física de los tipos de portadores mayoritarios que se utilizan en ellos.

En los primeros días de los circuitos integrados, esta era una limitación bastante seria, por lo que se prefería usar transistores de canal N (o NPN) para lograr el mayor rendimiento posible. De esto obtuvimos un sistema de tierra negativo y salidas de colector abierto que requerían el uso de resistencias pull-up en lugar de pull-downs.

Por supuesto, el bus I2C apenas es de alta velocidad, por lo que no hay razón para que no pueda implementarse utilizando resistencias desplegables, pero tampoco es una ventaja. Así que nos apegamos a la convención y utiliza pull-ups.

Aquí hay algunas especulaciones (basadas históricamente)...

Cuando tiene pullup (en lugar de push-pull), obviamente puede tener varios dispositivos en disputa por el bus sin que fluyan corrientes excesivas (algo bueno, pero podría lograr lo mismo con un pulldown).

En los "viejos tiempos" de los transistores bipolares, la lógica TTL más simple usaba colectores abiertos con transistores NPN: todo está referenciado a tierra, lo que hace que los niveles de activación sean fáciles de definir independientemente del voltaje del bus. Además, NPN fue más rápido que PNP.

Si tengo varios dispositivos que funcionan con su propio voltaje de suministro, y ese voltaje de suministro no es constante, entonces es imperativo tener un pull-up en lugar de un pull-down . Si varios dispositivos intentaran llevar el bus a sus respectivos rieles de suministro, el flujo de corriente no estaría restringido y algo podría freírse. Al menos todos están de acuerdo en el valor del terreno, por lo que no surge este tema.

Con CMOS, la historia cambia: ahora el nivel de disparo es medio. Pero los EE pueden ser un grupo tradicional. Ciertamente, viniendo de los primeros días del transistor, nunca cuestioné la elección de los pull-ups, por las razones anteriores.

Como dije, esto es solo especulación.

Esto puede ser algo histórico.

Los transistores antiguos y los circuitos integrados en realidad consumían menos energía cuando estaban a 5 V que a 0 V. Dado que había una diferencia significativa entre los dos niveles, los diseñadores optaron por hacer que el estado "inactivo" fuera el de 5 V. Luego, con el paso del tiempo, los transistores y los circuitos integrados mejoraron, lo que hizo que ambos estados consumieran aproximadamente la misma cantidad de energía, pero no había ninguna razón real para cambiar los estándares.

Ahora, ves muchas cosas como esta, donde la inactividad es de 5 V, solo porque los estándares nunca cambiaron.

Todavía es cierto que la mayoría de los circuitos integrados pueden absorber más energía de la que pueden generar, por lo que aún es aplicable.

Han pasado muchos años desde que leí la especificación I2C, pero recuerdo que cuando se usó por primera vez, la gente a menudo lo llamaba el bus de colector abierto de 2 cables. Hizo que las conexiones y la detección de colisiones fueran súper fáciles incluso para golpes de bits. Incluso hace 20 años no se consideraba un autobús de alto rendimiento, solo barato y fácil.

Diría que es porque I2C se define como un bus donde todas las unidades conectadas deben ser de drenaje abierto o de colector abierto. Esto significa que solo puede conducir el bus bajo, no alto. (Cuando el transistor de control de salida está apagado, el pin está en un estado de alta impedancia).

Este esquema brinda algunos beneficios agradables, por ejemplo, que puede conectar dispositivos con diferentes voltajes de señalización y que el bus se recupera automáticamente de los errores de comunicación.

Obviamente, el estándar podría haberse definido al revés, como una configuración inactiva-baja/activa-alta, y las otras respuestas aquí tocan bastante bien ese elemento.

Fuente: LabWorX 1, Mastering the I2C Bus, por Vincent Himpe. Un muy buen libro sobre I2C, sus antecedentes históricos, cómo implementarlo en hardware y cómo usarlo en implementaciones de software y depuración.

La respuesta real que nadie ha abordado adecuadamente todavía es que le permite conectar dispositivos alimentados por diferentes voltajes (siempre que los pines de E/S sean tolerantes). Por ejemplo, un dispositivo de 3,3 V puede comunicarse con un dispositivo que está apagado con 1,8 V siempre que la E/S del dispositivo de 1,8 V sea tolerante a voltajes de hasta 3,3. Por supuesto, todos los dispositivos pueden manejar 0 V, pero no todos los dispositivos pueden alcanzar el voltaje en sus resistencias pull-up.

Además, la mayoría de los circuitos integrados pueden absorber más corriente de la que pueden generar. Esto se debe a la disipación de calor. Por lo tanto, hundir la corriente (tierra de conducción) de los pull-ups es más fácil para la pieza que generar corriente (impulsar un alto voltaje) en los pull-downs.