¿Por qué I2C está diseñado para funcionar con resistencias pull-up y no con pull-down?

Entiendo que en las líneas I2C, SCL y SDA se utilizan resistencias pull-up y los controladores de clavijas son dispositivos NPN de colector abierto que pueden conectar clavijas a tierra. Esto le da a I2C la ventaja de que el mismo bus ahora se puede compartir con múltiples esclavos, e incluso si dos o más esclavos accidentalmente intentan conducir el bus al mismo tiempo, no causarán ningún daño al sistema.

Pero esto también se puede hacer usando controladores de drenaje abierto PNP y resistencias desplegables en líneas SDA y SCL. Con esto también se pueden lograr cosas como el estiramiento del reloj y el arbitraje multimaestro.

¿La implementación actual del protocolo I2C brinda algún beneficio sobre la implementación alternativa sugerida anteriormente?

los transistores de colector abierto parecían estar en la mayoría de los circuitos integrados en los años 80.
@PlasmaHH Creo que la razón fue que NPN (por lo que recuerdo vagamente) tiene más capacidad actual por área debido a una mayor movilidad de electrones en el sustrato, por lo que es más fácil construir etapas de salida "fuertes" con eso.
@MarcusMüller De hecho, eso era (y sigue siendo) cierto. NPN y NMOS Fets son "más fuertes" cuando se les da el mismo tamaño. En CMOS, un factor de 2 a 3 es típico. Para PNP vs NPN depende del proceso de fabricación, pero casi siempre los PNP son mucho más difíciles y complejos que los NPN. También comenzar con un sustrato dopado con P (como lo hacen la mayoría de los procesos) enfatiza esto (mejores NPN).
@Bimpelrekkie Recuerdo un factor de 2.3 de mi clase de física de estado sólido hasta la fecha :-)
Si el bus I2C existente se cortocircuita accidentalmente a tierra por cualquier motivo, solo consumirá corriente de resistencia pull-up. Con la disposición complementaria de los controladores activos altos y las resistencias desplegables, dañaría los controladores simples de los años iniciales de I2C. Al pasar de una tarjeta a otra, se debe tener en cuenta el cortocircuito con el chasis. Pero es solo una de las muchas razones para optar por conducir bajo y subir, el resto de las cuales otros han respondido a continuación.
No creo que esto se mencione a continuación; también debe considerar que en los viejos días TTL 7400, los sistemas generalmente se diseñaban con señales de control activo-bajo, porque esto brindaba una mejor inmunidad al ruido (los umbrales de entrada TTL hacían menos probable que un inactivo señal podría volverse involuntariamente activa). por lo que la mentalidad general era 'hazlo activo bajo'.

Respuestas (7)

Eléctricamente tiene sentido porque la conexión a tierra es la única conexión común a todos los dispositivos en un bus IIC. Esa es una restricción mucho menor que obligar a que la alimentación sea la conexión común a todos los dispositivos IIC, como sería necesario si las líneas se elevaran y flotaran a baja a través de pulldowns.

Tenga en cuenta que no todos los dispositivos IIC necesitan ser alimentados desde la misma red o el mismo voltaje. Esto no sería cierto si ambas líneas de bus tuvieran que ser conducidas al voltaje de alimentación común único.

