Descripción:

Si has tratado de conectar un dispositivo de 3.3V a un dispositivo de 5V entonces sabes los tipos de problemas que pueden existir. Existen varias maneras en las cuales un dispositivo de 3.3V puede ser conectado con toda seguridad a un microcontrolador de 5V. Esta guía mostrará unas cuantas maneras en las que esto se puede realizar.

Conexión Segura:

La siguiente figura muestra un ejemplo de cómo NO debe conectarse un dispositivo de 3.3V (como un sensor de presión como el SCP1000 utilizando la interfaz SPI) a un microcontrolador de 5V (como un PIC o un AVR corriendo a 5V). Aún cuando al comienzo se puede experimentar un funcionamiento normal, el tiempo de vida del dispositivo de 3.3V se verá drásticamente disminuido.

image001gr

Conectar los dos dispositivos directamente, estresará el dispositivo de 3.3V lo que eventualmente conllevará a la falla de éste.

En general, existen muchas maneras de conectar las dos interfaces SPI de modo seguro y robusto. En el mercado hay disponibles muchas pastillas que están diseñadas específicamente para cambiarse entre niveles lógicos. Históricamente estas pastillas son difíciles de encontrar, pero a continuación se explicarán unos cuantos métodos que permiten hacer de esto algo sencillo.

Resistencia en línea:

Este método es la manera más fácil y rudimentaria de conectar dos dispositivos. En la siguiente figura se muestra el método generalizado usando una resistencia en línea.

image002gr

El método consiste en colocar una resistencia de 10K en las líneas MOSI (Master Output Slave Input) y SCK (Clock) señaladas con R7 y R8 respectivamente. Estas resistencias disminuirán el flujo de corriente que entra al dispositivo de 3.3V. Los diodos internos de protección tratarán de restringir la señal entrante tratando de proteger al dispositivo de 3.3V. Estos diodos de protección se encuentran normalmente en las entradas de dispositivos de bajo voltaje.

Un diodo de protección (Clamping diode) es usado para limitar los peak de voltaje en una línea a un pre-determinado voltaje máximo. Una resistencia disminuye el flujo de corriente que circula por el diodo en varios órdenes de magnitud. Limitando la corriente se reducen las posibilidades de que el diodo quede permanentemente dañado. Sin la resistencia, mucha más corriente circulará por el diodo. Esos niveles de corriente podrían destruir el diodo de protección y por lo tanto dañar el dispositivo.

Esta precaución es necesaria cuando no se esté seguro de que el dispositivo tiene un diodo de protección. Sin embargo la mayoría de los dispositivos de 3.3V tienen estos diodos. Si tu dispositivo no tiene, entonces el método de Resistencia en línea no funcionará para reducir el votaje.

Para la línea de conexión MISO (salida del dispositivo de 3.3V) no es necesario colocar ninguna resistencia. En la siguiente figura se muestra un extracto de la hoja de datos de un ATMega8.

image003gr

Para poder eliminar la resistencia se debe saber el nivel para el cual el dispositivo de 5V, detectará la señal como un ‘1’ lógico o un ‘0’ lógico. Si el microprocesador se alimenta con 5V, se verá que el máximo para VIL es 0.2*5V=1V. Esto indica que para el ATMega8, todo valor menor a 1V será considerado un ‘0’ lógico. Para el mínimo de VIH se tiene 0.6*5V=3V, es decir, para el ATMega8 todo valor mayor a 3V será considerado un ‘1’ lógico. Pero ¿Qué pasa cuando estás entre estos dos datos?. Bueno esto es un poco incierto. Cuando tengas dudas, prueba a ver si tu microcontrolador puede interpretar correctamente la señal de entrada. Tanto como el dispositivo de 3.3V pueda entregar como salida una señal sobre los 3V, el ATMega8 podrá interpretar esa señal como un ‘1’ lógico sin ningún circuito externo. Se debe verificar de todas maneras en la hoja de datos de tu microcontrolador de 5V, los límites de voltaje para cada nivel lógico para asegurarse de que los umbrales de voltaje se encuentren dentro del rango de voltaje de salida, que tu dispositivo de 3.3V pueda entregar.

La resistencia R5 de 1K y R4 de 10K forman un divisor de voltaje en la línea CS. Estos tres casos son posibles:

 El dispositivo de 5V se encuentre en RESET, por lo tanto la línea CS será levantada al nivel alto a través de R4.

 El dispositivo de 5V activa CS, la corriente es limitada a través de R5, y el dispositivo de 3.3V debería ver 3.3 a 3.8 V en la línea CS.

