¿Qué es este blog?

La idea de este blog nace para compartir los avances que se vayan realizando a lo largo de un estudio sobre cómo interconectar los distintos sensores que se pueden encontrar en el mercado, o fabricar de forma casera, con la plataforma Mindstorms de LEGO. Para ello se hará uso ARDUINO, un entorno de desarrollo abierto basado en microcontrolador.

lunes, 10 de enero de 2011

Manejo del protocolo I2C usando Labview


          Labview es un entorno de programación gráfica usado por millones de ingenieros y científicos para el desarrollo de sistemas de control, medidas, pruebas mediante el uso de intuitivos iconos gráficos conectados por hilos, que recuerdan a los diagramas de flujo. Labview permite la integración con numerosos dispositivos Hardware (entre ellos el NXT) y proporciona librerías que permiten el análisis avanzado y la visualización de los datos. La plataforma Labview es escalable, y trabaja en distintos sistemas operativos.


Bloques básicos
Para implementar el protocolo I2C en Labview, los primeros bloques que debemos definir son los que sirven para controlar las entradas/salidas digitales del hardware que conectemos. Estos bloques son 3, y como se puede ver a continuación corresponden a las salidas digitales, a las entradas digitales y a la habilitación de dichas entradas/salidas:
Bloques para controlar las E/S digitales en Labview
El protocolo se empieza generando una condición de arranque. Como ya se explicó anteriormente. Para ello, es necesario mantener la línea de reloj en estado lógico alto, mientras se genera una transición de nivel alto a nivel bajo en el bus de datos. Tras esta condición inicial, todos los dispositivos van a observar el bus esperando ver su dirección, que será de 7 o de 10 bits. Después de que cada bit (dirección, lectura/escritura o dato) se envíe por el bus, se produce un ciclo de reloj y se espera confirmación por parte del dispositivo esclavo.
Lo primero que se hace es empezar con la transacción más básica, es decir, escribir un dato en un dispositivo. Con el bloque de salida digital, se configura una línea digital como salida, y se pone dicha línea al nivel lógico deseado (alto o bajo). Como se ve en la siguiente figura, tras poner el bit deseado se completa un ciclo de reloj completo:

Tranferencia de un bit en  Labview
La función wait que se ve en la figura anterior, va a determinar cuánto tiempo la señal de reloj se mantiene a nivel bajo y alto. La temporización del bus cambia según la señal de reloj sea ascendente o descendente, y dicha temporización puede ser de tres formas: estándar, rápida o muy rápida. Normalmente operaremos en cualquiera de los 2 primeros modos.
Podemos definir la función siguiente, que se encarga de la transmisión de un dato. Esta función se puede guardar como un fichero .vi para que así podamos reutilizarla siempre que nos sea necesario:
Transferencia de un dato en Labview

Después de que cada byte se haya transmitido a través de la salida digital, se debe recibir una confirmación por parte del dispositivo direccionado. Durante este bit de confirmación, la línea de datos para a estar a nivel bajo mientras dure el nivel alto de la señal de reloj. Este bit de confirmación se va a recibir siempre tras enviar un dato, hasta que se envíe una condición de parada.
En la figura siguiente, el dispositivo confirma la recepción del dato. Veamos cada una de las partes de esta figura:
-       En el primer bloque de la secuencia, se establece la línea digital como entrada para que el maestro pueda recibir las confirmaciones de los dispositivos.
-       A continuación, se produce un ciclo completo de la señal de reloj.
-       Finalmente, se vuelve a configurar la línea como salida para que el maestro pueda seguir enviando datos al dispositivo.
En I2C, un dispositivo puede mantener la línea de datos a nivel bajo tanto tiempo como necesite. Dependiendo de los dispositivos y de lo que nos diga el fabricante, se pueden establecer tiempos de espera máximos para evitar que se quede colgado el programa.
ACK de un bit en Labview

Combinando el maestro para recibir los datos, con las confirmaciones de los dispositivos, se obtiene un esquema similar al que se ve a continuación, en el que el bucle “WHILE” se ejecuta mientras haya datos que escribir en el dispositivo, y la señal de datos no se mantenga a nivel bajo durante más de un ciclo. Se ha usado el función de entrada digital para leer el estado de la línea digital (nivel alto o bajo).

Función I2CWrite de Labview
Lecturas
El protocolo I2C no se limita a escribir datos en un dispositivo, sino que los dispositivos también pueden mandar datos al maestro, En este caso, el dispositivo maestro actúa como un receptor maestro. El sentido por defecto para los datos es salir del maestro en dirección al esclavo. Para permitir que los datos fluyan también en esta dirección es necesario configurar la línea que antes configuramos como salida a entrada. A continuación se muestra una posible forma de implementar esto:

Lectura de un bit en Labview
Usando un bucle FOR, el maestro va leyendo de byte en bye. Como el protocolo I2C lee primero el bit más significativo, se usa un array de 1 dimensión invertido para darle la vuelta al array que se ha leído. Esto se ve en la figura siguiente:

Lecutra de un byte

La función completa de lectura se muestra a continuación, y es similar a la de escritura que vimos anteriormente.
Función completa I2CRead

Direccionar dispositivos

            En el protocolo I2C se puede direccionar un dispositivo de dos formas diferentes, con una dirección de 7 bits y con una de 10 bits. En el primer caso, tal y como se explicó en el apartado correspondiente a la descripción del protocolo, el octavo bit se usa para indicar si el maestro va a leer o escribir del dispositivo esclavo. La figura siguiente contiene la forma de invertir las direcciones de 7 bits del bit menos significativo al más significativo, ya que como acabamos de mencionar, el protocolo escribe primero el bit de mayor peso (MSB). En último lugar se añade a la dirección el bit de lectura/escritura.

Direcciones de 7 bits
El caso de 10 bits no lo vamos a usar en principio para nuestros fines, pero se muestra en la siguiente figura cómo se direccionaría.

Direcciones de 10 bits
Todo lo anterior se puede ver recogido en la siguiente figura:

Esquema completo

--------------------------------------------------------------------------------------------------------------------------------------------
Referencias:

1 comentario:

Nota: solo los miembros de este blog pueden publicar comentarios.