6 votos

El pullup externo de i2c interrumpe la comunicación

Estoy usando un MCP23017 (que no debería importar, sin embargo) para ampliar el número de pines GPIO de un ordenador linux basado en el brazo utilizando 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 bien, si utilizo un cable de 3 m (0,75 mm de diámetro) para SCL y SDA, obtengo un ack para establecer la dirección, pero al interrogar al CI sobre los estados de los pines se obtienen respuestas confusas.

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

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

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

Desgraciadamente no tengo un osciloscopio para mirar todo el asunto y no soy demasiado conocedor de todos los detalles como para resolver esto simplemente mirándolo, por lo tanto intento esta ruta.

Espero que alguien tenga una idea de lo que está sucediendo aquí, lo que podría tratar o donde podría aprender lo suficiente para entender esto en un nivel que me ayuda a arreglar esto. Hágame saber si necesita más información.

ACTUALIZACIÓN : El cable de 3m ahora funciona con pullups externos de 850 ohmios. bajando a 150 ohmios también funciona con 6m pero no es una gran cosa que hacer ya que uno fácilmente utiliza más energía (para tirar de la línea baja) que la mayoría de los pines gpio están clasificados para.

5voto

shash Puntos 668

Dada la alta capacitancia del cable, necesitas una resistencia menor que 2,2k. Prueba con 1k o 750. También, un cable con menor capacitancia ayudará. La comunicación con tu dispositivo i2c probablemente esté bien porque el golpeteo de bits sería lento.

0 votos

¿podría ser que al dejar los pullups internos de los pines gpio se me sume la resistencia de los pullups añadiendo los externos?

0 votos

No. Esa resistencia se combinaría en paralelo, reduciendo la resistencia total.

1 votos

¡Impresionante! Todo funciona con 820 Ohms .. gracias un montón scott! yo estaba tan cerca ... :D

4voto

xilun Puntos 261

El problema que probablemente tengas 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 el Cat 5e, tienen una capacidad de 50pF por metro. También hay que tener en cuenta la capacitancia de otros dispositivos en el bus, la siguiente pregunta, algo relacionada, tiene una buena respuesta al respecto:

Capacidad del bus i2c

En general, I2C está diseñado para comunicaciones a corta distancia. Para distancias más largas, aunque es más caro, es posible que quieras 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 mí mismo, pero como una alternativa a la utilización de un protocolo diferente Texas Instruments hacer extensores de bus I2C y el siguiente dispositivo es probable que cumpla con sus necesidades, permite 3000pF en el lado de la transmisión, la hoja de datos da una buena descripción de cómo funciona:

P82B715 Extensor de bus

0 votos

Gracias por tu respuesta, temía que la capacitancia del cable fuera un problema, por eso intenté añadir la resistencia externa para suavizar la forma de onda. ¿el diámetro del cable afecta a su capacitancia? ¿hay algo que pueda hacer para que esto funcione, además de cambiar los protocolos?

0 votos

P.D.: ¿podría estar disponible para chatear? :)

0voto

Gianluca Ghettini Puntos 146

Como I2C puede funcionar incluso a 0Hz (DC) puedes insertar dos LEDs en los pull-ups y ver literalmente lo que pasa en el bus, sin recurrir a un osciloscopio. Puedes escalar el protocolo usando un botón en un GPIO de entrada o escalando el propio micro usando el depurador.

Si tu comunicación I2C funciona a frecuencias tan bajas es probable que sea un problema de sincronización (comprueba la constante RC que hace el pull-up y el propio cable).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X