¿Puedo prescindir de las resistencias pull-up I²C?

Estoy tratando de producir un circuito pequeño y estoy buscando reducir el número de partes. Recientemente agregué una EEPROM I²C que se usa una vez cuando el sistema arranca, junto con esta EEPROM agregué dos resistencias para pullups.

Me gustaría prescindir de estos si es posible y solo confiar en las resistencias pull-up internas.

Esta pregunta parece sugerir que es posible, pero simplemente no se recomienda: ¿ Qué sucede si omito las resistencias pullup en las líneas I2C?

Estoy usando un ATmega328 y la EEPROM se encuentra al lado del dispositivo con trances de unos 10 mm.

¿Alguien ha trabajado en un proyecto omitiendo intencionalmente las resistencias pull-up externas o es una muy mala idea?

Las probabilidades son muy buenas de que si omites los pull-ups, estarás reelaborando el tablero para agregarlos.
Compruebe si la EEPROM hace estiramiento de reloj. Cuando no es así, puede usar una salida normal (push-pull) para el reloj. Alternativamente, si tiene pines de sobra, cambie a una EEPROM SPI.
-1: otro "¿qué pasará si hago algo que no es compatible con el estándar?" pregunta, con la respuesta obvia "obtendrá un comportamiento no compatible con el estándar". Puede funcionar en algunas circunstancias específicas, mientras que en la mayoría de las circunstancias funcionará mal o no funcionará en absoluto. Lo mismo ocurre, por ejemplo, con el overclocking de unidades uC: si está 100% seguro de que desea un comportamiento pésimo, defectuoso e impredecible, adelante, nadie lo detendrá. Además, si alguien quiere ahorrar espacio en la placa o esfuerzo de ingeniería, por ejemplo, omitiendo dos resistencias, diría que tiene mucho que aprender.
nb, "Estoy buscando reducir el número de partes"; hacerlo no simplificando la idea funcional o introduciendo la integración, sino omitiendo los componentes pasivos necesarios es, en mi opinión, la esencia misma de la mala ingeniería eléctrica.
Esperaba que alguien tuviera suerte y alguien dijera que está bien hacerlo si tienes cuidado. ¡Parece que las resistencias no van a ninguna parte!
Estaba interesado en averiguar si es algo hecho dadas las condiciones, la proximidad, un dispositivo esclavo, etc. Entiendo por qué son necesarios. Quería saber si los pullups internos serían suficientes. La reducción del número de piezas es para mi proceso de construcción actual, en el que cada pieza extra añade tiempo.

Respuestas (3)

I²C requiere pullups en las líneas de datos y reloj. La forma en que proporcione esos pullups depende de usted.

Los pullups deben estar en la región de 3.3KΩ, pero el valor exacto no es tan importante siempre que esté en algún lugar por ahí.

Puede usar los pull-ups internos de la MCU si, y solo si, tiene muy pocos elementos (uno o dos) en el bus I²C y la longitud del bus es muy corta (cuestión de unas pocas pulgadas).

También debe asegurarse, en esa situación, de que el autobús no captará demasiadas interferencias, ya que el rechazo del ruido de los pullups más débiles será peor. Asegúrese de que cualquier vía que cruce su autobús lo haga a 90° para reducir la inducción de ruido. Proporcione un rastro de tierra o vierta entre el reloj y las líneas de datos para ayudar a reducir la diafonía entre el reloj y las líneas de datos.

Dicho esto, ¡dos resistencias no son realmente un gran gasto...! Las resistencias 0402 o 0603 casi no ocupan espacio. Me limitaría a usar dominadas adecuadas.

No es tanto el gasto, sino el espacio que ocupan y el tiempo adicional que lleva llenarlos. Actualmente estoy construyendo los tableros a mano, así que quiero reducir tanto como sea posible. Echaré un vistazo a las trazas y veré qué mejoras se pueden hacer en el diseño y el espaciado.
¿Puedo sugerir agregar las huellas pero no poblar? Así solo pierdes un poco de espacio, y si no funciona igual te los puedes poner.
Si va a hacer suficientes tableros para notar la diferencia horaria, ¡tendrá suficiente práctica para que no haya mucha diferencia horaria!
Acabo de construir a mano una placa con 0402 y solo me tomó unos 30 segundos cada uno para soldar las resistencias y las tapas. ¿Realmente no puede perder 1 minuto para garantizar un rendimiento adecuado? Pasarás mucho más de un minuto depurando por qué las cosas no funcionan como se esperaba.
Cuando se usa bit-bang I2C con dispositivos que no requieren protocolo de enlace, uno puede omitir el pull-up en SCK si tiene un software que impulsa activamente la línea alta y baja. No estoy seguro de por qué las implementaciones de hardware I2C no brindan una opción para aumentar activamente el reloj, ya que mejora la velocidad y, a menudo, no tiene inconvenientes si, como suele ser el caso, ninguno de los otros dispositivos en el sistema nunca tirará SCK bajo por cualquier motivo.
@supercat De hecho, los esclavos pueden bajar SCK. Se llama estiramiento del reloj. "A un esclavo I2C se le permite mantener presionado el reloj si necesita reducir la velocidad del bus. El maestro, por otro lado, debe volver a leer la señal del reloj después de liberarlo al estado alto y esperar hasta que la línea realmente haya terminado". se ha ido alto". de I2C-bus.org
@Blup1980: Dije "... con dispositivos que no requieren apretón de manos". Muchos dispositivos especifican que siempre responderán a las transacciones I2C sin demora o no responderán en absoluto. Un diseño en el que el maestro impulsa ciegamente el reloj hacia arriba y hacia abajo sin un pull-up sería incompatible con cualquier dispositivo que requiera un protocolo de enlace, pero en muchas aplicaciones I2C el diseñador sabrá exactamente qué dispositivos estarán en el bus y si alguno de ellos requeriría un apretón de manos.

