cómo elegir las resistencias de pullup correctas para líneas i2c con múltiples esclavos

1

En mi proyecto, he conectado varias placas de ruptura de sensores a un Arduino-proMIni que funciona a 3.3 V y 8 MHz como sigue en una PCB fabricada, pero conservando los diseños originales de la tarjeta (para poder conectarlos a través de rastros en lugar de cables sueltos)

Paraahorrarenergía,estoyusandolospinesdigitalesGPIOparaalimentartodaslasplacasderupturaqueseejecutanenI2CconVin=3.3V.

Lastablasdeseparaciónparadiferentessensorestienenresistenciasdepull-upparalíneasSDA/SCL(conVin)yseconfigurandelasiguientemanera:

Cuando enciendo la placa, siempre que el eeprom externo esté ENCENDIDO (pero no se produzcan lecturas o escrituras), no hay salida en serie para la línea i2c.

Cuando apago el eeprom, la línea i2c solo funciona si todos los demás sensores están encendidos. Al desactivar uno o más de los sensores, no se obtiene una salida en serie para la línea i2c.

Después de investigar en línea, me di cuenta de que necesitamos dar una línea Vdd dedicada a las resistencias de pullup de las líneas SDA / SCL en lugar de las líneas Vin, ya que al desactivar Vin también se eliminarán las líneas i2c.

Así que eliminé las resistencias de pull-up en todas las placas de separación y agregué 5k pullups a los pines SDA / SCL en la MCU con el Vdd.

Incluso después de hacer esto, las líneas i2c solo funcionan después de que se apaga el eeprom externo.

Como para los otros sensores -

  • El RTC ahora funciona solo cuando todos los demás sensores están apagados. Cambiando el Es probable que RTC activado agregue mucho ruido en la salida i2c porque Los cambios de valores en el monitor serie cambian como se enciende y volver a la normalidad cuando se apaga.
  • El sensor capacitivo solo funciona cuando el acelerómetro está encendido.
  • El odómetro actual y el acelerómetro funcionan sin problemas.

¿Puede alguien ayudarme a averiguar por qué sucede todo esto? ¿Se puede resolver este problema simplemente eligiendo las resistencias de pull-up correctas o es un problema de orden superior? ¿Es posible que debido a que estoy usando un cable de 30 cm para el Acelerómetro, la capacitancia total del bus esté aumentando, agregando demasiado ruido en el sistema cuando varios esclavos funcionan simultáneamente? ¿Y por lo tanto ayudará si cambio el acelerómetro en el protocolo SPI y lo desacoplo de I2C?

Todos los sensores se ejecutan a < 100Khz, excepto el eeprom que se ejecuta a 400Khz.

Actualización:

Así que tomé la sugerencia de todos a continuación e hice 2 pcbs. En uno, conecté todos los sensores a la línea Vcc e incluso detuve la línea i2c en Vcc. En el otro accioné todos los sensores con los pines GPIO (pero manteniéndolos siempre en ALTO) como antes y levanté las líneas i2c con otro GPIO (de modo que puedo bajarlos cuando todos los sensores están simultáneamente BAJOS para evitar el caso) [4] como señalado por @maple abajo). ¿Y adivina qué? Los sensores alimentados por GPIO funcionan sin problemas, mientras que en los alimentados por Vcc, la línea i2c, es decir, SDA, se congela después de unos segundos. Esto sucede en el caso de que estoy intentando comunicarme con el FDC1004, el adxl y el ina219. RTC no parece estar afectado. ¿Alguna pista de por qué esto podría pasar?

    
pregunta designDemon

2 respuestas

2

No puedes trabajar así.
No tiene idea de lo que hay dentro de un chip y, por lo tanto, en el momento en que apaga la alimentación, no tiene idea de lo que harán las entradas. Pueden tener una trayectoria de baja impedancia a tierra o entre las dos líneas.

Un sistema como el suyo necesita interruptores de aislamiento que desconectan el dispositivo cuando se apaga. Echa un vistazo a los chips de puerta de transmisión.

