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

33

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

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

Ambosrelojesfuncionanbien,unodeellosfuncionadesdehacemásde3meses.¿Cómoesesoposible?Encualquiercaso,queríasaber:

  1. ¿QuésucedecuandoseomitenlospullupsI2C?

  2. ¿Esprobablequelafaltadedetonacionesdañealgunodeesosdoscircuitosintegradosenmitablero?

EstoybuscandorespuestasqueabordenmicasoespecíficodeconexióndeATmega328PaunRTCDS1307comoenlosesquemasqueproporcioné,perosilapreguntanoesdemasiadoamplia,seríaútilsaberquésucedecuandosehacenlasdetenciones.seomiteengeneral,esdecir,enotrosescenariosdelaoperaciónI2C

.

PS.Busquéenlaredparaencontrarlarespuesta,perosolopudeencontrarartículossobrecómodimensionarlospullups.

Actualización:EstoyusandoArduinoIDE1.03ymifirmwaremanejaelRTCusandoel DS1307RTC Arduino lib (a través de sus funciones RTC.read() y RTC.write() ). Esa lib a su vez usa Wire.h para 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 la I 2 C sin los controles externos.

Actualización 3 (después de que I 2 C pullups agregado): A continuación hay otra serie de tomas de alcance que tomé después de agregar las resistencias de pullup adecuadas (4K7) a las I 2 C líneas (en el mismo tablero). Los tiempos de subida disminuyeron de aproximadamente 5 µs a 290 ns. I 2 C es mucho más feliz ahora.

    
pregunta Ricardo

7 respuestas

27
  

1) ¿Qué sucede cuando se omiten las actualizaciones de 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 detonaciones dañe alguno de esos dos circuitos integrados en mi tablero?

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 se incluyeron en el esquema.

Probablemente, tiene activadas las funciones internas en el ATmega. Por lo que he leído 1 , ATmega tiene 20 k pull pull-ups internos, que pueden activarse o desactivarse 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 20kΩ aún puede hacer que el bus funcione. Sin embargo, este no es un buen diseño confiable, comparado con el uso de resistencias de pull-up discretas.

1 No soy un chico de ATmega.

actualización: en respuesta I 2 C formas de onda, que se agregaron a la O.P.
Las formas de onda en la O.P. tienen una constante de tiempo de subida muy larga. Esto es lo que usualmente parecen 2 formas de onda C

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

    
respondido por el Nick Alexeev
15

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

  

¿Qué sucede cuando se omiten las actualizaciones de I2C?

Ahora, sin resistencias externas, las flexiones internas débiles son lo único que impulsa la línea hacia arriba. Dependiendo de la distribución de la placa, la velocidad de su línea i2c, la frecuencia con la que acceda a ella, la interferencia externa, etc., podrían funcionar y podrían no funcionar. Tuviste suerte Tienes dominadas, pero no las que esperabas.

  

Es probable que la falta de detonaciones dañe cualquiera de esos dos circuitos integrados en mi tablero.

Incluso sin los pull-ups internos, la falta de pull-ups no dañará a ninguno de los IC. La compilació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.

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

    
respondido por el Passerby
8

En general, necesitará tener las resistencias de extracción para un circuito de interfaz I 2 . 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 bajos o ir a algún nivel intermedio determinado por la corriente de fuga en las partes en cada extremo. La razón de esto es porque la verdad I 2 C es un bus de drenaje abierto.

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

Es difícil decirlo a partir de 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 modifican en el software. A veces, el implementador puede no operar los pines de E / S en esta configuración usando una metodología de drenaje abierto y esto puede jugar un factor en el por qué puede parecer que una interfaz sin resistencias de extracción funciona.

Al final del día, probablemente se deba a usted mismo verificar la señalización en uno de sus relojes anteriores utilizando un osciloscopio para ver si el 1 y el 0 en la interfaz funcionan dentro de los niveles de voltaje especificados. Entonces sabrá con certeza si tuvo una suerte increíble con esa implementación o si está en juego uno de los factores que mencioné anteriormente.

    
respondido por el Michael Karas
4
  

¿Qué sucede cuando se solicitan las actualizaciones de I2C?

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

  

Es probable que la falta de detonaciones dañe cualquiera de esos dos circuitos integrados en mi tablero.

Lo más probable es que no.

    
respondido por el The Photon
3

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

Cualquier falta de dominadas no debe dañar ningún IC.

    
respondido por el Funkyguy
1

I2C es un protocolo de lógica 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 usando CircuitLab


Como puedes ver; la resistencia de pull-up es necesaria para garantizar que se vea una lógica 1 en la salida cuando la lógica TTL no está conduciendo a la salida baja. La lógica TTL no puede conducir las líneas altas como ya he mencionado. Si 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 un cierto oso gomoso sin azúcar podría hacer que el valor fluctúe).

Ahora, si implementara I2C en un software con un microcontrolador, es probable que esto no sea un problema, ya que lo más probable es que esté utilizando la lógica CMOS, que puede generar salidas tanto altas como bajas.

    
respondido por el audiFanatic
0

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

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

Saludos

    
respondido por el Wayne

Lea otras preguntas en las etiquetas