Quien haya votado negativo, ¿qué crees que está mal?
No es mi voto negativo, y debe tener tantos años de experiencia en I2C como yo, por lo que mi punto aquí es probablemente un malentendido, pero: " Los dispositivos IIC no necesitan ser alimentados con [...] el mismo voltaje " podría ser visto como implicando que los dispositivos I2C alimentados con 5V y 3V (por ejemplo) podrían compartir el mismo bus I2C, sin ningún componente o precaución adicional (ya que no mencionó los traductores de nivel). Y, por supuesto, no pueden hacer eso, ya que los umbrales lógicos I2C de cada dispositivo ahora están referenciados a su propio Vcc. ¿Quizás la falta de una mención explícita de los traductores de nivel causó el voto negativo?
Dependiendo de los pull-ups y los pines de E/S utilizados, las comunicaciones de estilo I2C pueden funcionar sin problemas entre dispositivos de 5 V y 3,3 V. El uso de pull-ups de 10K a 5V, por ejemplo, permitiría usar dispositivos de 3.3V si tienen entradas libres tolerantes a 5V o si pueden tolerar 150uA en sus diodos de protección. Y el uso de pullups a 3,3 V funcionará, al menos a velocidades más bajas, para interactuar con dispositivos de 5 V que tienen un umbral alto de entrada de 2,5 V o menos.
@Sam: En realidad, los dispositivos IIC de 5 V y 3,3 V pueden estar en el mismo bus IIC. Los dispositivos con niveles de voltaje fijos, independientemente de su voltaje de suministro, se mencionan y sancionan específicamente en la especificación IIC.
Y tener redes de alimentación diferentes no implica necesariamente que la tensión de alimentación nominal sea diferente, pero seguirá habiendo ligeras variaciones debido a las tolerancias de los componentes. Esas diferencias afectarán el margen de ruido si se utiliza una de las redes de suministro como referencia.
@Olin: eso depende de los dispositivos específicos. Recuerdo que la especificación I2C cambió de umbrales de recepción de nivel fijo, a umbrales de % Vcc hace algunas versiones de la especificación (voy de memoria; lo buscaré, si todavía no estamos de acuerdo con que esto sea un cambio, en algún momento atrás). Si su respuesta se basa en aquellos dispositivos que tienen umbrales de recepción fijos, creo que es importante mencionarlo. Ninguno de los dispositivos I2C (modernos) con los que he trabajado recientemente tiene umbrales lógicos de recepción fijos.
@supercat - " Dependiendo de los pull-ups y los pines de E/S utilizados, las comunicaciones de estilo I2C pueden funcionar sin problemas entre dispositivos de 5 V y 3,3 V". Tenga en cuenta que no dije específicamente dispositivos de 3,3 V: elegí mi ejemplo de 3 V cuidadosamente (como estoy usando en mi banco actualmente). :-) También resolví una pregunta aquí antes, donde la mezcla de 5V y algún dispositivo I2C de menor voltaje, en el mismo bus, con esa corriente en los diodos de protección causó fallas . Confiar en que eso está bien es un riesgo y, en mi humilde opinión, debe mencionarse explícitamente, ya que se ha demostrado que a veces causa problemas.
Nuevamente, resumo que, tal como está escrito, la respuesta parece sugerir algunas configuraciones que pueden no funcionar correctamente. Tanto Olin como Supercat han mencionado ejemplos específicos en los que estarían bien, pero la respuesta no menciona esas restricciones. Acabo de intentar ayudar a responder la pregunta de Olin sobre el voto negativo, sugiriendo una posible área de preocupación. Eso es todo. No me importa si la respuesta permanece "tal como está", ya que conozco las restricciones ya mencionadas; es posible que otros lectores no. Por supuesto, mi conjetura para el voto negativo podría estar equivocada, solo estoy tratando de ayudar :-)
@SamGibson: He visto dispositivos cuyos diodos de protección actuaban como transistores, por lo que es importante estar al tanto de tales posibilidades. Por otro lado, tener menús desplegables de uso de I2C permite que se use para conectar dispositivos con voltajes de suministro variados mucho más fácilmente de lo que sería posible si usara controladores activos de lado alto.
@supercat: todos estuvieron de acuerdo :-) Como resumí anteriormente, solo traté de ayudar señalando que las configuraciones mixtas de Vcc tienen restricciones sobre cuál funcionará y cuál no, que la respuesta (en su estado actual) no no mencionar Esto podría haber preocupado a alguien lo suficiente como para votar negativamente. De memoria, el dispositivo que funcionó mal en una pregunta anterior, de una manera extraña (parecía un bloqueo parcial de algunos pines GPIO) era una MCU PIC (¿PIC16?) Con 3.3V Vcc conectado a un bus I2C levantado a 5V . Después de la E/S del bus I2C, algunos pines GPIO físicamente cerca de los pines I2C en el PIC leerían valores incorrectos.
En el documento anterior "El bus I2C y cómo usarlo" de Philips, la sección 10.0 menciona los umbrales de entrada fijos de los primeros dispositivos I2C de 5 V (normalmente NMOS). Luego dice: " Los dispositivos de bus I2C con niveles de entrada relacionados con VDD deben tener una línea de suministro común a la que también está conectada la resistencia pull-up " (en negrita). @supercat: usted mencionó: " Dispositivos de 5 V que tienen un umbral alto de entrada de 2,5 V o menos " ¿Puede ayudarme dando un ejemplo de dicho dispositivo? Al leer documentos antiguos de I2C, solo puedo encontrar menciones de un mínimo fijo de 3V I2C Vih, para esos dispositivos antiguos de 5V. Gracias.
Esta respuesta me parece muy extraña, especialmente la parte "si las líneas flotaran alto". No entiendo qué significa esto, ya que generalmente flotante significa no conectado, pero en el esquema propuesto, los transistores elevarían las líneas. Además, no veo cómo eso obligaría a VCC a ser la conexión común, es igual de fácil detectar 1/0 contra GND.
@jpa: Me refiero a líneas que flotan alto a través del pullup, en lugar de ser impulsadas activamente alto.
@SamGibson: Es posible que los dispositivos con niveles de entrada relacionados con VDD deban operar con voltajes que se encuentren dentro de un cierto rango entre sí. Lo cerca que deben estar depende de cómo se relacionan los voltajes con VDD. La hoja de datos de Microchip para el PIC16F877 (una parte de 5V seleccionada arbitrariamente) enumera V(IH) para sus pines normales como 0.25VDD+0.8V, aunque para sus entradas Schmitt Trigger sería mucho mayor. A VDD=5,2 V, una entrada normal tendría un V(IH) especificado de 2,1 voltios; No vi una especificación para el hardware I2C V (IH), aunque el gráfico de rendimiento típico sugiere que está entre las entradas normal y ST.
@supercat - Gracias, ahora veo las diferentes interpretaciones. El PIC16F877 no es lo que quise decir con un dispositivo de 5V; en esa parte de la especificación I2C, los dispositivos de 5V con umbrales fijos no eran como el PIC16F877 que, como dijiste, tiene un Vih variable según su VDD . Eran dispositivos con un VDD fijo (que podía ser de 5 V o 12 V, etc. pero era un voltaje fijo para un dispositivo determinado). Nunca vi uno de esos tipos de dispositivos (típicamente NMOS) con un I2C Vih diferente de 3V. Entonces, todo claro ahora: estábamos hablando de diferentes dispositivos a 5V (VDD de 5V fijo frente a VDD variable que podría ser de 5V).
@SamGibson: El V (IH) del PIC depende un poco del VDD, pero nunca es lo suficientemente alto como para causar un problema en un autobús razonablemente lento con pull-ups razonablemente rígidos a 3 voltios.
@OlinLathrop Entonces entiendo aún menos, " si las líneas flotaran alto"... pero así es exactamente como funciona I2C, las líneas suben a través de pullups.
@jpa: Ah, ahora veo lo que quieres decir. Fijado.
Piense si un automóvil que tiene +12 y tierra, con una "línea de señal", cada dispositivo tiene un convertidor de CC a CC de 12V a 5V. I2C fue diseñado por fabricantes de automóviles...