En general, tu diseño está violando buenas reglas de diseño. Uso de pines GPIO para tableros de alimentación: horrible! Sólo tiene que utilizar un interruptor de alimentación: enlace

    
respondido por el Oldfart
2

Hay tantos problemas con este diseño que ni siquiera sé por dónde empezar.

  1. En el blog al que te has vinculado, hay una resistencia limitadora para lidiar con el desacoplamiento de la corriente de carga del condensador. No mencionaste nada como esto en la descripción. Incluso si no tiene condensadores externos, no significa que los módulos no los tengan. De hecho, la mayoría de ellos lo hacen. Odio pensar lo que estas corrientes hacen con tus pines MCU.

  2. Siguiendo con lo anterior, cada vez que enciende / apaga dispositivos, carga / descarga esas tapas. Si constantemente está interrogando dispositivos en un bucle, sospecho que terminará perdiendo más poder en esto que guardándolo.

  3. La mayoría de los dispositivos tienen tiempo de encendido. Debe tener esto en cuenta en su código con retrasos entre la aplicación de energía y el comienzo para comunicarse.

  4. La mayoría de los dispositivos tienen voltaje de E / S especificado en "clasificaciones máximas absolutas" como se hace referencia a Vdd, por ejemplo. "Vdd + 0.5V". Si quita la energía del chip y deja sus líneas I2C conectadas al bus, está superando los límites de seguridad, básicamente, friendo esos chips.

  5. Siguiendo con lo anterior, MCU no emite riel a riel. "1" no significa que tenga Vdd esclavo en MCU Vdd y, en consecuencia, el voltaje de I2C pull-up. Aunque esta diferencia es mucho menos preocupante que en # 4.

  6. Si la EEPROM se ejecuta a una velocidad diferente a la del resto de módulos, no puede tener cualquiera de ellos ENCENDIDO simultáneamente con la EEPROM. Has mencionado esto varias veces, pero como un problema para superar, no como una decisión de diseño consciente. Muchas MCU tienen más de una línea de hardware I2C; úselas para agrupar a sus esclavos por velocidad de bus.

  7. Siguiendo con lo anterior, diferentes velocidades de bus requieren diferentes dominadas . Una razón más para mantener a los grupos de esclavos en líneas separadas.

  8. Hablando de los dominios, 5K es probablemente demasiado débil para 400KHz.

  9. Si aún desea utilizar un solo puerto I2C para todo, tenga en cuenta que cambiar de velocidad no es instantáneo después de que haya reconfigurado los registros del reloj.

  10. Muchos dispositivos, especialmente los sensores (como los acelerómetros) tienen soporte para el modo "inactivo" o "bajo consumo de energía". Al usar estos, probablemente ahorrará más energía que con todo este lío GPIO. Y tendrá un sistema más rápido mucho porque los tiempos de despertarse son más cortos que los tiempos de encendido.

En resumen, si aborda con cuidado las inquietudes anteriores (y quizás otras que no pensé) simplemente podría terminar con el sistema operativo. Pero es probable que consuma más energía y tenga más componentes de los que puede tener con el uso del modo de suspensión de esclavos o con un simple interruptor de encendido (L9826 , MIC5891 etc) y I2C bus mux combinación.

ACTUALIZACIÓN:

Aquí hay un poco de matemáticas para la ilustración: FDC1004 requiere al menos 1.1uF condensadores de desacoplamiento. No tener en cuenta las pérdidas, esto equivale a 5.9895uJ de energía para cargarlas en el encendido. Al mismo tiempo, la corriente durante el muestreo es de 750uA, y tarda menos de 1/400 segundos en finalizar (probablemente mucho menos que eso), lo que equivale a 6.1875uJ. Significado: simplemente apagar y encender de nuevo requiere más energía para realizar la medición por sí mismo. Y todavía tiene que realizar la medición después del encendido.

La corriente de reserva de 29uA se traduce en 95.7uJ, es decir, si realiza el muestreo más de 16 veces por segundo, ya está desperdiciando más energía de la que consumiría FDC1004 si se deja en espera.

    
respondido por el Maple

Lea otras preguntas en las etiquetas