¿Hay un valor de resistencia correcto para las resistencias pull-up I2C?

La hoja de datos de la EEPROM 24LC256 establece que:

El bus SDA requiere una resistencia pull-up a VCC (normalmente 10 kΩ para 100 kHz, 2 kΩ para 400 kHz y 1 MHz).

Pensé que cualquier resistencia con un valor de kΩ haría el trabajo (y parece que mi EEPROM funciona bien a diferentes frecuencias con una resistencia de 10 kΩ).

Mis preguntas son:

  • ¿Hay un valor correcto para las resistencias pull-up?
  • ¿Existe una ley/regla para determinar este valor?
  • ¿Cómo afectan los diferentes valores de resistencia al bus de datos I²C?

Respuestas (11)

La resistencia pullup correcta para el bus I 2 C depende de la capacitancia total en el bus y la frecuencia a la que desea operar el bus.

La fórmula de la hoja de datos ATmega168 (que creo que proviene de la especificación oficial I 2 C) es:

frecuencia < 100 kHz R min = V C C 0.4 V 3 mamá , R máximo = 1000 ns C autobús

frecuencia > 100 kHz R min = V C C 0.4 V 3 mamá , R máximo = 300 ns C autobús

El Microchip 24LC256 especifica una capacitancia de pin máxima de 10pF (que es bastante típica). Cuente la cantidad de dispositivos que tiene en paralelo en el bus y use la fórmula anterior para calcular un rango de valores que funcionará.

Si está apagando las baterías, usaría valores que están en el extremo superior del rango. Si no hay límites de energía en la fuente de energía o problemas de disipación de energía en los circuitos integrados, usaría valores en el extremo inferior del rango.

Vendo algunos kits con un I 2 C RTC (DS1337). Incluí resistencias 4K7 en el kit, lo que parece un compromiso razonable para la mayoría de los usuarios.

Por lo general, me imagino que el bus está inactivo (deshabilitado) la gran mayoría del tiempo, por lo que para una aplicación de batería hay problemas más importantes que tratar que tratar de optimizar los pullups I2C así: P
Lo único que agregaría es un búfer por encima de la capacitancia sumada de los dispositivos en el bus. La traza en sí, así como las uniones de soldadura de las almohadillas a los pines, también tendrán algo de impedancia. En buses más largos, la capacitancia de la pista/cable puede ser mayor que la capacitancia de los pines de los dispositivos. Cuando diseño tableros de producción, generalmente no determino el valor final hasta que tengo un prototipo en la mano y puedo evaluar el bus con varios valores.

Tiene sentido que las frecuencias más altas requieran pull-ups de menor resistencia: una resistencia más baja cargará/descargará la capacitancia del cable más rápido, lo que da como resultado bordes más pronunciados. Con los pulsos más anchos de frecuencias más bajas, un borde menos pronunciado no influirá tanto en la forma del pulso.

Por lo tanto, la especificación I2C brinda valores máximos para las resistencias pull-up en función de la capacitancia del bus para tres clases de velocidad:

ingrese la descripción de la imagen aquí

Los valores mínimos se definen en función de la tensión del bus, y deben limitar la corriente a través de los drivers.

3 años después, Texas Instruments escribió una nota de aplicación que tiene un significado bastante cercano a esta respuesta.
Artículo de EDN: Cálculos de diseño para comunicaciones I2C robustas . [Simplemente acumulando material de referencia.]

Hay un rango correcto de valores, sin embargo, es difícil describir exactamente cuál es ese rango. Generalmente, 10k funciona.

Las salidas digitales tienen una capacidad específica para generar o absorber corriente. Si su salida pudiera hundirse 5 mA y la salida se conectó a través de un pull-up a 5 V y luego se ajustó a 0, necesitaría un mínimo de 1k de resistencia. Si usa menos de 1k, la salida no podrá absorber suficiente corriente para bajar el pin hasta 0V. Si usa un valor mayor, como 10k, entonces el pin solo tiene que absorber 0,5 mA, que es mucho menos que su clasificación.

