Recién ahora me di cuenta de que las líneas de reloj y de datos I 2 C (SDA y SCL) deben tener resistencias pullup.
Bueno, construí un par de relojes usando el RTC DS1307 (ver hoja de datos ) de acuerdo con el esquema a continuación. Tenga en cuenta que he omitido ambas resistencias pullup.
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:
¿Qué sucede cuando se omiten los pull-ups I 2 C?
¿Es probable que la falta de pullups dañe alguno de esos dos circuitos integrados en mi placa?
Busco 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 es 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 Internet para encontrar la respuesta, pero solo pude encontrar artículos sobre cómo dimensionar los pullups.
Actualización: estoy usando Arduino IDE 1.03 y mi firmware maneja el RTC usando la biblioteca Arduino DS1307RTC (a través de sus funciones RTC.read()
y RTC.write()
). Esa lib a su vez se usa Wire.h
para hablar con el RTC.
Actualización 2: a continuación se muestra una serie de fotografías de alcance que tomé para ayudar a explicar cómo funciona el I 2 C sin los pullups externos.
Actualización 3 (después de agregar I 2 C pullups): 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 se redujeron de aproximadamente 5 µs a 290 ns. I 2 C es mucho más feliz ahora.
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 estaban incluidos en el esquema.
Probablemente, tenga habilitados los pull-ups internos en el 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 pull-up I 2 C. Pero si el bus tiene una capacitancia baja (físicamente pequeña) y la comunicación es lo suficientemente lenta, entonces 20 kΩ 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 de ATmega.
actualización: En respuesta, las formas de onda I 2 C, que se agregaron al OP
Las formas de onda en el OP tienen una constante de tiempo de subida muy larga. Así es como se ven normalmente las formas de onda I 2 C
PIC18F4550, Vcc=+5 V, 2,2 kΩ pull ups. 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 ≈100 mm.
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 cualquier pull-up externo (dos resistencias en paralelo). Debido a la resistencia relativamente alta de 20k a 70k, no causan muchos o ningún problema con los externos en uso.
¿Qué sucede cuando se omiten los pull-ups I2C?
Ahora, sin resistencias externas, los débiles pull-ups internos son lo único que hace que la línea suba. Dependiendo del diseño de su placa, la velocidad de su línea i2c, la frecuencia con la que accede, la interferencia externa, etc., pueden funcionar o no. 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 de las líneas SCl y SDA del dispositivo i2c es como transistores NPN. Son colectores abiertos , esencialmente diodos controlados/conmutados por corriente.
Sin embargo, lo último que 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 3.3v u otro voltaje, también pueden causar problemas. Esencialmente, es un error ignorado intencionalmente en la biblioteca Wire.
You do have pull-ups, just not ones you expected.
- Supongo que lo lograste. ¡Gracias!Por lo general, necesitará tener las resistencias pullup para un circuito de interfaz I 2 C. Si la interfaz es realmente una especificación I 2 C completa en ambos extremos de los cables, entonces las líneas de señal sin las resistencias nunca podrán llegar al nivel alto. Pueden permanecer bajos o ir a algún nivel intermedio determinado por la corriente de fuga en las partes de cada extremo. La razón de esto es que el verdadero I 2 C es un bus de drenaje abierto.
Algunos dispositivos pueden tener resistencias pullup en el chip en el rango de 20K a 100K ohmios solo para mantener los pines de la interfaz en un nivel inactivo alto cuando la interfaz I 2 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 los datos.
Es difícil saberlo a partir de su esquema, pero en algunos casos, las interfaces I 2 C se implementan utilizando pines de puerto de E / S de uso general y luego se golpean en el software. A veces, es posible que el implementador no opere los pines de E/S en esta configuración usando una metodología de drenaje abierto y esto puede influir en por qué una interfaz sin resistencias pullup parece funcionar.
Al final del día, probablemente se deba verificar la señalización en uno de sus 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 tuviste mucha suerte con esa implementación o si uno de los factores que mencioné anteriormente está en juego.
¿Qué sucede cuando se omiten los pull-ups 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.
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.
I2C es un protocolo lógico TTL; por lo que 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 trabaje conmigo por un segundo.
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á bajando la salida. La lógica TTL no puede impulsar las líneas altas como ya mencioné. Si esto no estuviera presente, la salida quedarí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 osito de goma sin azúcar podrían causar el valor a fluctuar).
Ahora, si tuviera que implementar I2C en el software con un microcontrolador, esto probablemente no sería un gran problema, ya que lo más probable es que use la lógica CMOS, que puede impulsar salidas tanto altas como bajas.
Cuando golpeé I2C con un micro como el maestro que suministra el reloj, pude conducir el SCL sin pullup.
Sin embargo, SDA necesita estar OC con pullup para que el dispositivo esclavo pueda desplegarse y responder correctamente.
Saludos
Ignacio Vázquez-Abrams
ricardo
ricardo
Ignacio Vázquez-Abrams