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.
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.
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:
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:
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í).
Gung Foo
scott seidman
Gung Foo
scott seidman
Gung Foo