¿Qué sucede si omito las resistencias pullup en las líneas I2C?

33

Justo ahora me di cuenta de que las líneas de reloj y datos I 2 C (SDA y SCL) deben tener resistencias pullup.

Bueno, he construido un par de relojes usando el DS1307 RTC (ver hoja de datos ) de acuerdo con el siguiente esquema. Tenga en cuenta que he omitido ambas resistencias pullup.

Esquema de mi reloj sin resistencias pullup en líneas I2C

Ambos relojes funcionan bien, uno de ellos funciona desde hace más de 3 meses. ¿Cómo es eso posible? En cualquier caso, quería saber:

  1. ¿Qué sucede cuando se omiten los pullups I 2 C?

  2. ¿Es probable que la falta de pullups dañe alguno de esos dos circuitos integrados en mi placa?

Estoy buscando respuestas que aborden mi caso específico de conectar ATmega328P a un RTC DS1307 como en los esquemas que proporcioné, pero si la pregunta no se hace demasiado amplia, sería útil saber qué sucede cuando se omiten los pullups en general , es decir, en otros escenarios de operación I 2 C.

PD. Busqué en la red para encontrar la respuesta, pero solo pude encontrar artículos sobre dimensionar los pullups.

Actualización: estoy usando Arduino IDE 1.03 y mi firmware maneja el RTC usando la lib DS1307RTC Arduino (a través de sus funciones RTC.read()y RTC.write()). Esa biblioteca a su vez usa Wire.hpara hablar con el RTC.

Actualización 2: a continuación hay una serie de tomas de alcance que tomé para ayudar a explicar cómo funciona el I 2 C sin los pullups externos.

Alcance 1 Alcance tiro 2

Actualización 3 (después de agregar pullups I 2 C): a continuación se muestra otra serie de tomas de alcance que tomé después de agregar resistencias pullup adecuadas (4K7) a las líneas I 2 C (en la misma placa). Los tiempos de subida cayeron de aproximadamente 5 µs a 290 ns. Yo 2 C es mucho más feliz ahora.

Alcance tiro 3 Alcance 4

Ricardo
fuente
2
¿Su código deshabilita los pullups en esos pines?
Ignacio Vazquez-Abrams
@ IgnacioVazquez-Abrams No hay mención directa a los pines SDA y SCD (18 y 19) en mi código. Manejo el RTC usando el DS1307RTC lib Arduino lib y sus funciones RTC.read () y RTC.write ().
Ricardo
Esa biblioteca a su vez usa Wire.h para hablar con el RTC.
Ricardo
3
Sí, definitivamente usando pullups internos. Tenga en cuenta las curvas en lugar de bordes afilados.
Ignacio Vazquez-Abrams

Respuestas:

28

1) ¿Qué sucede cuando se omiten los pullups I2C?

No habrá comunicación en el bus I 2 C. En absoluto. La MCU no podrá generar la condición de inicio I 2 C. La MCU no podrá transmitir la dirección I 2 C.

¿Se pregunta por qué funcionó durante 3 meses? Sigue leyendo.

2) ¿Es probable que la falta de pullups dañe alguno de esos dos circuitos integrados en mi placa?

Probablemente no. En este caso particular (MCU, RTC, nada más), definitivamente no.

3) ¿Por qué la MCU pudo comunicarse con el dispositivo esclavo I 2 C en primer lugar? I 2 C requiere resistencias pull-up. Pero no fueron incluidos en el esquema.

Probablemente, tiene pull-ups internos habilitados en ATmega. Por lo que he leído 1 , ATmega tiene pull-ups internos de 20kΩ, que se pueden habilitar o deshabilitar desde el firmware. 20kΩ es demasiado débil para el I 2 pull-up C. Pero si el bus tiene una baja capacitancia (físicamente pequeña) y la comunicación es lo suficientemente lenta, entonces 20kΩ aún pueden hacer que el bus funcione. Sin embargo, este no es un buen diseño confiable, en comparación con el uso de resistencias pull-up discretas.

1 No soy un chico ATmega.

actualización: en respuesta I 2 C formas de onda, que se agregaron al OP
Las formas de onda en el OP tienen una constante de tiempo de subida muy larga. Así es como suelen verse las formas de onda I 2 C

ingrese la descripción de la imagen aquí

PIC18F4550, Vcc = + 5V, pull-ups de 2.2kΩ. La forma de onda muestra SCL. El tiempo de subida en SDA es casi el mismo. El tamaño físico del bus es moderado: 2 dispositivos esclavos, longitud de PCB ≈100mm.

