martes, 9 de agosto de 2022

Interfaz Periférica en Serie - SPI

En este articulo describimos las comunicaciones digitales y los conceptos básicos de la interfaz periférica en serie , o comunicación SPI (Serial Peripheral Interface) La cual es muy usada en los sistemas embebidos para controlar multiples dispositivos con muy pocos pines.          

 

 

 

Discutiremos la estructura de comunicación y las líneas digitales requeridas , luego mostraremos diferentes modos de la comunicación SPI , y finalmente dar un ejemplo de cómo los datos SPI son transmitidos y recibidos por un dispositivo periférico .

Muchos dispositivos analógicos de precisión tienen una interfaz digital entre un microcontrolador, conocido como dispositivo maestro, y un dispositivo controlado , conocido como periférico o dispositivo esclavo. Por ejemplo, un Conversor Análogo a Digital – ADC (Analog-to-Digital Converter), el cual mide un voltaje de entrada y lo convierte en un numero binario, enviándolos luego al microcontrolador. Otro ejemplo es el de los Convertidores Digita a Analogo – DAC(Digital-to-Analog Converter),  en el cual el microcontrolador envía un código binario y este periférico lo convierte a un voltaje análogo.


Para que haya comunicación entre los dos dispositivos se requiere un estándar común para que tanto el controlador como el periférico se entiendan . Las comunicaciones digitales se realizan con transmisiones de palabras en notación binaria . Estos bits de comunicación de 1 y 0 a menudo se organizan en grupos de ocho, conocidos como byte. Para mayor comodidad, los bytes se pueden organizar en dos números hexadecimales digitales . A menudo, se utilizan varios bytes para enviar datos de ida y vuelta entre el microcontrolador y el dispositivo periférico . Se pueden usar varios bytes para representar los datos de salida de los ADC, los voltajes de salida de los DAC o para enviar comandos y configuraciones al convertidor de datos .

 Mira el Video Relacionado con los conceptos básicos de la comunicación SPI


Las comunicaciones digitales pueden adoptar muchas formas, pero hay dos estructuras principales que se utilizan a menudo . Primero, las comunicaciones pueden ser paralelas donde se usa una línea para cada bit de datos. Por ejemplo, un solo byte se transmite a través de ocho líneas digitales paralelas a la vez. Segundo, las comunicaciones pueden ser en serie donde todos los bits de datos están en una sola línea digital . En una comunicación en serie , los bits se envían en fila, uno tras otro.


 Las comunicaciones en serie se usan más ampliamente en los dispositivos modernos , lo que reduce la cantidad de líneas de comunicación entre el controlador y el dispositivo periférico . Las figuras aquí muestran los datos que van del controlador al periférico , pero se requieren líneas separadas para transmitir datos desde el periférico de vuelta al controlador.

Diversos dispositivos electrónicos utilizan uno de los dos estándares de interfaz serial existentes, uno en el cual la interfaz serial SPI que utiliza 4 hilos o la interfaz serial I2C que emplea 2 hilos . Esta articulo trata sobre SPI y su implementación. La interfaz serial I2C se analiza en un artículo diferente.

 Las líneas que sirven para comunicar el dispositivo maestro y el esclavo, al ser datos binarios, 1 o 0, estos necesitan dos niveles de voltaje diferentes. Si el voltaje está cerca de 0 (tierra del circuito), el dato se decodifica como un 0 digital . Si el voltaje está cerca del voltaje de alimentación del circuito , la línea se decodifica como un 1 digital . Nota que tanto el controlador como el periférico necesitan ponerse de acuerdo en cuáles son estos niveles para que la comunicación se decodifique correctamente. Las salidas digitales deben diferenciarse lo suficientemente para decodificarse como un 1 digital o decodificarse como un 0 digital .

