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

72

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

El bus SDA requiere una resistencia pull-up para VCC (típico 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 en 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?
JonathanD
fuente
Algo relacionado: electronics.stackexchange.com/q/76376/2028
JYelton

Respuestas:

66

La resistencia de pullup correcta para el bus I 2 C depende de la capacitancia total del bus y de la frecuencia con 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:

Freq<100kHzRmin=Vcc0.4V3mA,Rmax=1000nsCbus

Freq>100kHzRmin=Vcc0.4V3mA,Rmax=300nsCbus

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án.

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). Incluyo resistencias 4K7 en el kit, lo que parece un compromiso razonable para la mayoría de los usuarios.

jluciani
fuente
Por lo general, me imagino que el bus está inactivo (desactivado) la gran mayoría de las veces, por lo que para una aplicación de batería hay problemas más importantes que tratar que optimizar las pullups I2C: P
Nick T
55
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í misma, así como las uniones de soldadura de las almohadillas a los pasadores también tendrán cierta impedancia. En buses más largos, la capacitancia de la traza / cable puede ser mayor que la capacitancia del pin de los dispositivos. Al diseñar tableros de producción, generalmente no determino el valor de extracción final hasta que tenga un prototipo en mano y pueda abarcar el bus con varios valores.
Mark
14

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 resulta en 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 proporciona 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 controladores.

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

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

Las salidas digitales tienen una capacidad especificada para generar o hundir corriente. Si su salida puede hundir 5 mA y la salida se conectó a través de un pull-up de 5 V y luego se ajustó a 0, necesitaría un mínimo de resistencia de 1k. Si usa menos de 1k, la salida no podrá absorber suficiente corriente para tirar del pin hasta 0V. Si usa un valor mayor, como 10k, entonces el pin solo tiene que hundir 0.5 mA, que es mucho menor 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.

Cuando se utilizan salidas digitales que pueden hundirse y generar corriente ("controlador de tótem", "controlador de inserción y extracción"), puede sentirse tentado a no utilizar resistencias pull-up o pull-down. Sin embargo, es muy importante que no se permita que las entradas CMOS floten o que puedan extraer una corriente excesiva ... ¡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 puedan subir y bajar, y las salidas de drenaje abierto solo pueden bajar. Es por eso que se requiere la resistencia pull-up externa. Ahora hay restricciones adicionales en el rango de resistencias pull-up; El valor pull-up formará un circuito RC con la capacitancia del bus. Un valor demasiado pequeño impedirá una vez más que los controladores de salida consuman suficiente corriente para bajar el pin a 0. Sin embargo, un valor demasiado grande tomará demasiado tiempo para cargar la capacitancia del bus.

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

ajs410
fuente
7

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

Iría con la mayor resistencia de pull-up que te brinda comunicaciones confiables.

Adam Lawrence
fuente
5

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.

endolito
fuente
2

Un problema que no he visto mencionado aún es el consumo de energía. Si uno usa un suministro de 3.3 voltios, una resistencia de 3.3K 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 significativa del consumo de energía general, especialmente si el bus puede permanecer bajo durante largos períodos de tiempo. Por ejemplo, si uno lee 100 bytes / segundo pero después de leer cada byte, el bus queda con el dispositivo emitiendo el primer bit del siguiente byte, y la mayoría de esos bytes tienen el MSB libre, 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 que las implementaciones de hardware I2C ofrecen soporte para esto, tener los datos de salida maestros 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 de extracción fija evitará desperdiciando corriente cuando el maestro quiere emitir un "0". Además, si el maestro dejará SCK bajo por un tiempo sin preocuparse por lo que está en SDA, el maestro puede deshabilitar el pull-up hasta que esté listo para un poco más de comunicación. Si ninguno de los dispositivos necesita usar el estiramiento del reloj, el maestro simplemente puede usar una salida directa para SCK y no molestarse con ningún pull-up en ese cable.

Si uno está utilizando software de bits con un procesador rápido y desea obtener un buen rendimiento a pesar de la alta capacidad del bus, el enfoque anterior se puede combinar con el uso de pull-ups débiles incorporados en el procesador. Al leer los datos, active un pull-up muy fuerte, brevemente, inmediatamente después de cada borde descendente de SCK, y luego cambie a un pull-up débil. El fuerte pull-up elevará la línea a pesar de la capacitancia, y una vez que la línea sea elevada, 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, sería capaz de hacerlo una vez que se apaga el pull-up fuerte.

Super gato
fuente
-1

Aquí hay formas de onda, para 400kiloBits / segundo (forma de onda 101010 de 200KHz). El RC es de 4.7K ohm y 212pF. El valor RC permite 2 ajustes TAU.

ingrese la descripción de la imagen aquí

analogsystemsrf
fuente
Esta respuesta es simplemente incorrecta. El reloj de 200 kHz proporciona 200 kb / s, no 400. Solo los bordes ascendentes se ven afectados por la resistencia de pull-up. Las tramas se ven confusas, casi como si hubiera algún tipo de modulación. Las cantidades físicas y sus unidades se escriben con espacio (o espacio delgado) en el medio. Tau es un símbolo, no una abreviatura.
venny
@venny Estas son formas de onda típicas para un bus que corre demasiado rápido para el tiempo de asentamiento. Con solo 2 ajustes de TAU, no hay una parte superior plana para las formas de onda, de ahí el "algún tipo de modulación"; Si se tratara de un patrón seudoaleatorio, la variabilidad de la solución sería muy obvia; leer sobre "ojo de datos". Finalmente, el reloj de 200KHz tiene un valor alto para 2.5uS y luego bajo para 2.5uS; El período de 2.5uS es exactamente el dato de 400KHz que mencioné.
analogsystemsrf