37 votos

Conversión I2C 3,3 a 5,0 V

Estoy tratando de interconectar una I de 3,3V 2 C a un Arduino de 5V.

No tengo ningún problema con la línea SCL. Puedo usar un simple divisor de voltaje pero tengo un problema con la línea SDA ya que esta es bidireccional.

No estoy del todo seguro de cómo manejar esto. He pensado en añadir un par de diodos, con un divisor de tensión en el lado de la entrada esclava y nada extra en la entrada maestra.

¿Existen otras soluciones?

25voto

Chris Jester-Young Puntos 102876

Un buen documento sobre el tema es Desfasador de nivel bidireccional para el bus I2C y otros sistemas que utiliza un solo mosfet como desplazador de nivel bidireccional.

14voto

fearphage Puntos 250

Para ampliar la respuesta de sivu, este es un uso común para los llamados "interruptores de bus" que son básicamente MOSFETs controlados por la lógica. El uso de MOSFETs discretos tiene algunos inconvenientes (la capacitancia parásita / el acoplamiento capacitivo es uno de ellos) y puede ser complicado elegir un buen MOSFET. Los interruptores de bus están optimizados para su uso en circuitos lógicos de alta velocidad.

Varios fabricantes los hacen, entre ellos Fairchild, TI, IDT y Pericom. Echa un vistazo a la NC7SZ384 .

Consulte las siguientes notas de aplicación, entre otras:

8voto

BBlake Puntos 310

Muchos Arduinos tienen soporte a bordo para funcionar a 3,3 V. En realidad, todos pueden funcionar a 3,3 V y el esquema del chip FTDI explica cómo en un ejemplo. Paul, que hizo el Teensy USB Arduino había sugerido que podía empalmar el cable USB abierto y suministrar un voltaje de 3,3 V en lugar del V CC línea del cable. Puedes probar esto. Pero también hay otras opciones.

  1. Comprueba los niveles lógicos del Arduino. Creo que soportan 3,3 V como lógica ALTA incluso en un Atmel de 5 V. Un artículo de SparkFun afirma: "*Conectar un pin de salida digital de 3,3 V a un pin de entrada de 5 V suele ser sencillo. La mayoría de los dispositivos son bastante tolerantes a la tensión mínima que aceptarán como valor digital alto. La mayoría de los microcontroladores Atmel, por ejemplo, aceptan cualquier valor superior a 0,6*V CC como alto, por lo que el dispositivo de 3,3 V debe emitir un nivel superior a 3 V (0,6*5 V).*"
  2. Compra uno de los clones de Arduino que tiene selectores de 3,3 V y 5 V puenteados. Yo uso el RBBB cloan que he configurado los cables de alimentación del chip FTDI a 3,3 V. Pero hay muchos otros que tienen opciones de configuración real de 3,3 V, incluyendo uno de los recientes Arduinos oficiales si no recuerdo mal. También podrías usar el Teensy USB con su plugin de Arduino y seguir las instrucciones en su sitio para instalar un Regulador de 3,3 V .
  3. Empalme el cable USB y proporcione una fuente de alimentación de laboratorio de calidad de 3,3 V en lugar de la V CC línea del cable USB. Debe ser de baja corriente, como ha sugerido Paul. Por lo tanto, o bien una fuente de tensión de buena calidad. También podrías simplemente poner un par de pilas en serie para obtener el voltaje deseado.
  4. Si te interesa, puedo intentar examinar el esquema de tu Arduino y quizás sea posible hacer un cambio en la configuración del FTDI que permita 3,3 V.

Por último, tenemos un debate que puede interesarle sobre esto en aquí en Chiphacker sobre soluciones unidireccionales y bidireccionales para la bajada de tensión. Este artículo en SparkFun mencionado por todbot es útil, al igual que la discusión sobre el bidireccional MOSFET artículo enlazado desde SparkFun. Para resumir el artículo de SparkFun:

  • Resistencia en línea. Unidireccional. Sólo reductor - reduce la corriente, los diodos de sujeción de E/S de los circuitos integrados pueden limitar la entrada máxima.
  • Resistencias en serie. Unidireccional. Sólo reductor, pero granular.
  • Diodo. Unidireccional. De bajada. Más seguro. El alto de 5 V bloquea el diodo; el lado de 3,3 V se une al alto. Pero, si inviertes la configuración del diodo, ¿no podrías también elevar el nivel?
  • MOSFET. Bidireccional. Paso a la baja o paso a la alta.
  • En los comentarios: Ejemplo de aislamiento óptico: 4N25. Alta corriente.
  • En los comentarios: Ejemplo de diodo Zener: 1N4728A
  • En los comentarios: 74HC244/125 unidireccional

6voto

Luke Puntos 6644

Hay circuitos integrados disponibles específicamente para el cambio de nivel de I2C:

No sé qué tipo de restricciones tienes en tu diseño, pero creo que usar un circuito integrado dedicado sería más fácil que idear tu propia solución.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X