La hoja de datos define el voltaje de salida mínimo de nivel alto y el voltaje de salida máximo de nivel bajo para una salida digital . Además, la hoja de datos define el voltaje de entrada mínimo que define un nivel alto y el voltaje de entrada máximo que define un nivel bajo . Los estándares de comunicación definen estos niveles en función del voltaje del suministro digital . Si el controlador y los suministros digitales periféricos no coinciden , puede haber problemas con las comunicaciones. Es posible que se requiera un dispositivo de transforme el nivel de voltaje para unir las comunicaciones desde un nivel de suministro a otro. 


 Las comunicaciones también requieren una sincronización común entre el controlador y el dispositivo periférico . Los dos dispositivos deben estar de acuerdo en el tiempo, sabiendo cuándo el dispositivo periférico debe leer el nivel de voltaje para definir cuándo ocurre la transmisión de bits . A menudo, un reloj serial del controlador se utiliza para definir el momento de la comunicación. La lectura del bit puede ocurrir en los flancos ascendentes o descendentes del reloj serial. En este ejemplo, los datos se leen en el flanco descendente del reloj serial .

 

La  interfaz periférica serial , abreviado como SPI. Este tipo de interfaz tiene dos líneas de control. Un bus SPI puede controlar múltiples periféricos, pero solo puede haber un controlador . Además, hay dos líneas de datos. 

 Mira el video de los pines SPI

Los pines de usados en la comunicación SPI tienen diferentes funciones. El pin marcado como SS (Slave Select) es la selección de periférico o del esclavo . Esta línea se utiliza para seleccionar el dispositivo periférico para la comunicación. Si hay varios dispositivos en el bus SPI , cada dispositivo tiene su propia selección de periféricos . La selección de periféricos se usa a menudo como activo bajo, indicado por una barra superior. Cuando se selecciona el dispositivo , la selección de periféricos baja para activar la comunicación. Cuando el dispositivo no está seleccionado, la selección de periféricos se establece en alto. La selección de periféricos también se puede etiquetar como SSEL , CS,  bar, CE, nSS o SS#.

El pin SCLK es el reloj serial . Como se mencionó anteriormente , el controlador utiliza SCLK para sincronizar los datos enviados entre el controlador y el dispositivo periférico . El SCLK se origina en el controlador y se envía a todos los dispositivos periféricos . Es posible que este reloj en serie no siempre esté en operación y puede estar inactivo como una señal alta o baja . Los datos se registran en el controlador o periférico en el flanco ascendente o descendente del reloj en serie . La línea SCLK también puede etiquetarse como SCK .

MOSI (Main Out, Subnode In) es la salida del controlador , entrada del periférico . Esta línea se utiliza para enviar datos desde el controlador al dispositivo periférico . El dispositivo periférico lee la línea MOSI en función de la sincronización del SCLK. Nuevamente, esta línea puede tener diferentes nombres según el fabricante del dispositivo . En el dispositivo periférico , puede ser conocido como SIMO, SDI, DI, DN o SI. Si el dispositivo no está activo, ya que el controlador no ha seleccionado el dispositivo para estar activo con selección de periférico , esta línea está desactivada y el periférico no recibe datos en el pin MOSI .

MISO (main in, subnode out) es la entrada al controlador, salida del periférico. Esta línea se utiliza para enviar datos desde el dispositivo periférico al controlador. Si el controlador no ha seleccionado el dispositivo para que esté activo con selección de periféricos , esta línea se vuelve de alta impedancia, o Hi-Z, lo que permite un sistema con múltiples dispositivos compartir esta línea. El dispositivo periférico envía datos en la línea MISO y se sincroniza con el SCLK . En el dispositivo periférico , puede conocerse como SOMI , SDO, DO, DOUT o SO. Esta línea está conectada al dispositivo controlador en algún esquema serial etiquetado como SDI, DI o DN .

Como se mencionó anteriormente , los datos del controlador y el periférico se pueden leer en el flanco ascendente o descendente de SCLK . Además, la polaridad del reloj es importante para definir los flancos de entrada y salida en los que los datos entran y salen del dispositivo . Esto permite varios modos de comunicación SPI .