En los viejos tiempos, los controladores TTL eran mucho mejores para bajar una señal que para subirla. Por lo tanto, los protocolos como I2C, pero también las líneas de interrupción, el restablecimiento y otros, se implementaron utilizando un pull-up con pull-down distribuido.

En los mejores días modernos, lo mismo sigue siendo cierto, ya que es una propiedad intrínseca de los semiconductores. Hoy simplemente no cuesta tanto conseguir un transistor pull up más robusto para manejar la misma corriente.
Me dijeron que con CMOS también es mucho más fácil acercarse al voltaje del riel de alimentación. Otro 'problema' en el que TTL estaba luchando. (Tal vez deberíamos considerarnos afortunados por eso, ya que permitió que 3V3 CMOS interactúe con TTL)

Es más fácil usar tierra como una referencia común entre los subsistemas que pueden tener voltajes de suministro variables. Si usa transistores PNP para obtener un voltaje de suministro, todos los subsistemas deberían estar conectados al mismo suministro.

Aquí abundan las buenas respuestas, pero también hay otra razón.

Si el estado de reposo del bus está en tierra, no hay forma de saber si el bus está conectado o simplemente colgando en el espacio.

Es normal que el pull-up esté ubicado en el dispositivo maestro. Los esclavos generalmente no tienen pull-up. Esto se debe a que la corriente desplegable que se requeriría para establecer un nivel bajo aumentaría con la cantidad de dispositivos conectados al bus.

Un esclavo, cuando se conecta al bus, puede detectar que la línea está demasiado alta (suponiendo que no se esté utilizando) y saber que el bus está realmente allí y en silencio. Ese no sería el caso con un bus con polarización a tierra.

Para detectar que el bus está subiendo, un esclavo debe bajarlo en primer lugar. No estoy seguro de por qué un procedimiento similar no sería posible con la polaridad opuesta.
@DmitryGrigoryev, ¿por qué necesitaría tirar de algo que ya es muy bajo?

Si entiendo bien la pregunta un aspecto es:

  • ¿Por qué usa resistencias pull-up y transistores NPN en lugar de resistencias pull-down y transistores PNP?

En primer lugar, debe tener en cuenta que no utiliza transistores bipolares (NPN, PNP) sino MOSFET (que existen en cuatro variantes diferentes).

Los dispositivos que utilizan la variante " pull-up y NPN " utilizan un MOSFET de mejora de canal n . Debido a que la fuente de este MOSFET está conectada a tierra, el voltaje de la puerta a la fuente (que controla el flujo de corriente) es igual al voltaje entre la puerta y la tierra. Entonces, el MOSFET se puede controlar usando un voltaje entre 0 y Vdd.

