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 del resistor pull-up es el diseño elegido?
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 del resistor pull-up es el diseño elegido?
Respuestas:
Para ampliar un poco la respuesta de Jon:
Sí, todo tiene que ver con los MOSFET que desea usar.
Los MOSFET de canal N son mucho mejores para cambiar la lógica que el canal P porque:
Por lo tanto, para una configuración de drenaje abierto (que es lo que es I2C), es mucho más barato y más fácil crearla utilizando una disposición "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" utilizando MOSFET de canal N, pero para eso necesita un controlador de puerta de alto voltaje para elevar el voltaje de la puerta lo suficientemente por encima del voltaje de fuente para que el MOSFET se encienda. No es práctico para los autobuses de comunicaciones pequeños, pero esta disposición se usa realmente con bastante frecuencia en los puentes H para la conducción de motores en los que desea tener la misma respuesta (o similar) entre el lado alto y el lado bajo del puente H. El uso de pares de canales P y N en un puente H generalmente significa que debe 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 "alto inactivo" con MOSFET de canal N y resistencias pull-up es, con mucho, el más rentable.
Otra ventaja del pull-up pasivo / pull-down activo es que puede funcionar con un rango de voltajes de potencia. Tenga en cuenta que los niveles digital alto y bajo se especifican explícitamente con IIC. Esos niveles son lo suficientemente bajos como para funcionar con pullups de 3.3 V. Por lo tanto, se pueden construir dispositivos que funcionen con 5 V y 3,3 V de potencia. De hecho, las líneas de bus IIC pueden conectarse a 3.3 V, y esto funcionará con una combinación de dispositivos en el bus que se alimentan por separado a diferentes voltajes.
Si bien NMOS tiene una ventaja sobre PMOS en términos de velocidad / área, esta diferencia es realmente mínima cuando se habla 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ótems que requieren NMOS y 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 poste
Pero hay un beneficio de las salidas de drenaje abierto de NMOS sobre el drenaje abierto de PMOS que no se aplica directamente a I2C: cuando VCC es positivo, el drenaje abierto de NMOS permite que se conecten chips con diferentes niveles de VCC. Esta es (parte de) por qué están disponibles numerosos circuitos integrados de lógica discreta de drenaje abierto NMOS.
Por otro lado, no conozco NINGÚN chip PMOS de drenaje abierto disponible en el mercado. De hecho, no creo haber encontrado una salida PMOS de drenaje abierto en ningún chip. (He usado ECL muchas veces, que tiene una salida de emisor abierto NPN con un comportamiento similar al drenaje abierto de PMOS)
La disponibilidad de los 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 NMOS de drenaje abierto.
Supongo que la respuesta se remonta a por qué usamos una convención de tierra negativa en primer lugar (y esto ciertamente no era ubicuo 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 utilizados en ellos.
En los primeros días de los circuitos integrados, esto era una limitación bastante seria y, por lo tanto, existía una preferencia por 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-down.
Por supuesto, el bus I2C apenas tiene alta velocidad, por lo que no hay razón para que no se pueda implementar con resistencias desplegables, pero tampoco tiene ninguna ventaja. Así que seguimos con la convención y usa pull-ups.
Aquí hay algunas especulaciones (históricamente fundamentadas) ...
Cuando tiene pullup (en lugar de push-pull), obviamente puede tener múltiples dispositivos en disputa para 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 se refiere a tierra, lo que hace que los niveles de disparo sean fáciles de definir independientemente del voltaje del bus. Además, NPN fue más rápido que PNP.
Si tengo varios dispositivos trabajando 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 tendría restricciones y algo podría freír. Al menos todos están de acuerdo en el valor del terreno, por lo que este problema no surge.
Con CMOS, la historia cambia: ahora el nivel de activación es medio del carril. Pero los EE pueden ser un grupo tradicional. Ciertamente, viniendo de los primeros días de transistores, ni siquiera cuestioné la elección de 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, a medida que pasó el tiempo, los transistores y los circuitos integrados mejoraron, haciendo que ambos estados consuman aproximadamente la misma cantidad de energía, pero no había una razón real para cambiar los estándares.
Ahora, ve muchas cosas como esta, donde inactivo es de 5 V, solo porque los estándares nunca cambiaron.
Han pasado muchos años desde que leí la especificación I2C, pero recuerdo 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.
Yo 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 del variador de salida está apagado, el pin está en un estado de alta impedancia).
Este esquema proporciona 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 ese elemento bastante bien.
Fuente: LabWorX 1, Mastering the I2C Bus, por Vincent Himpe. Un libro realmente bueno sobre I2C, su historia, cómo implementarlo en hardware y cómo usarlo en implementaciones de software y depuración.
La verdadera respuesta que nadie ha tocado adecuadamente todavía es que le permite conectar dispositivos que funcionan con diferentes voltajes (siempre que los pines de E / S sean tolerantes). Por ejemplo, un dispositivo de 3.3V puede comunicarse con un dispositivo que está apagado 1.8V siempre que el IO del dispositivo de 1.8V sea tolerante a voltajes de hasta 3.3. Por supuesto, cada dispositivo puede manejar 0V, pero no todos los dispositivos pueden manejar hasta 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, la corriente de hundimiento (tierra motriz) de los pull-ups es más fácil para la parte que el suministro de corriente (conducir un alto voltaje) en los pull-down.