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.
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 pullups I 2 C?
¿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.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 el I 2 C sin los pullups externos.
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.
Respuestas:
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.
Probablemente no. En este caso particular (MCU, RTC, nada más), definitivamente no.
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
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.
fuente
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.
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.
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.
fuente
You do have pull-ups, just not ones you expected.
- Supongo que lo lograste. ¡Gracias!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.
fuente
Lo más probable es que el bus I2C simplemente no funcione.
Probablemente no.
fuente
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.
fuente
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.
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.
fuente
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
fuente