Tensión y resistencias pull-up I2C

Tengo un sensor que estoy tratando de leer a través de I2C, pero tengo algunos problemas con las resistencias pull-up y el voltaje al que se configurarían.

Mi computadora host es Arduino Nano Every , mientras que mi sensor es el magnetómetro HMC5883L .

A continuación se muestra un diagrama de bloques que muestra mi esquema de cableado.

Investigué un poco sobre el procesador de Nano Every . Los pines I2C están conectados al ATMEGA4809 y se alimenta a +5V. Así, las líneas I2C están referenciadas a un voltaje de 5 voltios. El módulo HMC5883L ya tiene resistencias pull-up para 5 V y 3,3 V, pero si quisiera agregar mis propias resistencias pull-up externas, tendría que hacer referencia a 5 V como se muestra en mi diagrama de bloques, ¿correcto? Si decido referenciarlo a 3,3 voltios (y conectar 3,3 voltios del Nano al pin correspondiente del sensor) dado que el microcontrolador está funcionando a 5 voltios, ¿a qué voltaje debo conectar las resistencias pull-up?

esquemático

simular este circuito : esquema creado con CircuitLab

Respuestas (3)

Así, las líneas I2C están referenciadas a un voltaje de 5 voltios

No. Están referenciados a un GND.

conectando 3.3 voltios del Nano al pin correspondiente en el sensor

¡No hagas esto! Los 3,3 V del sensor son una salida .

El módulo HMC5883L ya tiene resistencias pull-up para 5V y 3.3V

Si bien son resistencias pull-up, también forman parte del cambiador de nivel integrado, que permite que el sensor de 3,3 V funcione con un bus I2C de 5 V.

si quisiera agregar mis propias resistencias pull-up externas, entonces tendría que hacer referencia a 5V como se muestra en mi diagrama de bloques, ¿correcto?

No hay razón alguna para agregar nada externamente. Sin embargo, si desea hacerlo, entonces sí, puede agregar resistencias pull-up a 5 V, pero luego debe eliminar R3, R4 de la placa del sensor o asegurarse de que sus resistencias adicionales en paralelo con ellos no bajen de un mínimo resistencia permitida (es decir, su pull-up combinado no es demasiado fuerte). Por ejemplo, las resistencias adicionales de 10k darán como resultado un pull-up de 5k, lo que debería estar bien para un bus de 400kHz.

Si decido referenciarlo a 3.3 voltios

Nuevamente, no hay razón para esto, ya que el lado del sensor del cambiador de nivel ya está subido a 3.3V. El lado MCU de las palancas de cambio se eleva a 5V. Si ha utilizado cualquier MCU de 3,3 V, podría haber eliminado las 4 resistencias (R1-R4) y dos MOSFET, cortocircuitar las líneas SDA y SCL para el paso y, finalmente, agregar resistencias pull-up externas a 3,3 V. Pero dado que está utilizando Nano, su MCU es incompatible con el bus I2C de 3.3V.

ACTUALIZAR:

¿Lo que conecte a VIN dependerá del nivel lógico I2C de la MCU?

SÍ para tableros Adafruit, NO en general. Las placas de Adafruit están diseñadas para funcionar con 5 V (VIN), utilizando un regulador interno para bajar a 3,3 V, como usted mismo mencionó. Por lo tanto, la placa funciona con 5 V, sin embargo, el chip del sensor funciona con 3,3 V.

Ahora, el VIN_min para el chip HMC5883L es 2,16 V, para LSM9DS1 es 1,9 V. Teóricamente, puede alimentar las placas a partir de estos voltajes + caída de voltaje en LDO. No significa que tengas que hacerlo. Si desea un comportamiento estable y predecible, le recomiendo alimentar las placas con 5 V siempre que sea posible. Pero sigue leyendo...

Por lo tanto, 5V de Nano a VIN y mis pull-ups.

Tu error es pensar que el VIN tiene algo que ver con los pull-ups. El voltaje del bus I2C (donde se deben conectar los pull-ups) a menudo se denomina VDDIO en los esquemas. Muchos chips tienen un pin de entrada separado para VDDIO (por ejemplo, pin 13 de HMC5883L, pines 1 y 3 de LSM9DS1). Da la casualidad de que Adafruit conectó esos pines a VDD de LDO en sus placas.

Dado que conectaron VDDIO al regulador interno de 3.3V, no pudieron permitirle aplicar un voltaje más alto a los pines I2C del sensor. Entonces agregaron cambiadores de nivel a sus tableros, con pull-ups a 3.3V en el lado del sensor y pull-ups a VIN en el lado del conector. Esto, a su vez, fijó el voltaje del bus I2C externo al VIN. Entonces, en este caso, el VIN define el voltaje del bus , pero solo porque los ingenieros de Adafruit cablearon las placas de esta manera.

Para resumir:

  • Si no está preparado para piratear placas de sensores para eludir los cambiadores de nivel, está atascado con sus pull-ups, lo que significa que el voltaje del bus I2C externo (es decir, conectado a MCU) siempre será igual a VIN.
  • Por lo tanto, debe proporcionar el VIN con el nivel lógico de E/S de su MCU. O 5V en caso de Nano, 3.3V en caso de Portenta.
  • No hay razón para agregar pull-ups externos, a menos que experimente errores de comunicación a 400kHz. Luego, puede conectar pull-ups externos a VIN, pero trate de no bajar de 10k.
Si se me permite, todavía estoy perdido. Mirando otros módulos como el LSM9DS1, tienen un regulador para bajar a 3.3V. El diagrama de cableado dice que conecte VIN a 5V o 3.3V. Entonces, en ese caso, ¿lo que conecte al VIN dependerá del nivel lógico I2C de la MCU? Entonces, con el Nano, funciona a 5V. Por lo tanto, 5V de Nano a VIN y mis pull-ups. Sin embargo, digamos que con Portenta H7, funciona a 3,3 V, 3,3 V de Portenta a VIN es la forma correcta de conectarlo, ¿verdad? ¿Qué pasa si ejecutas 5V desde el portenta en su lugar?
@BestQualityVacuum ve una actualización.
Gracias por la actualización. Muy claro como el cristal. Entonces, dependiendo de la MCU, conecte el voltaje apropiado al VIN y solo use 3V3 en el sensor para la salida. Entiendo. Chico, realmente lo arruiné.

La gente de Adafruit ha pensado en esto para usted. Si va al sitio de Adafruit al que se vinculó para el HMC5883L, le dicen esto sobre las líneas SDA y SCL para I2C:

ingrese la descripción de la imagen aquí

Entonces, mi interpretación de esto es que puede usar resistencias pullup externas a 5V.

El Atmega, por otro lado, tiene alta digital definida como tal por la hoja de datos:

ingrese la descripción de la imagen aquí

Con una fuente de 5 V, 0,7*VDD son 3,5 V. Por lo tanto, sus 3,3 V no se registrarán como un alto voltaje, lo que hará que el I2C no funcione. Por lo tanto, deberá usar 5V para el pullup I2C.

El controlador tiene un voltaje IO de 5V. Puede funcionar con un bus I2C 3V3, pero es mejor que te limites a 5V. Simplemente use los pullups internos de 5V I2C de la placa del sensor.