i2c pullup externo mata la comunicación

Estoy usando un MCP23017 (que no debería importar) para extender la cantidad de pines GPIO de una computadora Linux basada en brazo usando i2c-dev bitbanging. Todo funciona bien con cables de unos pocos centímetros.

El problema es que necesitaría 2*~3m de cable entre grupos de 3 de estos módulos basados ​​en MCP23017. Ahora, si uso un cable de 3 m (0,75 mm de diámetro) para SCL y SDA, obtengo un reconocimiento para establecer la dirección, pero sondear el IC para conocer los estados de los pines genera respuestas confusas.

Nota al margen: el MCP23017 tiene 2 bancos de 8 pines cada uno, con el cable de 3 metros, solo 1 banco parece funcionar y B se convierte en A... No estoy seguro de qué sucede con la señal allí, supongo que la dirección en la solicitud se está corrompiendo sobre una base regular.

Así que pensé que para aumentar la intensidad de la señal agregaría un pullup externo (los pines gpio utilizados para bitbanging ya tienen uno interno), que nuevamente funciona bien para algunos cables de 10 cm pero elimina incluso la dirección ACK para el cable de 3 m.

Probé 2k2, 4k7 y 10k ohmios, todos con el mismo resultado (exacto) desde mi perspectiva de baja resolución.

Desafortunadamente, no tengo un osciloscopio para mirar todo y no estoy muy bien informado sobre todos los detalles para resolver esto con solo mirarlo, por lo tanto, intento esta ruta.

Espero que alguien tenga una idea de lo que está sucediendo aquí, qué podría intentar o dónde podría aprender lo suficiente para comprender esto en un nivel que me ayude a solucionarlo. Avísame si necesitas más información.

ACTUALIZACIÓN : el cable de 3 m ahora funciona con pullups externos de 850 ohmios. al bajar a 150 ohmios, también funciona con 6 m, pero no es una gran cosa, ya que uno usa fácilmente más energía (para bajar la línea) que la mayoría de los pines gpio.

Respuestas (3)

Dada la alta capacitancia del cable, necesita una resistencia más pequeña que 2.2k. Pruebe 1k o 750. Además, un cable con menor capacitancia ayudará. La comunicación con su dispositivo i2c probablemente esté bien porque el golpeteo de bits sería lento.

¿podría ser que dejar los pullups internos de los pines gpio se suma a mí aumentando la resistencia de los pullups al agregar los externos?
No. Esa resistencia se combinaría en paralelo, reduciendo la resistencia general.
¡Impresionante! Todo funciona con 820 ohmios... ¡muchas gracias, scott! estaba tan cerca... :D
Lo que funciona, funciona, pero tenga en cuenta que podría estar violando el estándar i2c sobre la cantidad de corriente que puede manejar. Consulte las páginas 39 y 40 en nxp.com/documents/other/39340011.pdf . Deberías estar bien en 820, pero 150 parece muy bajo. El rendimiento confiable y la larga vida serían más probables con un extensor de bus, como PeterJ le indicó.
No necesitaré 6 m de cable, por lo que el 820 será suficiente.

El problema que probablemente tendrá con esa longitud de cable es la capacitancia total de 400pF permitida en el bus. Incluso la mayoría de los cables de datos de alta calidad, como Cat 5e, tienen alrededor de 50 pF por metro. Luego, también debe tener en cuenta la capacitancia de otros dispositivos en el bus, la siguiente pregunta algo relacionada tiene una buena respuesta en ese sentido:

capacitancia del bus i2c

En general, I2C está diseñado solo para comunicaciones a corta distancia. Para distancias más largas, aunque más costosas, es posible que desee echar un vistazo a algo como TIA-485 diseñado para un funcionamiento robusto en distancias más largas.

No he probado la solución yo mismo, pero como alternativa al uso de un protocolo diferente, Texas Instruments fabrica extensores de bus I2C y el siguiente dispositivo probablemente cumpliría con sus requisitos, permite 3000pF en el lado de la transmisión, la hoja de datos brinda una buena descripción de cómo obras:

Extensor de bus P82B715

gracias por su respuesta, temía que la capacitancia del cable fuera un problema, por eso traté de agregar la resistencia externa para suavizar la forma de onda. ¿El diámetro del cable afecta su capacitancia? ¿Hay algo que pueda hacer para que esto funcione, además de cambiar de protocolo?
PD: ¿quizás estaría disponible para chatear? :)

Dado que I2C puede funcionar incluso a 0 Hz (CC), puede insertar dos LED en los pull-ups y, literalmente, ver lo que sucede en el bus, sin recurrir a un osciloscopio. Puede avanzar el protocolo usando un botón en un GPIO de entrada o caminando el micro mismo usando el depurador.

Si su comunicación I2C funciona a frecuencias tan bajas, es probable que sea un problema de tiempo (verifique su constante RC hecha por el pull-up y el cable en sí).