• El dispositivo de 5V ajusta la línea CS al nivel bajo, por lo que el dispositivo de 3.3V verá 0.33V en la línea CS (ver divisor de voltaje2).

El porqué se utilizó una resistencia de 1K en vez de una de 10K en R5 se explicará ahora. Si se vuelve a trabajar la fórmula del divisor de voltaje se verá que el dispositivo de 3.3V vería (10K/10K+10K)*3.3=1.65V por la línea CS cuando el dispositivo de 5V baje la línea a un ‘0’ lógico. Un voltaje de 1.65V no es considerado ni un ‘1’ ni un ‘0’ lógico por el dispositivo de 3.3V. Está justo en el medio por lo que el dispositivo de 3.3V estará completamente confundido. Esta es la razón por la que se usó una resistencia de 1K como resistencia en línea y una de 10K como pull-up.

Usando un Diodo:

Este método es considerado una mejor solución que la de la resistencia en línea. Este método funcionará aunque el dispositivo tenga o no diodos de protección. El diagrama es el siguiente:

image004gr

Cuando el dispositivo de 5V transmite un ‘1’ lógico por la línea MOSI, el diodo bloqueará cualquier flujo de corriente que pase al dispositivo de 3.3V, por lo que éste no verá cambio alguno y permanecerá con el pull-up a 3.3V por la resistencia R14.

Cuando el dispositivo de 5V transmita un ‘0’ lógico, el diodo irá a GND. Esto permitirá el flujo de corriente a través del diodo desde la línea de 3.3V. La línea de entrada en el dispositivo de 3.3V verá el voltaje de caída del diodo (0.6V), por lo que en vez de tener 0V en el pin MOSI, el dispositivo de 3.3V tendrá 0.6V aplicados en la línea MOSI. De todas formas un voltaje de 0.6V es considerado lo suficientemente bajo como para que el dispositivo de 3.3V lo entienda como un ‘0’ lógico.

Diodos estándar de silicio tienen un voltaje de caída de aproximadamente 0.6V. Mientras más bajo es ese voltaje, mejor es para la aplicación, por lo que se podría considerar usar un diodo Schottky, los cuales tienen un voltaje de caída cercano a los 0.2V.

Usando un MOSFET:

Este método es una solución más compleja, pero que permitirá conectar cualquier señal de bajo voltaje a uno de alto voltaje. Si 3V es demasiado bajo como para registrar un ‘1’ lógico en un dispositivo de 5V, entonces la configuración con un MOSFET ayudará. El esquema es el siguiente:

image005

En el esquemático, el dispositivo de 3.3V está transmitiendo al dispositivo de 5V. Cuando el dispositivo de 3.3V transmita un ‘1’ lógico, el MOSFET se pondrá en alto (HIGH) y el pin TX-5V verá 5V a través de la resistencia de pull-up R3. Cuando el dispositivo de 3.3V transmita un ‘0’ lógico (0V), el MOSFET irá a tierra y el pin TX-5V verá 0V. Como se dijo anteriormente este circuito es un excelente método para conectar una interfaz de bajo voltaje a una de alto voltaje. Sólo hay que asegurarse de que el dispositivo de bajo voltaje se encuentre en el lado izquierdo del MOSFET. Este circuito no trabajará en la otra dirección (desde un alto voltaje a uno bajo) debido al diodo interno dentro del MOSFET.

A continuación se muestran unas páginas con documentos adicionales que muestran cómo este circuito con el MOSFET puede ser usado para manejar interfaces con diferentes voltajes dentro de un bus I2C:

 Bi-directional level shifter3

 d.holmes page on level shifting4

Lo primero que se recomienda, antes de realizar los circuitos anteriores, es intentar de colocar todos tus dispositivos dentro del mismo bus de poder. Es decir, si tienes un sensor de 3.3V, intenta hacer funcionar el microcontrolador a 3.3V. Si no, para propósitos de prototipo, una resistencia en línea o el método del diodo sería suficiente para realizar las pruebas.

http://www.sparkfun.com/commerce/tutorial_info.php?tutorials_id=65
http://es.wikipedia.org/wiki/Divisor_de_tension
http://wwwasic.kip.uni-heidelberg.de/lhcb/Publications/external/AN97055.pdf
http://delphys.net/d.holmes/hardware/levelshift.html