En el microcontrolador se configura la polaridad del reloj y la fase del reloj. El bit CPOL establece la polaridad de la señal de reloj durante el estado inactivo. El estado inactivo se define como el período en el que SS es alto y cambia a bajo para el comienzo de la transmisión y cuando SS es bajo y cambia a alto para indicar el final de la transmisión. El bit CPHA selecciona la fase del reloj. Dependiendo del bit CPHA, el flanco ascendente o descendente del reloj se usa para muestrear y/o desplazar los datos. En el microcontrolador se debe configurar la polaridad del reloj y la fase del reloj, según los requisitos del subnodo. Dependiendo de la selección de bits CPOL y CPHA, hay cuatro modos SPI disponibles. La Tabla 1 muestra los cuatro modos SPI.

 


 En Arduino la configuración de estos modos se realiza con cualquiera de los siguientes comandos:

setDataMode(SPI_MODE0);//clock normalmente LOW,muestreo en flanco subida

setDataMode(SPI_MODE1);//clock normalmente LOW,muestreo en flanco bajada

setDataMode(SPI_MODE2);//clock normalmente HIGH,muestreo en flanco subida

setDataMode(SPI_MODE3);//clock normalmente HIGH,muestreo en flanco bajada

 

Para los PIC utilizando CCS

#define SPI_MODE_0 (SPI_L_TO_H | SPI_XMIT_L_TO_H)

#define SPI_MODE_1 (SPI_L_TO_H)

#define SPI_MODE_2 (SPI_H_TO_L)

#define SPI_MODE_3 (SPI_H_TO_L | SPI_XMIT_L_TO_H)

En las figuras se muestran ejemplos de comunicación en los cuatro modos SPI. En estos ejemplos, los datos se muestran en la línea MOSI y MISO. El inicio y el final de la transmisión se indican mediante la línea verde punteada, el flanco de muestreo se indica en naranja y el flanco de desplazamiento se indica con la línea punteada en azul. Tenga en cuenta que estas cifras son solo para fines ilustrativos. Para comunicaciones SPI exitosas, los usuarios deben consultar la hoja de datos del dispositivo y asegurarse de que se cumplan las especificaciones de tiempo de los periféricos.

 Mira el video de explicación de los modos SPI

Modo SPI 0, CPOL = 0, CPHA = 0: CLK estado inactivo = bajo, datos muestreados en el flanco ascendente y cambiados en el flanco descendente. 

 

 

Modo SPI 1, CPOL = 0, CPHA = 1: CLK estado inactivo = bajo, datos muestreados en el flanco descendente y desplazados en el flanco ascendente.

 

 SPI Modo 2, CPOL = 1, CPHA = 0: CLK estado inactivo = alto, datos muestreados en el flanco ascendente y desplazados en el flanco descendente.

 


SPI Modo 3, CPOL = 1, CPHA = 1: CLK estado inactivo = alto, datos muestreados en el flanco descendente y desplazados en el flanco ascendente.

SPI se puede utilizar para comunicarse con varios dispositivos. Esto se puede hacer de dos maneras diferentes . Primero, debido a que SPI usa líneas de selección de periféricos , el controlador puede comunicarse con múltiples dispositivos. Cada periférico tiene su propio pin o puerto selección de periféricos proveniente del microcontrolador, mientras que las líneas restantes se comparten.

Mira el video de Buses SPI 

Para algunos sistemas, un solo SPI controla un periférico mientras que otros periféricos están conectados en cadena . En un sistema conectado en cadena , los SCLK y los pines de selección de periféricos pueden ser compartidos por todos los dispositivos. Sin embargo, el controlador se conecta a un solo MOSI, el del primer periférico . El MISO del primer dispositivo se conecta al MOSI del próximo periférico . Esto encadena todos los periféricos de un MISO al siguiente MOSI . Para el último dispositivo periférico , el MISO se conecta al controlador . Todos los datos de los dispositivos se pasan a través de la cadena y se recopilan al final del periférico final . No todos los dispositivos se pueden controlar y leer a través de una conexión SPI en cadena . Los dispositivos deben ser específicamente diseñado para esta comunicación.



0 comments:

Publicar un comentario