Nick Alexeev
fuente
¡Gracias por tu respuesta! Sí, el ATmega tiene pullups que deben estar habilitados en mi caso. Comprobaré dos veces el código y las bibliotecas que estoy usando y también pondré la placa a través del alcance. Espero que eso aclare un poco las cosas.
Ricardo
1
Es posible que desee verificar primero con la hoja de datos de su dispositivo esclavo primero. Si no recuerdo mal, los pullups en el ATMega pueden ser de 30k-60k (depende de Vcc, temperatura y una serie de otros factores; realmente no se puede depender de ellos para una resistencia confiable). Desea asegurarse de enviar suficiente corriente al esclavo para garantizar una lógica adecuada 1. Si la resistencia es demasiado grande, su dispositivo esclavo no recibirá suficiente corriente y estará en el mismo lugar en el que se encuentra. ahora.
audiFanatic
44
@audiFanatic +1. Por cierto, IMO, incluidas las resistencias pull-up en las placas de conexión e instalarlas por defecto es un error. Imagine lo que sucede si alguien tiene múltiples paneles de conexión en un bus I2C. Cada pull-up suele ser de 2.2kΩ más o menos. Las resistencias pull-up en todas las placas de conexión aparecen en paralelo. El pull-up combinado se vuelve demasiado rígido para I2C. [Más sobre este problema potencial aquí y aquí .]
Nick Alexeev
2
@Ricardo Ese no es un autobús I2C feliz en sus tomas de alcance [primer conjunto de tomas de alcance en el OP]. También agregué un alcance a mi respuesta.
Nick Alexeev
3
Este artículo tiene algunas formas de onda de señales i2c buenas y malas: dsscircuits.com/index.php/articles/…
ford
16

La biblioteca que usa, y las bibliotecas de las que depende (Wire), habilitan los pull-ups internos de ATMega. Estos son pull-ups débiles, y en uso normal, complementan los pull-ups externos (dos resistencias en paralelo). Debido a la resistencia relativamente alta de 20k a 70k, no causan mucho o ningún problema con los externos en uso.

¿Qué sucede cuando se omiten los pullups I2C?

Ahora sin resistencias externas, los pull-ups internos débiles son lo único que eleva la línea. Dependiendo del diseño de su placa, la velocidad de su línea i2c, la frecuencia con la que accede a ella, la interferencia externa, etc., podrían funcionar, podrían no funcionar. Tuviste suerte. Tienes dominadas, pero no las que esperabas.

¿Es probable que la falta de pullups dañe alguno de esos dos circuitos integrados en mi placa?

Incluso sin los pull-ups internos, la falta de pull-ups no dañará ninguno de los circuitos integrados. La construcción interna del dispositivo i2c SCl y las líneas SDA son como transistores NPN. Son colectores abiertos , esencialmente diodos controlados / conmutados por corriente.

Sin embargo, lo último que se debe tener en cuenta es que tener los pull-ups internos activados, cuando su ATMega está a 5v, y el dispositivo i2c es un dispositivo de solo 3.3v, puede causar problemas. O si tiene activados los pull-ups internos y las resistencias externas conectadas a un voltaje de 3.3v u otro, también pueden causar problemas. Esencialmente, es un error intencionalmente ignorado en la biblioteca Wire.

Transeúnte
fuente
44
+1 - You do have pull-ups, just not ones you expected.- Supongo que lo lograste. ¡Gracias!
Ricardo
Para que lo sepas, he agregado algunas tomas de alcance para ayudar a aclarar lo que está sucediendo con mi configuración.
Ricardo
2
@ Ricardo sí, al verlos, a 33khz. Un tercio de la velocidad especificada i2c más baja, y la señal sigue siendo muy mala. A 100khz o 400khz, no tendrías una comunicación funcional. Sin embargo, lo mejor es que muchos dispositivos i2c funcionan a una fracción de las velocidades máximas. Solo recuerde, los pullups internos pueden ser de hasta 70k ohmios, una resistencia típica de i2c es 4.7k
Passerby
8

Generalmente necesitará tener las resistencias pullup para un circuito de interfaz I 2 C. Si la interfaz es realmente una especificación completa I 2 C en ambos extremos de los cables, entonces las líneas de señal sin las resistencias nunca podrán pasar al nivel alto. Pueden permanecer bajos o alcanzar un nivel intermedio determinado por la corriente de fuga en las partes en cada extremo. La razón de esto es porque el verdadero I 2 C es un bus de drenaje abierto.

