41 votos

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

Ahora mismo me he dado cuenta de que el I 2 Las líneas de datos y de reloj C (SDA y SCL) deben tener resistencias pullup.

Bueno, he construido un par de relojes utilizando el DS1307 RTC (ver hoja de datos ) según el esquema siguiente. Observa que he omitido las dos resistencias pullup.

Schematic of my clock without pullup resistors on I2C lines

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

  1. ¿Qué sucede cuando el I 2 ¿Se omiten los tirones de C?

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

Busco respuestas que aborden mi caso específico de conectar el 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 I 2 Operación C.

PS. He buscado en la red para encontrar la respuesta, pero sólo he podido encontrar artículos sobre el dimensionamiento de los pullups.

Actualización: Estoy usando Arduino IDE 1.03 y mi firmware maneja el RTC usando el DS1307RTC Arduino lib (a través de sus funciones RTC.read() y RTC.write() ). Esta librería utiliza a su vez Wire.h para hablar con el RTC.

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

Scope shot 1 Scope shot 2

Actualización 3 (después de que 2 C añadidos): Abajo hay otra serie de fotos de alcance que tomé después de añadir las resistencias pullup adecuadas (4K7) a la I 2 Líneas C (en la misma placa). Los tiempos de subida bajaron de unos 5 µs a 290 ns. I 2 C es mucho más feliz ahora.

Scope shot 3 Scope shot 4

1voto

Johnny Puntos 41

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

schematic

simular este circuito - Esquema creado con CircuitLab

Como puede ver, la resistencia de pull-up es necesaria para asegurar que se vea un 1 lógico en la salida cuando la lógica TTL no está conduciendo la salida hacia abajo. La lógica TTL no puede conducir las líneas hacia arriba como ya he mencionado. Si esto no estuviera presente, la salida quedaría flotando y es impredecible lo que puedes ver en la salida (por lo que sabes, tu microondas o las disfunciones intestinales de tus compañeros de trabajo causadas por un cierto oso de gominola sin azúcar puede hacer que el valor fluctúe).

Ahora bien, si se implementa I2C por software con un microcontrolador, esto probablemente no sería un gran problema, ya que lo más probable es que se utilice la lógica CMOS, que puede conducir las salidas tanto en alto como en bajo.

0voto

Justin Puntos 149

Cuando he hecho bit bang I2C con un micro como maestro que suministra el reloj entonces he podido manejar el SCL sin pullup.

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

Saludos

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X