Primero tienes que entender por qué los necesitas. Entonces podrás valorar más claramente si los necesitas o no o si puedes utilizar los internos.

La especificación del bus I2C dice que las cosas conectadas a ese bus deben poder bajar las líneas. Pero no deberían poder tirar de ellos alto. Este es el papel de la resistencia pull-up en esas líneas.

De esa manera, si dos o más cosas quieren usar el autobús exactamente al mismo tiempo, no hay riesgo de que una intente tirar de la línea hacia abajo cuando otra intente empujarla hacia arriba. Lo que crearía una contención de bus, corrientes muy altas en el IO de las cosas y la posible destrucción de las mismas.

Usando pull up, si uno intenta tirar bajo cuando otro intenta "liberar" la línea. La línea bajaría y no sucedería nada grave.

El mismo principio se aplica con el ACK enviado por un esclavo al maestro. El maestro tiene que "liberar" la línea SDA cuando se debe recibir un ACK. En ese momento, el esclavo baja la línea SDA para señalar el ACK.

Imagina un sistema sin pull-ups. Debe haber una manera de tener las líneas en el nivel alto. (una línea de bajo nivel constante no tiene un rendimiento muy alto.... ;-) ) Y ya hemos visto que el uso de salidas push-pull no funciona aquí sin arruinar el protocolo.

¿Sobre los pull-ups internos? Sí, podría funcionar. Pero suponiendo:

  1. Utiliza un autobús de muy baja velocidad. El RC formado por la capacitancia de la línea y el pull-up definen cuánto tarda la línea en transitar de bajo a alto. Si las resistencias son grandes. Como suele ser el caso en los pull-ups incrustados, entonces el tiempo puede ser muy grande. O, como explica @Majenko, se asegura de que la capacitancia de su bus permanezca muy baja. (líneas muy cortas, no use más de 10 esclavos, etc.)

  2. Verifica que los esclavos y el maestro estén bien para trabajar con un bus muy lento. Algunos aceptan una velocidad de autobús arbitraria tan pronto como esté por debajo del máximo permitido. (lo mismo para el tiempo de subida de la línea)

  3. No está utilizando un autobús muy largo en un entorno ruidoso.

  4. Acepta estar fuera de las especificaciones del autobús que está utilizando. Quiero decir que no será una condición contra la que se probaron las cosas I2C que usa. No podrá garantizar con certeza que funcionará sin probarlo usted mismo en un prototipo en todas las condiciones de funcionamiento.

De la hoja de datos ATmega328:

El único hardware externo que se necesita para implementar el bus es una sola resistencia pull-up para cada una de las líneas de bus TWI.

Como se indica más adelante en la misma sección sobre TWI con el 328:

ambas líneas de bus están conectadas al voltaje de suministro positivo a través de resistencias pull-up. Los controladores de bus de todos los dispositivos compatibles con TWI son de drenaje abierto o de colector abierto. Esto implementa una función AND cableada que es esencial para el funcionamiento de la interfaz. Se genera un nivel bajo en una línea de bus TWI cuando uno o más dispositivos TWI emiten un cero. Se emite un nivel alto cuando todos los dispositivos TWI establecen tres estados en sus salidas, lo que permite que las resistencias pull-up eleven la línea.

Las resistencias pullup son necesarias para generar los valores lógicos necesarios para hablar con el dispositivo EEPROM.

Me doy cuenta de que esto es lo que se supone que debes hacer, ¡estoy viendo lo que puedo hacer!
Bueno, lo que la hoja de datos de Atmel me estaría diciendo es que no puedes salirte con la tuya sin usar las resistencias pullup y aún así tener una comunicación confiable.