Curso sobre Microcontroladores Familia HC9S08 de Freescale Por Ing. Daniel Di Lella – EduDevices – www.edudevices.com.ar e-mail: [email protected] Capítulo 7.Módulo Serial Sincrónico de Comunicaciones – SPI. Serial Peripheral Interface. Continuación ... Ejemplo Práctico SPI01. Introducción Quienes hayan empleado el Edukit08 con la familia HC908 recordarán la comunicación SPI que podía establecerse con en el microcontrolador Q. Esa comunicación nos permitía 2 operaciones: modificar los parámetros de una señal PWM y leer una tabla guardada en memoria no volátil. Emplearemos la comunicación SPI con este último fin. Puesto que esa tabla tiene guardado un grupo de caracteres en ASCII que forman una frase, mostraremos los caracteres recibidos en el LCD para que se nos despliegue el mensaje. Configuración del módulo SPI Apelamos otra vez al Processor Expert, esta vez para iniciar el módulo SPI: Entre las categorías más relevantes destacamos: • Buad rate Prescaler: La señal de reloj del módulo, en modo master, es tomada del reloj del bus interno. Este parámetro actúa como prescaler de esta señal de reloj. En nuestro caso elegimos una tasa de división de 8 • Baud rate Devisor: También puede interpretarse como un prescaler. En combinación con el anterior podemos generar una gran variedad de frecuencias de reloj para el módulo SPI. Adoptamos la tasa de división más elevada: 256. • Mode Select: Puede Master o Slave. Ello depende de que papel juegue el microcontrolador dentro de la comunicación SPI. En el caso del Edukit08 el MC9S08AW60 hace las veces de master y el microcontrolador Q de slave. • Clock Polarity y Clock Phase: Clock polarity en active-high y clock phase en second edge nos garantizan que se validen los bits durante los flancos ascendentes, como lo muestra el siguiente gráfico: Descripción de la comunicación con el Q La comunicación con el microcontrolar Q se efectúa empleando una interfaz SPI. Para completar esta comunicación SPI se deben enviar 3 Bytes. Recordemos que siempre el microcontrolador MC9S08AW60 se comporta como master y el Q como esclavo. Los 3 Bytes que intervienen es esta transacción, para la lectura de la información almacenada en el Q, tienen la siguinte función: • Byte 1: Es igual a $10. Consiste en el comando de lectura. • Byte 2: Dirección. Es un índice a la tabla guardada en el Q. • Byte 3: Es un Byte ficticio que utilizamos para generar los 8 pulsos de reloj que nos permitan rescatar el valor de la tabla del microcontrolador Q. A partir de estas precisiones podemos comprender la subrutina spi_trans: Spi_trans: Esp_spi: LDA BCLR STA byte_tx SS_BIT,SS_PORT SPI1D NOP BRCLR SPIS_SPRF,SPI1S,esp_spi BSET LDA STA SS_BIT,SS_PORT SPI1D byte_rx RTS En primer lugar cargamos en el acumulador el contenido de la variable byte_tx para luego transmitirlo. Ponemos a nivel bajo la salida SS_BIT ; ellas sirve para indicar al dispositivo SPI, el microcontrolador Q en este caso, que debe prepararse para una comunicación. Quedan así satisfechas las condiciones para iniciar la comunicación. Es entonces cuando volcamos el acumulador en el registro SPI1D provocando la transmisión de un byte por SPI. Sabemos que toda transmisión por un módulo SPI implica a su vez una recepción, por lo cual dispondremos de un byte recibido cuando el bit SPRF sea “1”. Por tal motivo hacemos polling sobre este bit hasta que logre el estado “1”. Aquí rescatamos el resultado leyendo el registro SPI1D, que cumple una doble función según se lo emplee para lectura o para escritura: • Si se escribe sobre el registro SPI1D se produce la transmisión por SPI del byte escrito. • Si se lee el registro SPI1D se lee el último byte recibido en este módulo. También bajamos la salida S_BIT para indicar al dispositivo externo, el microcontrolador Q en este caso particular, que la transección a concluido. Claro que la subrutina spi_trans solo nos permite el intercambio de un byte. Si queremos aplicarla al Edukit08, deberemos invocarla 3 veces como podemos observar en el programa: LDA STA #$10 byte_tx JSR spi_trans JSR demora_100us LDA STA direccion byte_tx JSR spi_trans JSR demora_100us LDA STA #$0 byte_tx JSR spi_trans El primer byte que enviamos es el $10, que corresponde al comando de lectura de la tabla del Q. Descartamos el byte que llega por SPI hasta el HCS08 pues no cumple función alguna. El segundo byte enviado corresponde al indice a la tabla que pretendemos leer. También desechamos el byte que nos llega desde el Q. El tercer byte es un $0 y no cumple una función en especial. Su utilidad reside en que su transmisión obliga a recibir un byte del Q, que es lo que realmente nos importa, y de esta manera obtenemos el valor proveniente de tabla. Dicho byte queda almacenado en la variable byte_rx para su posterior uso. Analicemos ahora, en líneas generales, el funcionamiento del programa. Luego de iniciar el LCD, la ejecución del programa queda congelada hasta tanto el usuario oprima el pulsador SW1: InI: BRSET SW1_BIT,SW1_PORT,ini JSR demora_100us LDA #$10 STA byte_tx JSR spi_trans JSR demora_100us LDA direccion STA byte_tx JSR spi_trans JSR demora_100us LDA #$0 STA byte_tx JSR spi_trans JSR antirrebote Al ser oprimido SW1 se da lugar a la comunicación SPI, en los términos explicados, obteniendo por resultado la lectura de una posición de la tabla guardada en el microcontrolador Q. La variable direccion brinda el índice a esa tabla y el byte leído queda almacenado en la variable byte_rx. Los efectos de los rebotes mecánicos del pulsador son suprimidos con la demora edecuada. El siguiente paso es mostrar la información laida en el LCD. Dado que la tabla en el Q contiene letras que forman un texto, lo lógico es mostrar este texto en el LCD. La única prevención será que no excedamos los 16 caracteres que caben en un renglón del LCD, en cuyo caso limpiaremos el renglón: La variable posición es la encargada de controlar que haya menos de 17 caracteres en el renglón del LCD. Si esto ocurriera, la ejecución del programa se dirige a la línea ciclo_2 donde escribimos 16 espacios para limpiar el renglón. No podemos emplear el comando de limpiar el LCD pues estamos utilizando el primer renglón para mostrar la dirección de la tabla a la cual estamos accediendo. De una u otra manera la ejecución del programa termina llegando a la línea ciclo_4 donde se presenta en pantalla la dirección accedida del LCD y el carácter obtenido por SPI. Y luego de todo esto el programa vuelve a consultar el pulsador SW1. 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 )