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?
Respuestas:
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:
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.
fuente
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:
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.
fuente
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.
fuente
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.
fuente
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.
fuente
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.
fuente
http://www.cypress.com/knowledge-base-article/rise-and-fall-time-specifications-scl-and-sda-lines-i2c
fuente
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.
fuente