Interferencia a través de I2C

0

Estoy usando un Arduino para comunicarme con los sensores magnetométricos I2C. La lista de piezas y un diagrama de bloques básico del cableado se muestran a continuación:

Magnetómetro HMC5883L:

enlace

TCA9548A Expansor I2C:

> enlace

Cable de cinta estándar de 4 clavijas:

enlace

Cabecera rectangular de 6 clavijas estándar:

enlace

Encabezado estándar de 4 pines:

enlace

simular este circuito : esquema creado usando CircuitLab

Pido disculpas por el esquema, pero tuve que simplificarlo para hacerlo más claro. Esencialmente, estamos usando un Arduino Uno para leer desde seis sensores magnetométricos usando un multiplexor I2C. El multiplexor está conectado a una placa PCB hecha para el Arduino, por lo que está muy cerca de ella, y los sensores están a una distancia de 1,5 metros a través de un cable de cinta conectado a través de los encabezados a la placa PCB. El esquema solo muestra un sensor, ya que incluir los seis lo haría desordenado, 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 interferencia, y de acuerdo con otra pregunta publicada, se recomienda que se coloquen VDD y GND entre SDA y SCL para reducir y / o evitar que se produzcan interferencias . El HMC5883L falla en ese sentido, así que con mi cable de cinta, 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 se produce 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 haya considerado.

También, en caso de que te lo preguntes, tuve que agregar las resistencias de extracción de 10k en las líneas SDA y SCL para poder leer los sensores desde una distancia de 1,5 metros. Inicialmente, cuando lo instalé en una placa de pruebas, no respondieron, y no fue hasta que agregué las resistencias que se podían leer desde una gran distancia. Los sensores en sí tienen resistencias de arranque de 10k, pero supongo que la disminución de la resistencia permitió una distancia más larga. Las resistencias son resistencias SMD de 10k que se encuentran en la propia placa PCB.

    
pregunta user101402

2 respuestas

1

¿Cuál es tu velocidad I2C? Dependiendo de la velocidad y la distancia, I2C puede ir tan bajo como 1k para el bus de alta impedancia de baja velocidad. Consulte enlace

¿Qué quieres decir exactamente con:

  

El cruce solo se produce en el extremo del cable del sensor (menos de 1 pulgada), no en el centro

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

  
  1. VCC
  2.   
  3. GND
  4.   
  5. SDA
  6.   
  7. SDL
  8.   

Una "mejor" forma de hacer las cosas:

  
  1. VCC
  2.   
  3. SDA
  4.   
  5. GND
  6.   
  7. SDL
  8.   

De esta manera, GND protege a SDA de SDL. Sin embargo, GND en sí puede generar ruido si la omisió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 proteger las señales:

  
  1. VCC
  2.   
  3. GND
  4.   
  5. SDA
  6.   
  7. GND
  8.   
  9. SDL
  10.   
  11. GND
  12.   

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

    
respondido por el romain145
0

No tengo una opinión sobre el tema principal de su pregunta, que es el posible diálogo cruzado, ya que no tengo experiencia con él.

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

Desde la hoja de datos de la pieza, creo que está implícito que necesita resistencias de tracción A ambos lados de la TCA9548A. También hay una pregunta relevante en el canal de soporte oficial de TI, donde TI dice que sí es necesario tener resistencias en ambos lados, en los canales ascendente y descendente.

Sin embargo, tienes razón cuando dices

  

Supongo que disminuir la resistencia permitida para distancias más largas

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 permitido de resistencia de pull-up está definido por

$$ R_ {p (max)} = \ frac {t_r} {0.8473 \ cdot C_b} $$

Cuanto más largos sean los cables, mayor será la capacidad del bus \ $ C_b \ $ y, por lo tanto, menor será la resistencia máxima que puede usar.

    
respondido por el nickagian

Lea otras preguntas en las etiquetas