Existirían tres posibilidades para implementar la variante " pull-down y PNP ":

  • Uso de un MOSFET de mejora de canal p

    En un NMOS o CMOS IC, los MOSFET de canal p con características comparables (resistencia, etc.) requieren más espacio que los MOSFET de canal n.

    En la microelectrónica, el espacio es dinero, por lo que se evitan los MOSFET de canal p si es posible.

  • Uso de un MOSFET de mejora de canal n

    Esto requeriría que la salida del circuito lógico que controla el transistor tenga un voltaje "BAJO" del voltaje de suministro (p. ej., +5 V) y un voltaje "ALTO" por encima del voltaje de suministro (p. ej., +10 V cuando se alimenta el resto del circuito). con +5V).

    La razón: el voltaje fuente-tierra será Vdd cuando el MOSFET esté conduciendo. El voltaje de la fuente de la puerta debe ser positivo, por lo que el voltaje entre la puerta y la tierra debe ser aún mayor.

    Necesitaría dos suministros de voltaje, y un circuito que cambie la salida del circuito lógico de 0...+5V a +5V...+10V...

  • Uso de un MOSFET de empobrecimiento de canal n

    Desafortunadamente, no puedo decirte mucho sobre esta solución. Sin embargo, encontré una página que usa Google que dice que los MOSFET de agotamiento son más difíciles de producir que los MOSFET de mejora y se evitan por este motivo.

    Sé por la electrónica de potencia (no por la microelectrónica) que la variante de "dos fuentes de alimentación" descrita anteriormente incluso se prefiere a los MOSFET de agotamiento. (Pero no puedo decirte por qué.)

    EDITAR Usando MOSFET de agotamiento de canal n, probablemente necesite un voltaje negativo (por ejemplo, -5V), por lo que también necesitará dos voltajes de suministro ...

También hay un beneficio adicional por tener líneas de datos pull-up y de tierra común (en lugar de tener VCC y pull-down comunes):

Incluso si la intención original era conectar dispositivos en la misma PCB en un espacio de unas pocas pulgadas, fue lo suficientemente exitoso, por lo que ahora no es raro tener líneas largas de un par de pies y conectar "dispositivos" que podrían ser computadoras o algo por el estilo. complejidad, con algunos dispositivos que tienen sus propias fuentes de energía (de diferente calidad, digamos que conecta algo alimentado por un enchufe de pared con algo alimentado por batería). Es mejor si la conexión funciona "al menos bien", incluso en condiciones no ideales y fuera de las especificaciones.

Y muchos de estos dispositivos conectados pueden estar conectados de alguna manera también por otros medios, entonces solo comunicación I2C. Por lo general, cuando conecta dispositivos, lo conecta con common ground, a veces como parte de otras funciones, a veces solo porque está montado en una caja de metal y los dispositivos también están conectados a tierra con la caja (o con un enfriador común o algo así) o puede haber Ser cable blindado con blindaje puesto a tierra en el interior - que también conecta las tierras.

Si también conecta directamente las líneas de alimentación (VCC) de dichos dispositivos, tendrá problemas cuando esas líneas tengan un voltaje diferente de forma natural (claro, puede decir 5 V aquí y allá, pero dependiendo de la construcción y las tolerancias de las piezas de las fuentes de alimentación, podría ser también de 4,9 V o 5,2 V o incluso cambiar, si funciona con batería y, a veces, hace funcionar algunos motores, lo que hace que la potencia disminuya y aumente con el tiempo).

En tal caso, existe efectivamente un cortocircuito entre esas fuentes de energía de parte de un voltio y, dependiendo de las fuentes (y la resistencia de las vías), podrían fluir corrientes relativamente altas, lo que resultaría no solo en el desperdicio de energía y el aumento de calor, sino incluso en daños ( o acortando la vida) de algunas de esas fuentes. Lo cual no es bueno.

Tener una conexión a tierra común y pull-ups evita tales problemas: la tierra es tierra y las resistencias pullup solo permiten una corriente cruzada realmente pequeña, incluso si el VCC difiere mucho entre los dispositivos.

Esto es esencialmente lo mismo que la respuesta de Dave Tweed.

No tienes que enviar tanta energía a través del chip, si es pull up.

Debido a que el chip no maneja nada, solo está creando un cortocircuito para llevar el bus a 0 y haciendo una apertura para llevarlo a 1.

Si se desconectara, tendría que enviar energía a través del chip para llevar el bus a 1. Si el bus sufre un cortocircuito accidental, podría ser mucha energía la que pase a través de ese chip para tratar de empujarlo. hasta 1.

Descargo de responsabilidad: soy un EE bastante pésimo en este punto.

Bienvenido a EE.SE. " No es necesario enviar tanta potencia a través del chip, si es pull-up. " Si las resistencias pull-up y pull-down son del mismo tamaño, entonces las corrientes serán las mismas. El pull-up requerirá que la corriente provenga del chip accionado y se hunda en el chip impulsor. El pull-down requerirá que la corriente provenga del chip de conducción y sea absorbida por el chip de conducción. Un corto accidental podría ser a V+ oa tierra.