Conversión de 3.3 a 5.0 V de I2C

32

Estoy tratando de conectar un dispositivo 3.3V I 2 C a un Arduino de 5V.

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

No estoy seguro de cómo manejar esto. Pensé en agregar un par de diodos, con un divisor de voltaje en el lado de entrada esclavo y nada más en la entrada maestra.

¿Hay otras soluciones?

    
pregunta JohnC

4 respuestas

24

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

    
respondido por el sivu
13

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

Varios fabricantes los fabrican, incluidos Fairchild, TI, IDT y Pericom. Eche un vistazo a la NC7SZ384 .

Vea las siguientes notas, entre otras:

respondido por el Jason S
8

Muchos Arduino tienen soporte interno 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, quien hizo el Arduino USB inteligente de Teensy , sugirió que podría abrir el cable USB y suministre una tensión de 3,3 V en lugar de la línea V CC del cable. Podrías intentar esto. Pero también hay otras opciones.

  1. Compruebe los niveles lógicos para el Arduino. Creo que soportan 3.3 V como lógica ALTA incluso en un Atmel de 5 V. Un artículo de SparkFun dice: "* Conexión de una salida digital de 3.3 V el pin a una entrada de 5 V suele ser sencillo. La mayoría de los dispositivos son bastante tolerantes al voltaje mínimo que aceptarán como un valor alto digital. La mayoría de los microcontroladores de Atmel, por ejemplo, aceptan cualquier valor superior a 0,6 * V CC tan alto, por lo que el dispositivo de 3.3 V debe generar un nivel superior a 3 V (0.6 * 5 V). * "
  2. Compre uno de los clones de Arduino que ha saltado los selectores de 3.3 V y 5 V. Utilizo el RBBB cloan que he configurado el chip FTDI de cables de alimentación a 3,3 V. Pero hay muchos otros que tienen opciones de configuración reales de 3,3 V , incluyendo uno de los recientes Arduinos oficiales si no recuerdo mal. También puede usar el Teensy USB con su complemento 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 3.3 V con calidad de fuente de alimentación de laboratorio en lugar de la línea V CC del cable USB. Debería ser de baja corriente, como ha sugerido Paul. Por lo tanto, ya sea una fuente de voltaje de buena calidad. También puede poner un par de baterías en serie para obtener el voltaje deseado.
  4. Si está interesado, puedo intentar examinar el esquema de su Arduino y quizás sea posible realizar un cambio en la configuración de FTDI que permita 3.3 V.

Por último, tenemos una discusión que podría interesarle sobre esto en aquí en Chiphacker sobre soluciones unidireccionales y bidireccionales para reducir el voltaje. Este artículo sobre SparkFun mencionado por todbot es útil, al igual que la discusión sobre bidrectional MOSFET artículo vinculado desde SparkFun. Para resumir el artículo de SparkFun:

  • Resistencia en línea. Unidireccional Solo bajada: reduce la corriente, los diodos de sujeción de E / S de IC pueden limitar la entrada máxima.
  • resistencias serie. Unidireccional Solo bajada, pero granular.
  • diodo. Unidireccional Paso hacia abajo Más seguro Alto a partir de diodos de 5 V bloques; El lado de 3.3 V luego se ata a alto. Pero, si invierte la configuración del diodo, ¿no podría también acelerar?
  • MOSFET. Bidireccional. Bajar o subir.
  • En comentarios: Ejemplo de aislamiento óptico: 4N25. Alta corriente.
  • En comentarios: Ejemplo de diodo Zener: 1N4728A
  • En comentarios: 74HC244 / 125 unidireccional
respondido por el cyphunk
6

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

No sé qué tipo de restricciones tiene en su diseño, pero creo que usar un IC dedicado sería más fácil que crear su propia solución.

    
respondido por el Vineeth

Lea otras preguntas en las etiquetas