Diafonía a través de I2C

Estoy usando un Arduino para comunicarme con sensores de magnetómetro I2C. A continuación se muestra la lista de piezas y un diagrama de bloques básico del cableado:

Magnetómetro HMC5883L:

https://learn.adafruit.com/adafruit-hmc5883l-breakout-triple-axis-magnetometer-compass-sensor/overview

Expansor TCA9548A I2C:

https://learn.adafruit.com/adafruit-tca9548a-1-to-8-i2c-multiplexer-breakout/overview

Cable plano estándar de 4 pines:

https://www.digikey.com/product-detail/en/3m/8125-04-100/ML04G-100-ND/1107830

Cabezal rectangular estándar de 6 pines:

https://www.digikey.com/product-detail/en/sullins-connector-solutions/PPTC061LFBN-RC/S7004-ND/810145

Cabecera estándar de 4 pines:

https://www.digikey.com/products/en?keywords=3M9449-ND

esquemático

simular este circuito : esquema creado con CircuitLab

Pido disculpas por el esquema, pero tuve que simplificarlo para hacerlo más claro. Esencialmente, estamos usando un Arduino Uno para leer de seis sensores de magnetómetro usando un multiplexor I2C. El multiplexor está conectado a una placa de circuito impreso hecha para Arduino, por lo que está muy cerca de él, y los sensores están a una distancia de 1,5 metros a través de un cable plano conectado a través de cabezales a la placa de circuito impreso. El esquema solo muestra un sensor, ya que incluir los seis lo complicaría, pero los otros sensores también están conectados de la misma manera.

Ahora, por lo que leí sobre I2C, hay algunos problemas con la diafonía y, según otra pregunta publicada, se recomienda colocar VDD y GND entre SDA y SCL para reducir o evitar que se produzca la diafonía. El HMC5883L falla en ese sentido, así que con mi cable plano, crucé los cables para que VCC y GND estén entre SDA y SCL. No es la solución más elegante, pero es la solución más simple. El cruce solo ocurre en el extremo del cable del sensor (menos de 1 pulgada), no en el medio, pero me preguntaba si esto sería un problema con la comunicación I2C. Para ser honesto, probé esto con dos sensores, por lo que estoy bastante seguro de que esta configuración funcionará con los 6 sensores, pero quería preguntar en caso de que pudiera surgir algún problema que nunca consideré.

Además, en caso de que se lo pregunte, tuve que agregar las resistencias pull up de 10k en las líneas SDA y SCL para que los sensores pudieran leerse a 1,5 metros de distancia. Inicialmente, cuando lo configuré en una placa de prueba, no respondían, y no fue hasta que agregué las resistencias que se podían leer desde una gran distancia. Los sensores en sí tienen resistencias de extracción de 10k, pero supongo que disminuir la resistencia permitió una distancia más larga. Las resistencias son resistencias SMD de 10k que se encuentran en la placa PCB.