Algunos dispositivos pueden tener resistencias pullup en chip en el rango de 20K a 100K ohmios solo para mantener los pines de la interfaz a un alto nivel inactivo cuando I 2 interfaz C de la pieza no está en uso. Para interfaces simples y cortas, estas resistencias pullup pueden ser suficientes para proporcionar la corriente necesaria para elevar las líneas mientras se señalan los relojes y / o datos.

Es difícil saber por su esquema, pero en algunos casos las interfaces I 2 C se implementan utilizando pines de puerto de E / S de propósito general y luego se golpean en el software. A veces, el implementador puede no operar los pines de E / S en esta configuración utilizando una metodología de drenaje abierto y esto puede influir en por qué una interfaz sin resistencias pullup puede parecer funcionar.

Al final del día, probablemente te debas a ti mismo verificar la señalización en uno de tus relojes anteriores usando un osciloscopio para ver si los 1 y 0 en la interfaz funcionan dentro de los niveles de voltaje especificados. Entonces sabrás con certeza si fuiste increíblemente afortunado con esa implementación o si uno de los factores que mencioné anteriormente está en juego.

Michael Karas
fuente
4

¿Qué sucede cuando se omiten los pullups I2C?

Lo más probable es que el bus I2C simplemente no funcione.

¿Es probable que la falta de pullups dañe alguno de esos dos circuitos integrados en mi placa?

Probablemente no.

El fotón
fuente
3

Sus líneas I2C no funcionarán en absoluto. Si no me equivoco, I2C solo afirma señales bajas, pero no las devuelve a un estado alto, por lo que necesita esas resistencias.

Cualquier falta de pull-ups no debería dañar ningún IC.

Funkyguy
fuente
Los pines I2C tienen drenaje abierto.
Matt Young
1

I2C es un protocolo de lógica TTL; entonces sus datos y líneas de reloj son de drenaje abierto En otras palabras, el hardware I2C solo puede reducir estas líneas; se dejan flotando cuando no es un cero. Ahí es donde entran las resistencias pull-up. Este es un diagrama simplificado, pero trabaja conmigo por un segundo.

esquemático

simular este circuito : esquema creado con CircuitLab


Como puedes ver; la resistencia pull-up es necesaria para garantizar que se vea un 1 lógico en la salida cuando la lógica TTL no está impulsando la salida hacia abajo. La lógica TTL no puede conducir las líneas altas como ya mencioné. Si esto no estuviera presente, la salida se dejaría flotando y es impredecible lo que puede ver en la salida (por lo que sabe, su microondas o las disfunciones intestinales de sus compañeros de trabajo causadas por cierto oso gomoso sin azúcar podrían causar el valor a fluctuar).

Ahora, si tuviera que implementar I2C en software con un microcontrolador, esto probablemente no sería un gran problema, ya que lo más probable es que esté utilizando la lógica CMOS, que puede impulsar salidas altas o bajas.

audiFanatic
fuente
1
Me alegra que haya ayudado.
audiFanatic
2
Si los dispositivos usan la lógica TTL o CMOS no importa: las salidas normales TTL y CMOS normales atraerán la señal hacia arriba y hacia abajo. Las señales I2C son TTL de colector abierto o (más probablemente) CMOS de drenaje abierto: en ambos casos, el transistor que elevaría la señal falta en la etapa de salida de la fuente, por lo que se requieren resistencias pull-up para jala las señales alto. Es posible que el microcontrolador tenga pull-ups internos en esa pinta.
Peter Bennett
3
-1 Como dijo Peter Bennett, mucha de esta respuesta es incorrecta. Llamar a las señales TTL "open-drain" es el regalo.
Joe Hass
Tenga en cuenta que hacer I2C con TTL tiene ventajas, a saber, que a menudo no necesita traductores de nivel para manejar componentes con diferentes voltajes de alimentación conectados al mismo bus. Simplemente establecer el voltaje de pullup en el voltaje de entrada de mayor aceptación del chip de voltaje más bajo es muchas veces suficiente con las etapas de entrada TTL . En CMOS, eso no funcionaría.
Ben Voigt
@BenVoigt: No, llamar a la configuración "requiere una resistencia pull-up" "TTL" es incorrecto, ya que esta disposición se puede hacer con CMOS o TTL, y el DS1307 es una parte CMOS. La hoja de datos de Maxim establece claramente que las salidas son de drenaje abierto, y el diagrama de bloques muestra un FET para una salida.
Peter Bennett
0

Cuando golpeé el I2C con un micro como maestro que suministra el reloj, pude conducir el SCL sin pullup.

Sin embargo, SDA necesita ser OC con pullup para que el dispositivo esclavo pueda desplegarse y responder correctamente.

Saludos

Wayne
fuente