i2c pullup externo mata comunicación

6

Estoy usando un MCP23017 (lo cual no debería ser importante) para extender el número de pines GPIO de una computadora Linux basada en el brazo usando i2c-dev bitbanging. Todo funciona bien con cables de unos pocos centímetros.

El problema es que necesitaría 2 * ~ 3 m de cable entre los grupos de 3 módulos basados en MCP23017. Ahora, si utilizo un cable de 3 m (0,75 mm de diámetro) para SCL y SDA, recibo un acuse de recibo por establecer la dirección, pero al seleccionar el IC para los estados de los pines se obtienen respuestas confusas.

Notas 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 está siendo corrompido de forma regular.

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

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

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

Espero que alguien tenga una idea de lo que está sucediendo aquí, lo que podría probar o dónde podría aprender lo suficiente para entender esto en un nivel que me ayude a solucionarlo. Déjame saber si necesitas más información.

ACTUALIZACIÓN : el cable de 3 m ahora funciona con detectores externos de 850 ohmios. Bajando a 150 ohmios, también funciona con 6 m, pero no es una buena opción, ya que uno usa fácilmente más potencia (para bajar la línea) de lo que la mayoría de pines gpio están clasificados.

    
pregunta Gung Foo

3 respuestas

5

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 a su dispositivo i2c probablemente esté bien, ya que el bloqueo de bits será lento.

    
respondido por el Scott Seidman
4

El problema que probablemente tenga con esa longitud de cable es la capacitancia total de 400 pF permitida en el bus. Incluso la mayoría de los cables de datos de alta calidad, como el Cat 5e, están alrededor de 50pF por metro. Entonces, también debe tener en cuenta la capacidad de otros dispositivos en el bus, la siguiente pregunta un tanto relacionada tiene una buena respuesta al respecto:

capacitancia del bus i2c

En general, I2C está diseñado para comunicaciones solo a corta distancia. Para distancias más largas, mientras que es más caro, 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 por mi cuenta, pero como alternativa al uso de un protocolo diferente, Texas Instruments hace que los extensores de bus I2C y el siguiente dispositivo probablemente cumpla con sus requisitos, permite 3000 pF en el lado de la transmisión, la hoja de datos proporciona una buena descripción de como funciona:

Extensor de autobús P82B715

    
respondido por el PeterJ
0

Ya que I2C puede funcionar incluso a 0Hz (DC), puede insertar dos LED en los pull-ups y ver literalmente lo que está pasando en el bus, sin recurrir a un osciloscopio. Puede pasar el protocolo usando un botón en un GPIO de entrada o pasando por el micro usando el depurador.

Si su comunicación I2C funciona a frecuencias tan bajas, es probable que se trate de un problema de tiempo (verifique la constante RC realizada por el pull-up y el propio cable).

    
respondido por el Gianluca Ghettini

Lea otras preguntas en las etiquetas