Curso sobre Microcontroladores Familia HC9S08 de Freescale Por Ing. Daniel Di Lella – EduDevices – www.edudevices.com.ar e-mail: info@edudevices.com.ar Capítulo 7.Módulo Serial Sincrónico de Comunicaciones – SPI. Serial Peripheral Interface. Dentro de las comunicaciones seriales, el módulo SPI (Serial Peripheral Interface) constituye un módulo importante para las comunicaciones dentro del ámbito de un sistema microcontrolado. Como se ha visto durante el curso teórico de la familia HC908, tanto la interface de comunicación SPI como la I2C (Inter – Integrated Circuit) han sido diseñadas para lograr comunicaciones sincrónicas (señal de reloj explícita) de alta velocidad y de corta distancia (dentro del ámbito de un sistema microcontrolado o placa PCB) con alta eficiencia. El módulo SPI de la familia HC9S08 es, en muchos aspectos, muy similar al implementado en la familia HC908, pero incorpora nuevas características que permiten mayor flexibilidad en el uso de este módulo. Veamos a continuación un resumen de las mismas. Características: • • • • • • • • Operación Full Duplex a 2 hilos. Modos de operación MASTER y SLAVE. Máxima frecuencia en modo MASTER = FBUS / 2. Máxima frecuencia en modo SLAVE = FBUS / 4. Modo especial Bidireccional de comunicación “Single Wire” (1hilo). Selección de desplazamiento MSB primero o LSB primero. Selección de fase y polaridad del reloj para distintos dispositivos SPI. Interrupciones separadas de TX / RX . Aplicaciones típicas: • Comunicación serial sincrónica con periféricos externos como conversores A/D de alta resolución, memorias externas EEPROM, MCUs de otras placas del sistema. • Procesamiento distribuido entre MCU principal y MCU´s esclavos del sistema. Configuración SPI MASTER – SLAVE. El módulo SPI está construido alrededor de un registro de desplazamiento (Shift Register) doble “buffered” (con doble almacenamiento) con ambos extremos del shif register disponibles como líneas exteriores. Una de las líneas del shift register está conectada al pin MISO (Master In –Slave Out). Este pin oficia como entrada de datos del módulo configurado como MASTER y como salida de datos para el módulo configurado como SLAVE. La otra línea conectada al pin MOSI (Master Out – Slave In) oficia en forma inversa, o sea como salida de datos para el módulo configurado como MASTER y como entrada de datos para el módulo configurado como SLAVE. El CPU comienza una transferencia SPI por medio de la escritura de un byte de datos en el registro de datos del transmisor del módulo SPI MASTER (SPID). La totalidad de los 8 bits de datos serán transferidos en forma automática por el pin MOSI sincronizados por medio de la señal de reloj SPSCK del dispositivo MASTER. De esta forma, por cada bit que es enviado al exterior por el pin MOSI, un bit ingresa al shift register desde el pin MISO. Esto permite realizar comunicaciones FULL DUPLEX con solo 8 pulsos de clock (8 Bits del MASTER y 8 Bits del SLAVE con solo 8 clocks). Como se vio durante el curso teórico de la familia HC908, la línea “SS (negada)” (Slave Select) funciona de forma distinta para el módulo configurado como MASTER (amo) o para el módulo configurado como SLAVE (esclavo). Para el módulo configurado como Amo, la línea SS (negada) debe conectarse a +VDD para indicar por hardware que el dispositivo se usará en configuración AMO antes de configurar por medio de los registros de configuración el módulo como AMO. Aunque esta acción parezca redundante, es fundamental para garantizar el funcionamiento de la red en configuraciones del tipo “Multi – Masters”, en donde más de un dispositivo puede asumir el rol de “Master” en algún momento de la comunicación. El funcionamiento de este tipo de configuración se ha explicado en detalle en el curso teórico de la familia HC908 y dejamos para el lector el repaso de dichos conceptos. Para el módulo configurado como “Esclavo”, la línea SS (negada) funcionará como línea de selección del dispositivo SPI esclavo a comunicar. Cuando la línea SS (negada) de un dispositivo esclavo es forzada a 0V (“0” lógico), este dispositivo es seleccionado para establecer la comunicación con el dispositivo “Amo”. Cuando la línea SS (negada) es forzada a + VDD, el dispositivo “esclavo” está deshabilitado para la comunicación y pone a las líneas MISO / MOSI / SPSCLK en alta impedancia. Cabe recordar que en una comunicación SPI de más de un dispositivo esclavo, las líneas MISO / MOSI / SPSCK estarán conectadas en “paralelo” con cada uno de los dispositivos SPI, formado un “BUS” de comunicaciones de 3 hilos. Las líneas SS (negada) de cada uno de los dispositivos esclavos deben ser controladas por el MCU “Amo” de forma tal de que solo 1 (un) dispositivo esclavo esté habilitado por vez. Los dispositivos esclavos no habilitados estarán en estado de alta impedancia (Tri – State) conectados al bus SPI y no formarán parte de la comunicación. Registros de Control del SPI (SPI Control Registers). Registro de Control 1 – SPIC1. Veamos bit por bit el registro de control 1 del SPI. SPIE: Este bit de lectura / escritura habilita / deshabilita la generación de pedidos de interrupción al CPU por parte del módulo SPI. Existen dos tipos de fuentes de generación de pedidos de interrupción, una de ellas es cuando el buffer de recepción del módulo está lleno y la otra es cuando se generan pedidos ante errores de la comunicación. Cuando el bit SPIE es puesto a “1”, se generará un pedido de interrupción por hardware cuando se cumpla la condición de “buffer lleno de recepción” (flag SPRF = 1) en el registro de estados del módulo (SPIS) o cuando la línea SS (negada) del dispositivo AMO (master) se fuerza a “0” lógico causando el modo “falla” (Mode fault, flag MODF = 1). SPE: El bit SPE (SPI System Enable) permite encender o apagar el módulo SPI. Cuando SPE = 0, se deshabilita el módulo SPI, se detiene cualquier transferencia que esté en curso, se limpia el buffer de datos y se inicializan las máquinas de estado internas. El flag SPRF se limpia y el flag SPTEF (SPI Transmit Data Buffer Empty Flag) en el registro de estados SPIS es forzado a “1” indicando que ambos buffers están vacíos. SPTIE: El bit SPTIE (SPI Transmit Interrpt Enable) de lectura / escritura permite generar el pedido de interrupción al CPU cuando un byte es transferido desde el registro de datos al shift register. MSTR: El bit MSTR (Master / Slave Mode Select) permite seleccionar entre el modo de funcionamiento “Master” o “Slave” del módulo SPI. Si MSTR = 1, el módulo se configurará como “Master”. Si MSTR = 0, el módulo lo hará como “Slave”. CPOL: Este bit (Clock Polarity) permite configurar la “polaridad” de la línea SPSCK durante la transmisión de un dato. En realidad, este bit permite deshabilitar / habilitar un inversor lógico en la línea de reloj lo que le permite adaptarse a las polaridades de los distintos dispositivos. Recordemos que para efectuar una comunicación SPI ambos dispositivos tienen que tener idéntica polaridad. CPHA: El bit CPHA (Clock Phase) permite controlar la relación de tiempos (timing) entre la señal de reloj y la señal de datos, o lo que se denomina “fase del clock”. Recordemos que para efectuar una comunicación SPI ambos dispositivos tienen que tener idéntica fase. SSOE: El bit SSOE (Slave Select Output Enable) se usa en combinación con el bit de habilitación del modo de falla (MODFEN) en el registro de control 2 y con el bit MSTR para determinar la función de la línea SS (negada). LSBFE: El bit LSBFE (Least Significant Bit First Enable) permite seleccionar la dirección de desplazamiento de los datos del shift register del módulo. Si LSBFE = 1, configura al módulom SPI para que la transferencia de datos comience con el bit menos Significativo (LSB). Si LSBFE = 0, se configurará para comenzar con el bit más significativo (MSB). Registro de Control 2 – SPIC2. Veamos bit por bit el registro de control 2 del SPI. MODFEN: El bit MODFEN (Master Mode – Fault Function Enable) junto con el bit SSOE y el bit MSTR determinan como se usará la línea SS (negada) en el módulo SPI. La tabla superior muestra como las distintas combinaciones de los bits mencionados le asignan distintas funciones a la línea SS (negada). Como se puede ver, cuando el módulo SPI es configurado en modo Esclavo (Slave), el bit MODFEN no tiene efecto sobre la línea SS (negada). BIDIROE: El bit BIDIROE (Bidirectional Mode Output Enable) se utiliza cuando el módulo SPI se configura en el modo bidireccional de un solo hilo (Bidirectional Single Wire Mode) y sirve para habilitar la línea I/O SPI a un solo hilo como salida. Cuando BIDIROE = 0, la línea actúa como entrada y cuando BIDIROE = 1, actúa como salida. Dependiendo de si el módulo SPI es configurado como Master o como Slave la línea bidireccional de datos I/O puede ser la MOSI (ahora como MOMI) o la MISO (ahora como SISO) respectivamente. SPISWAI: El bit SPISWAI (SPI Stop in Wait Mode) es un bit de lectura / escritura que se utiliza para mantener al reloj “corriendo” o detenido en el módulo de SPI cuando el MCU entra en un estado WAIT. Si SPISWAI = 1, el clock del SPI se detiene cuando el microcontrolador entra en modo WAIT. Esto permite un considerable ahorro de energía si se tiene pensado no utilizar el módulo SPI durante el estado WAIT del MCU. SPCO: El bit SPCO (SPI Pin Control) permite seleccionar el modo de salida del módulo SPI entre “Single Wire Bidirectional Mode” o “Full Duplex Mode”. Si SPCO = 1, el modo de salida es el de Single Wire. SPI Baud Rate Register (SPIBR). El registro SPIBR (SPI Baud Rate Register) es el utilizado para configurar la velocidad de comunicación SPI solo en el modo Master, ya que como es sabido, el nodo “Master” de una red de comunicaciones SPI es el único responsable de fijar la velocidad de comunicación debido a que este nodo es el que “impone” el reloj (SPSCK) al resto de los nodos que constituyen la red SPI. Con este registro se configuran el valor del “prescaler” y el divisor de Baud Rate para establecer el valor final del reloj SPSCK que regirá la comunicación. En modo “Slave” (esclavo) este registro no tiene efecto alguno sobre la velocidad de comunicación. A continuación describiremos cada uno de los bits que constituyen el registro. SPPR2/SPPR1/SPPR0: Estos tres bits son los utilizados para establecer el valor del divisor del pre –escaler (1 de los 8 valores posibles). La salida del pre-escaler ingresa al divisor de Baud Rate del módulo SPI. SPR2/SPR1/SPR0: Estos tres bits son los utilizados para establecer el valor del divisor de la señal de reloj proveniente del pre-escaler, y por ende, fijar el Baud Rate según la siguiente ecuación: La ecuación muestra como con los bits de los campos SPPR[2:0] y SPR[2:0] se puede determinar la velocidad de comunicación o Baud Rate del módulo SPI Master. A continuación se detallan las tablas con los diferentes valores de configuración del registro y los valores de división del pre – escaler y divisor de Baud Rate. Continuará ....... Nota de Redacción: El lector puede descargar este capítulo y capítulos anteriores del curso desde la sección “Artículos” (Curso_HC9S08) en el sitio web de EduDevices (www.edudevices.com.ar )