Las entradas digitales tienen una corriente de fuga especificada. Esto es algo así como la cantidad de corriente que se necesita para "mantener" un 0 o 1 en una entrada. Si su resistencia pull-up es demasiado grande, entonces no podrá superar la corriente de fuga. Si apenas supera la corriente de fuga, cualquier ruido en el circuito podría ser suficiente para cambiar la entrada.

Al usar salidas digitales que pueden absorber y generar corriente ("controlador de tótem", "controlador push-pull"), es posible que tenga la tentación de no usar resistencias pull-up o pull-down. Sin embargo, es muy importante que no se permita que las entradas CMOS floten o que puedan extraer demasiada corriente... ¡y es muy fácil olvidar que los pines MCU bidireccionales generalmente aparecen como entradas!


I2C y otros protocolos similares utilizan salidas de "drenaje abierto" (o "colector abierto"). En lugar de tener salidas que pueden tirar hacia arriba y hacia abajo, y las salidas de drenaje abiertas solo pueden tirar hacia abajo. Es por eso que se requiere la resistencia pull-up externa. Ahora hay restricciones adicionales en el rango de resistencias pull-up; el valor de pull-up formará un circuito RC con la capacitancia del bus. Una vez más, un valor demasiado pequeño evitará que los controladores de salida hundan suficiente corriente para llevar el pin hasta 0. Sin embargo, un valor demasiado grande llevará demasiado tiempo cargar la capacitancia del bus.

Si hay tiempos de configuración/espera que no puede violar, le ayudarán a determinar una constante de tiempo RC. La capacitancia del bus está determinada en gran medida por el diseño de la placa de circuito impreso, por lo que puede elegir un valor R que se combine con el C para proporcionar un valor que esté cómodamente dentro del tiempo de configuración/retención de su entrada digital.

Los valores de pull-up bajos (resistencia más baja) pueden mejorar los bordes de las transiciones de la señal, pero a veces pueden ser demasiado rígidos: si los dispositivos en el bus no pueden absorber la corriente de pull-up, obtendrá una lógica "baja", que en realidad no es tan baja. , lo que puede causar errores de comunicación (y mucho dolor).

Elegiría la mayor resistencia pull-up que le brinde comunicaciones confiables.

si me preguntas lo mejor es mirar cada proyecto con osciloscopio si crees que es critico. Puedes hacer los cálculos, pero... es mejor medirlo :) porque la impedancia (longitud de las líneas, etc.) tiene un factor importante.

Hay una animación gif de efecto de diferentes valores en mi sitio web:

https://small-roar.com/i2c-inter-integrated-circuit/

Como puede ver, un valor demasiado pequeño da como resultado que no se detecte la señal: con MCUS más antiguos como Atmega no es un problema porque tienen valores altos para "lógica baja / alta" + si desea una aplicación de baja potencia no es la mejor manera de hacerlo .

ingrese la descripción de la imagen aquí

Un problema que aún no he visto mencionado es el consumo de energía. Si uno está usando un suministro de 3,3 voltios, una resistencia de 3,3 K a tierra desperdiciará 1 mA de corriente (3,3 mW de potencia) siempre que la salida sea baja. El uso de una resistencia de 10K reduciría tanto la corriente como la potencia en un factor de tres. Si habrá mucha comunicación en el bus I2C, ese consumo de energía puede terminar siendo una parte importante del consumo total de energía, especialmente si el bus puede quedarse bajo durante largos períodos de tiempo. Por ejemplo, si uno está leyendo 100 bytes/segundo pero después de leer cada byte, el bus se queda con el dispositivo emitiendo el primer bit del siguiente byte, y la mayoría de esos bytes tienen el MSB despejado, el bus puede gastar el 90% de el tiempo con SCL y SDA bajo. Dependiendo de qué más esté haciendo el sistema, eso podría aumentar enormemente el consumo de energía.

