Use GPIO para Pullups conmutables de I2C

Estoy diseñando una placa de interfaz de propósito general y quiero poner a disposición la mayor cantidad de periféricos disponibles y utilizables en un encabezado de expansión sin la necesidad de cambios permanentes (soldadura).

Un problema es hacer que las resistencias pullup I2C sean intercambiables, de modo que se puedan desactivar cuando no se necesiten. Mi idea inicial simplemente usa una salida GPIO libre para subir las resistencias o se desactiva (alta impedancia) cuando no se necesita, como se muestra a continuación. Esto aparentemente me ahorra un transistor interruptor. ¿Hay algo que deba tener en cuenta o es factible?

Sé que los valores de la resistencia pullup dependen de la longitud y la velocidad del bus, pero descubrimos que, para nuestras aplicaciones, 4k7 Ohm generalmente están bien.

esquemático

simular este circuito : esquema creado con CircuitLab

Respuestas (2)

Su uso de un pin GPIO para extraer la resistencia del bus I2C es una idea razonable siempre que la MCU en uso tenga GPIO que tengan una fuerte salida activa de alto nivel.

Deberá usar dos GPIO, uno para cada resistencia. De lo contrario, las dos resistencias colocarán 2x 4,7 K ohmios entre las dos líneas de señal.

Así que tienes una compensación. Use dos GPIO para esto o un GPIO y dos FET de interruptor pequeño. O puede equipar cada resistencia con un encabezado de dos pines y un puente y no usar GPIO en absoluto.

¿Por qué debería necesitar dos pines? ¿La salida no es básicamente un transistor conectado entre el pin y el suministro? ¿En qué se diferencia eso de un interruptor discreto?
@Arne: echa un vistazo a tus esquemas. Tienes 9.4kΩ entre MOSI y MISO. ¿Estas bien con eso?
@Michael Huhh, lo siento, he estado ciego... Lo siento.

Parece bastante razonable (especialmente si usa dos líneas, como sugiere @MichealKaras, pero me preocuparía la idea de dejar que el bus I2C flote, por supuesto, dependiendo de lo que esté haciendo con el bus. En como mínimo, contaría con más pruebas y verificaciones de las que normalmente haría para asegurarme de que el autobús vuelva a subir sin problemas.

Por supuesto, plantea la pregunta de por qué necesita deshabilitar el bus de todos modos. Si es solo para ahorrar corriente, entonces consideraría subir el bus con algunas resistencias robustas conectadas permanentemente en paralelo con sus resistencias conmutadas, si puede ahorrar algunos microamperios. De esa manera, su autobús permanece atado alto durante la inactividad.

No quiero que el bus I2C flote. Cuando se conecta un dispositivo I2C al conector de expansión, los pullups deben estar activos. Solo cuando, por ejemplo, los pines se usan para SPI o GPIO, los pullups se deshabilitan para no interferir.
@Arne Esa es una historia diferente. Aunque bastante avaro con tus alfileres. Sin embargo, mi propia inclinación por una interfaz de propósito general sería proporcionar cada bus y DIO. Por supuesto, podría hacerse, como lo ha hecho en el BusPirate. Puede echar un vistazo a ese diseño para ver cómo se maneja. Creo que todo el diseño está abierto.
"Bastante avaro" - ¿qué quieres decir?
@Arne: no sé cuáles son sus restricciones de costo y tamaño, pero hay algunos paquetes bastante grandes con un alto número de pines que evitarían la necesidad de cambiar la funcionalidad. Debe gastar más, ocupar más espacio en la placa y usar conectores más grandes, por supuesto, por lo que puede que no sea la elección correcta.
La falta de espacio en el conector es exactamente la restricción que necesito eludir. Echaré un vistazo a los conmutadores PMOS disponibles en paquetes adecuados.