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

39voto

Nick Alexeev Puntos 20994

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

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

¿Te preguntas por qué ha funcionado durante 3 meses? Sigue leyendo.

2) ¿Es probable que la falta de pullups dañe alguno de esos dos CI 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 I 2 C en primer lugar? I 2 C requiere resistencias de pull-up. Pero no estaban incluidas en el esquema.

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

1 Yo no soy un tipo de ATmega.

actualizar: En respuesta, yo 2 C, que se añadieron a la O.P.
Las formas de onda en el P.O. tienen una constante de tiempo de subida muy larga. Esto es lo que 2 Las formas de onda C suelen tener el siguiente aspecto

enter image description here

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

22voto

Passerby Puntos 28913

La librería que utiliza, y las librerías de las que depende (Wire), habilitan los pull-ups internos del ATMega. Se trata de pull-ups débiles y, en un uso normal, complementan cualquier pull-up externo (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 de I2C?

Ahora, sin resistencias externas, los débiles pull-ups internos son lo único que impulsa la línea en alto. Dependiendo de la disposición de tu placa, la velocidad de tu línea i2c, la frecuencia con la que accedes a ella, las interferencias externas, etc, puede que funcionen o puede que no. Tuviste suerte. Tienes pull-ups, sólo que no los que esperabas.

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

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

La última cosa a tener en cuenta, sin embargo, tener los pull-ups internos, cuando su ATMega está en 5v, y el dispositivo i2c es un dispositivo de 3,3v solamente, puede causar problemas. O si tienes los pull-ups internos activados, y las resistencias externas conectadas a 3,3v u otro voltaje, también puede causar problemas. Esencialmente, es un bug intencionalmente ignorado en la librería Wire.

9voto

Bernd Puntos 61

Por lo general, es necesario tener las resistencias de pullup para una 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 ir al nivel alto. Pueden permanecer bajas 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 la verdadera 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 sólo para mantener los pines de la interfaz en un nivel alto inactivo cuando la I 2 La interfaz C de la pieza no está en uso. En el caso de interfaces sencillas y cortas, estas resistencias de pullup pueden ser suficientes para proporcionar la corriente necesaria para poner las líneas en alto mientras se señalan los relojes y/o los datos.

Es difícil de decir a partir de su esquema, pero en algunos casos yo 2 Las interfaces de C se implementan utilizando pines de puerto de E/S de propósito general y luego se golpean con bits 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 jugar un factor en el que una interfaz sin resistencias de pullup puede parecer que funciona.

Al final del día probablemente te debes a ti mismo comprobar la señalización en uno de tus primeros relojes usando un osciloscopio para ver si los 1's y 0's de la interfaz están trabajando dentro de los niveles de voltaje especificados. Entonces sabrás con seguridad si has tenido una suerte increíble con esa implementación o si uno de los factores que he mencionado anteriormente está en juego.

5voto

RWH Puntos 21

¿Qué ocurre cuando se omiten los pullups de 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 CI en mi placa?

Lo más probable es que no.

4voto

Mohammad Imran Puntos 29

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

La falta de tirones no debería dañar ningún CI.

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