Para ahorrar energía, puede ser útil tener una resistencia "pull-up" conectada a un pin de E/S en lugar de a VDD. Si bien no he visto implementaciones de hardware I2C que ofrezcan soporte para esto, tener los datos de salida maestra en un pin de E/S separado que está conectado al bus a través de una resistencia en lugar de usar un controlador de colector abierto y una resistencia pull-up fija evitará desperdiciando corriente cuando el maestro quiere generar un "0". Además, si el maestro va a dejar SCK bajo por un tiempo sin preocuparse por lo que hay en SDA, el maestro puede desactivar el pull-up hasta que esté listo para más comunicación. Si ninguno de los dispositivos necesita usar la extensión del reloj, el maestro puede simplemente usar una salida directa para SCK y no molestarse con ningún pull-up en ese cable.

Si uno está usando software bit-banging con un procesador rápido y quiere obtener un buen rendimiento a pesar de la alta capacitancia del bus, el enfoque anterior se puede combinar con el uso de pull-ups débiles integrados en un procesador. Al leer datos, active un pull-up muy fuerte, brevemente, inmediatamente después de cada flanco descendente de SCK, y luego cambie a un pull-up débil. El pull-up fuerte elevará la línea a pesar de la capacitancia, y una vez que la línea suba, el pull-up débil podrá mantenerla alta. Incluso si un dispositivo tuviera problemas para tirar de la línea hacia abajo contra el pull-up fuerte, podría hacerlo una vez que se apague el pull-up fuerte.

¡Gracias por esta respuesta! Al hacer dispositivos alimentados por batería o de bajo calor, todo ayuda.

Para frecuencias bajas el valor realmente no importa, pero para frecuencias altas puede tener un efecto de filtrado en la señal, en combinación con otras capacitancias en el circuito, por lo que recomiendan diferentes valores para diferentes velocidades.

Sé que esta es una respuesta muy antigua, pero quiero comentar que el valor de la resistencia importa a bajas frecuencias. Si el valor de la resistencia es demasiado bajo, las salidas de colector abierto no podrán reducir las líneas de señal a un 0nivel lógico válido.

El valor mínimo de la resistencia depende de las capacidades de conducción de los dos lados del bus. Por ejemplo, manejan 10 mA, por lo que el valor de su resistencia debe ser mayor que V b tu s 10   metro A . No es el valor exacto de la resistencia, depende de la capacitancia de su bus. Puede comprobar si el valor de su resistencia es correcto o no, midiendo el tiempo de subida y bajada de los pulsos del bus. Puede encontrar estos valores de tiempo en el siguiente enlace:

http://www.cypress.com/knowledge-base-article/rise-and-fall-time-specifications-scl-and-sda-lines-i2c

Tu respuesta es relevante. De hecho, no es un valor exacto pero, en mi opinión, es una aproximación segura. Sin embargo, tenga en cuenta que el valor mínimo de la resistencia no debe tener en cuenta la capacitancia del bus y solo debe depender de la corriente máxima que desea permitir en el bus.

Suponiendo que desea maximizar la velocidad mientras mantiene el consumo actual al mínimo. Es bastante fácil calcular los valores de resistencia máximos y mínimos. Esto se explica en esta hoja de datos .

Capacitancia de bus

Primero, necesitamos saber la capacitancia del bus. Es cierto que puede hacer una estimación aproximada agregando la capacitancia de los pines de los controladores. Sin embargo, si está desarrollando un producto, puede ensamblar un prototipo con cualquier prueba de resistencia y calcular un valor más preciso.

En la hoja de datos referida, se deriva la siguiente ecuación:

t r = t 0.7 V C C t 0.3 V C C = 0.8473 × R PAG × C b

Puede medir el tiempo de subida en su configuración de prueba y conectar el más alto a la ecuación:

C b = t r METRO a X 0.8473 × R PAG t mi s t

Con este valor, también puede validar si su sistema cumple con la capacidad de bus máxima permitida por la especificación.

Máxima resistencia

Después de obtener la capacitancia, puede volver a conectar la capacitancia en la ecuación para obtener los valores máximos de resistencia para su sistema:

Para el modo estándar:

R pag ( metro a X ) = 1000 norte s 0.8473 × C b

Para el modo rápido:

R pag ( metro a X ) = 300 norte s 0.8473 × C b

Para el modo rápido más:

R pag ( metro a X ) = 120 norte s 0.8473 × C b

Resistencia mínima

Este es el cálculo más fácil, simplemente divida la caída máxima de voltaje del bus por su corriente objetivo máxima:

R PAG ( metro i norte ) = V C C V O L ( metro i norte ) yo O L

Nota: En la hoja de datos especifican VOL(max). Creo que es un error tipográfico. En cualquier caso, esta respuesta proporciona un cálculo rápido y seguro.

En cuanto a las dos primeras preguntas creo que fueron debidamente respondidas. Con respecto al tercero: como mencionaron otros, los valores de pull-up junto con la capacitancia del cable juegan un papel importante tanto en el reconocimiento de sus dispositivos como en la velocidad que puede lograr, ya que forman efectivamente un filtro de paso bajo.

Para un proyecto reciente, tuve que reducir el valor de las resistencias pull-up muy bajo (510 ohmios) para ejecutar un bus I2C de 50 m sobre un cable de teléfono plano antiguo a 5v. Esto está muy por fuera de las especificaciones I2C (min ~1,5KOhms pull-ups para 5V a 3mA) pero funciona.

¡Hola y bienvenido al sitio! Los sitios de Stack Exchange son algo muy distinto de los foros de Internet tradicionales. Aquí solo hacemos preguntas específicas y respuestas específicas . El formulario de respuesta está reservado únicamente para publicar respuestas reales, es decir, soluciones. Nunca debe usarse para hacer comentarios generales, compartir experiencias personales que no son realmente una respuesta, dar gracias o hacer preguntas.
Bienvenido a EE.SE, pero no estoy seguro de que esto responda a las preguntas: (1) ¿hay un valor correcto para las resistencias pull-up? (2) ¿existe una ley/regla para determinar este valor? (3) ¿Cómo afectan los diferentes valores de resistencia al bus de datos I²C? Los sitios de Stack Exchange son sitios de preguntas y respuestas en lugar de un foro. Vea el Tour para más detalles.

De acuerdo con la especificación del bus I2C El valor de la resistencia pull up I2C depende principalmente del modo I2C (Estándar / Rápido / Rápido Plus / HS), VDD y la carga capacitiva del bus.

Su valor mínimo se calcula mediante la siguiente ecuación:

Rpmin = (VDD – VOLmax) / LIO

Dónde:

  • VDD: Tensión de alimentación
  • VOLmax: Voltaje máximo de salida de nivel BAJO
  • IOL: corriente de salida de nivel BAJO

Mientras que su valor máximo se calcula usando la siguiente ecuación:

Rpmáx = tr / 0,8473 x Cb

Dónde:

  • tr: Tiempo máximo de subida de la señal (SDA/SCL/SDAH/SCLH)
  • Cb: Carga capacitiva máxima para línea de bus

He creado una herramienta en línea para dimensionar la resistencia pull up en diferentes modos de bus. Puedes acceder aquí .

Esto no es spam, revelaron afiliación, lo cual está bien según la política de SE
Aclaremos que el enlace al final de esta publicación lo dirige al sitio web de una empresa con fines de lucro que también brinda información sobre los productos que están a la venta.
Eso también debe hacerse con el enlace en la parte superior. Redirige a un recurso de NPX, que también es una empresa con fines de lucro, mucho más grande que a la que redirige el enlace en la parte inferior. Aunque, si se me permite señalar eso, podría tener un poco más de impacto para la comunidad decidir si ese enlace proporciona a la comunidad un recurso útil y que ahorra tiempo o no. Personalmente, creo que mi herramienta me habría ahorrado algunas horas o investigando el protocolo i2c. Esa es la razón por la que he invertido mi tiempo en construirlo.