10k parece muy débil para pullups I2C a menos que su tasa de SCL sea extremadamente lenta. Además, no veo cómo puede haber mucha diafonía teniendo en cuenta que la tasa de SCL generalmente está entre 100 y 400 kHz. En mi experiencia, son los tiempos de subida/bajada de SCL y SDA los que causan la mayoría de los problemas de comunicación.
Tenga en cuenta que la hoja de datos de HMC5883 muestra resistencias pull-up I2C de 2.2K. Otra cosa: dado que estos chips aplican una corriente de pulso grande y corta durante una medición, es posible que un capacitor de depósito marginal (junto al chip) cause algunas corrientes de pulso en su ruta de suministro larga. Las corrientes de pulso podrían corromper las transacciones I2C o podrían reducir la inmunidad al ruido.
(a) He leído esto varias veces, pero aunque veo mucha información de fondo y un concepto erróneo o dos, no puedo ver una pregunta específica . ¿Cuál es la pregunta específica? (b) Si tuviera que adivinar cuál es su pregunta, la respuesta sería "la mejor manera de estar seguro es usar un osciloscopio", así que le preguntaré: ¿Tiene acceso a un 'osciloscopio y tiene experiencia en usarlo (o tener acceso a alguien que lo haga)?
Además, parece haber mucha superposición entre esta pregunta y la anterior " Consideraciones de diseño para la placa Arduino con multiplexor TCA9548A y sensores HMC5883L ". Nuevamente, eso fue demasiado amplio para que yo quisiera intentar responderlo, y probablemente adivinar erróneamente todo lo que estaba tratando de preguntar. Si no obtiene respuesta a una pregunta, mejore la pregunta , en lugar de hacer otra muy similar u ofrecer una recompensa .
Samuel, gracias por tu sugerencia. Nunca pensé en usar un osciloscopio para mirar la señal, pero en este caso, lo usaré y lo miraré. No tomé en cuenta los pull-ups internos del chip. Solo estaba mirando los esquemas de la placa de ruptura.
La diafonía realmente no debería ser un problema en ninguna situación en la que I2C sea una opción de protocolo adecuada. Dicho de otra manera, si su cable es lo suficientemente largo como para que la diafonía sea importante, hay otras razones para no usar I2C.
Si observa interferencias incluso con un cable corto, reduzca los valores de resistencia pull-up y agregue resistencias en serie pequeñas (5-10 ohmios) a los controladores I2C.
@ user101402 "No tomé en cuenta los pull-ups internos del chip". FYI, el HMC5883L no tiene "pulgadas internas" I2C.
Lo siento, volví a revisar la hoja de datos; Vi que era para un diseño de referencia. Es interesante ver cómo Adafruit no siguió el diseño recomendado.

Respuestas (2)

¿Cuál es su velocidad I2C? Dependiendo de la velocidad y la distancia, I2C puede bajar hasta 1k para un bus de alta velocidad y baja impedancia. Consulte http://www.ti.com/lit/an/slva689/slva689.pdf

¿Qué quieres decir exactamente con:

El cruce solo ocurre en el extremo del cable del sensor (menos de 1 pulgada), no en el medio de este

Al "cruzar" los cables, la buena práctica consiste en no tener las dos líneas I2C corriendo una al lado de la otra. Por ejemplo, esta es una mala práctica para un cable plano largo:

  1. CCV
  2. TIERRA
  3. ASD
  4. SDL

Una forma "mejor" de hacer las cosas:

  1. CCV
  2. ASD
  3. TIERRA
  4. SDL

De esta forma, GND protege a SDA de SDL. Sin embargo, GND en sí mismo puede generar ruido si la derivación no es suficiente en ninguno de los lados del cable.

La mejor manera sería tener cables adicionales, con el único propósito de blindar las señales:

  1. CCV
  2. TIERRA
  3. ASD
  4. TIERRA
  5. SDL
  6. TIERRA

Esto se usa en todos los cables planos IDE, por ejemplo.

Gracias por tu comentario. Eso es lo que quise decir con cruzar los cables. Traté de seguir la buena práctica, aunque tenía SDA y SCL en los extremos, con VCC y GND en el medio. Nunca pensé en poner SDA entre VCC y GND, pero ahora es demasiado tarde para eso.

No tengo una opinión sobre el tema principal de su pregunta, que es la posible conversación cruzada, ya que no tengo experiencia con eso.

Pero tengo un comentario con respecto a las resistencias pull-up.

De la hoja de datos de la pieza , creo que está implícito que necesita resistencias pull-up en ambos lados del TCA9548A. También hay una pregunta relevante en el canal de soporte oficial de TI, donde TI dice que necesita tener resistencias en ambos lados, en los canales ascendentes y descendentes.

Sin embargo, tienes razón cuando dices

Supongo que disminuir la resistencia permitió una distancia más larga

No se aplica aquí, pero en general es cierto. Como puede ver en la hoja de datos de la pieza, sección 9.2.2, el valor máximo de resistencia de pull-up permitido está definido por

R pag ( metro a X ) = t r 0.8473 C b

Cuanto más largos sean los cables, mayor será la capacitancia del bus C b y así cuanto menor sea la resistencia máxima que puede utilizar.

gracias por su respuesta. Intenté colocar resistencias pull-up con el TCA9548A, pero hizo que la unidad no respondiera. Funcionó cuando quité las resistencias.