¿Existe un valor de resistencia correcto para las resistencias de recuperación I2C?

64

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

  

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

Pensé que cualquier resistencia con un valor de k do 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?
  • ¿hay una ley / regla para determinar este valor?
  • ¿Cómo afectan los diferentes valores de resistencia al bus de datos I²C?
pregunta JonathanD

8 respuestas

61

La resistencia de extracción correcta para el bus I 2 C depende de la capacitancia total del bus y la frecuencia con la que desea operar el bus.

La fórmula de la Hoja de datos de ATmega168 (que creo que proviene del I 2 espec. C) es -

$$ \ text {Freq} < 100 \ text {kHz} \ implica R _ {\ text {min}} = \ frac {V_ {cc} -0.4 \ text {V}} {3 \ text {mA }}, R _ {\ text {max}} = \ frac {1000 \ text {ns}} {C _ {\ text {bus}}} $$

$$ \ text {Freq} > 100 \ text {kHz} \ implica R _ {\ text {min}} = \ frac {V_ {cc} -0.4 \ text {V}} {3 \ text {mA }}, R _ {\ text {max}} = \ frac {300 \ text {ns}} {C _ {\ text {bus}}} $$

El Microchip 24LC256 especifica una capacitancia de pin máxima de 10pF (que es bastante típico). Cuente la cantidad de dispositivos que tiene en paralelo en el bus y Usa 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 nivel alto final de la gama. Si no hay límites de potencia en la fuente de alimentación o problemas de disipación de energía en los circuitos integrados Yo usaría valores en el extremo inferior de la gama.

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

    
respondido por el jluciani
14

Es lógico que las frecuencias más altas requieran una resistencia menor en los pull-ups: una resistencia más baja cargará / descargará la capacitancia del cable más rápido, lo que dará 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 proporciona los valores máximos para las resistencias de pull-up en función de la capacitancia del bus. para tres clases de velocidad:

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.

    
respondido por el stevenvh
9

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 específica para generar o hundir la corriente. Si su salida pudiera hundir 5 mA y la salida estuviera conectada a través de un pull-up a 5 V y luego ajustarse a 0, necesitaría un mínimo de 1k de resistencia. Si usa menos de 1k, la salida no podrá acumular 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 de 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 hundir y generar corriente ("controlador de tótem", "controlador de push-pull"), puede sentirse tentado a no usar resistencias de pull-up o pull-down. Sin embargo, es muy importante que no se permita que floten las entradas CMOS 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, las salidas de drenaje abiertas solo pueden bajar. Es por eso que se requiere la resistencia de 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. Un valor demasiado pequeño una vez más evitará que los controladores de salida tomen suficiente corriente para que el pin caiga hasta 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 le 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 la C para proporcionar un valor que esté cómodamente dentro del tiempo de configuración / retención de su entrada digital.

    
respondido por el ajs410
7

Los valores bajos de pull-up (menor resistencia) 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, la lógica es "baja". realmente tan bajo, lo que puede causar errores de comunicación (y mucho dolor).

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

    
respondido por el Adam Lawrence
5

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

    
respondido por el endolith
1

El valor mínimo de la resistencia depende de las capacidades de conducción de dos lados del bus. Por ejemplo, manejan 10 mA, por lo que el valor de su resistencia debe ser mayor que \ $ \ frac {V_ {bus}} {10 ~ mA} \ $. No es el valor exacto de la resistencia, depende de la capacidad de su bus. Puede verificar el valor de su resistencia si es correcto o no, midiendo el tiempo de aumento y el tiempo de caída de los pulsos del bus. Puede encontrar estos valores de tiempo en el siguiente enlace:

<

    
respondido por el mr. derecik
1

Un problema que no he visto mencionado todavía es el consumo de energía. Si se usa una fuente de alimentación 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. Usar una resistencia de 10 K 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 llegar a ser una parte importante del consumo de energía general, especialmente si el bus puede permanecer 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 lo que esté haciendo el sistema, eso podría aumentar enormemente el consumo de energía.

Para ahorrar energía, puede ser útil tener un resistor "pull-up" conectado a un pin de E / S en lugar de a VDD. Si bien no he visto que las implementaciones de hardware I2C ofrezcan 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 la resistencia en lugar de usar un controlador de colector abierto y una resistencia de extracción fija evitará desperdicio de corriente cuando el maestro quiere generar un "0". Además, si el maestro va a dejar el 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 un poco más de comunicación. Si ninguno de los dispositivos necesita usar el estiramiento de 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á usando software 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 débiles incorporaciones incorporadas del procesador. Al leer los 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 fuerte pull-up tirará de la línea a un nivel alto a pesar de la capacitancia, y una vez que la línea se estabilice, el débil pull-up podrá mantenerlo alto. Incluso si un dispositivo tuviera problemas para tirar de la línea hacia abajo contra el fuerte pull-up, podría hacerlo una vez que el fuerte pull-up esté apagado.

    
respondido por el supercat
0

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

    
respondido por el analogsystemsrf

Lea otras preguntas en las etiquetas