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:
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:
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.
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:
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.
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 .
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.
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.
0
nivel 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 . 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:
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 .
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:
Puede medir el tiempo de subida en su configuración de prueba y conectar el más alto a la ecuación:
Con este valor, también puede validar si su sistema cumple con la capacidad de bus máxima permitida por la especificación.
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:
Para el modo rápido:
Para el modo rápido más:
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:
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.
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:
Mientras que su valor máximo se calcula usando la siguiente ecuación:
Rpmáx = tr / 0,8473 x Cb
Dónde:
He creado una herramienta en línea para dimensionar la resistencia pull up en diferentes modos de bus. Puedes acceder aquí .
JYelton