SISTEMAS ELECTRÓNICOS DIGITALES 6. MÓDULOS DE COMUNICACIONES SERIE Ejercicio 6.1 Ejemplo de comunicación SPI La tarjeta Explorer16 incorpora un pequeño chip de memoria EEPROM con comunicación serie SPI del tipo 25LC256 de 32 Kbytes de capacidad. Este módulo, que en esta tarjeta está conectado al módulo de comunicaciones SPI2 del PIC24FJ128, responde a una serie de comandos de 8 bits, tal y como se describe en la hoja de características del dispositivo: El modo de funcionamiento del protocolo SPI de esta memoria también se describe en el mismo documento: 1 SISTEMAS ELECTRÓNICOS DIGITALES P1: Según esta información, ¿qué valores tendrían los bits de configuración del modo de operación del bus CPHA y CPOL? ¿En qué modo trabaja este bus SPI? ¿A, B, C o D? Entonces, cómo hay que configurar los bits CKE y CKP del registro SP2CON1 del PIC24F? R1: El bus SPI2 trabajará en modo maestro (la EEPROM será el esclavo) Se usarán SDI2 y SDO2, ya que le memoria usa las dos conexiones de datos. No usaremos /SS2, que conectaremos a un bit del puerto D (RD12). Configuraremos, por tanto, la conexión con los 4 hilos. SPI2CON1:CKE = 1 (Cambios en flanco de bajada, activo a idle) SPI2CON1:CKP = 0 (Clock activo a nivel alto) P2: Por tanto, si el PIC24F va a ser usado como maestro, y si consideramos que utilizaremos los factores de escala por defecto del módulo (1:64 y 1:8 para un total de 1:256) ¿con qué valor configuraremos el registro SP2CON1? R2: SP2CON1 = 0000 0001 0010 0000; // 0x0120 | |||| |||____-| |||| ||| | | | |||| ||| | Segundo prescaler 64:1 | |||| ||| Segundo prescaler 8:1 | |||| ||Modo maestro | |||| |Reloj activo a nivel alto | |||| Modo esclavo desactivado | |||Cambios en flanco de bajada (activo a idle) | ||Lee el bit en medio del tiempo de bit | |Comunicación de tamaño byte (palabra de EEPROM) | SDO2 controlado por el módulo Internal clock enabled P3: Escribe el valor del registro SPI2STAT necesario para activar el módulo. R3: SPI2STAT = 1010 0000 1011 1000; // 0xA0B8 ---| | | | | | | | | Modo de interrupción: p.ej. TX FIFO empty | | | Buffer de recepción vacío (modo “EB”) | | Activa “SR empty” (modo “enhanced buffer”) | Desactiva el módulo en modo idle Activa el módulo y configura SCK2, SDO2, SDI2 y /SS2 Consulta en la hoja de características del PIC24F en qué pines se encuentran los terminales del bus SPI2 y anótalo: SDI2: 5, SDO2: 6, SCK2: 4, /SS2: 8. 2 SISTEMAS ELECTRÓNICOS DIGITALES Por otro lado, en la hoja de características del Explorer16 podemos ver cómo está conectado el chip de la EEPROM: Podemos ver que el pin CS (chip select), está conectado al pin RD12 del PIC, así que debemos configurarlo como pin de salida para poder habilitar la comunicación con la memoria (poniendo este bit a cero). Con esto ya podríamos escribir el código de inicialización del módulo SPI y escribir una pequeña función para transferir datos entre el PIC y la EEPROM: // Inicializar módulo SPI2 _TRISD12 = 0; _RD12 = 1; SPI2CON1 = 0x0120; SPI2STAT = 0xA0B8; // // // // Bit 12 de PORTD: Bit 12 de PORTD: Configuración de Configuración de salida 1 (¿?) P2 P3 // Enviar un byte de datos y recibir un byte al mismo tiempo int writeSPI2 ( int data); { SPI2BUF = data; // Escribimos “data” en el // buffer de salida while (! SPI2STATbits.SPIRBF); // Esperamos que se llene // el buffer de entrada return SPI2BUF; // Vuelve con el dato // recibido } P4: Comenta cada línea del código anterior y explica el funcionamiento de la función “writeSPI2” R4: Inicializa el bit 12 del puerto D como salida y pone un 1 en él (al conectarlo a la EEPROM del Explorer 16, esta memoria se selecciona con un 0 en RD12). Ahora ponemos el dato “data” en el registro de transmisión, con lo que de forma automática se inicia la transmisión; al mismo ritmo (el reloj lo pone el PIC24, que es maestro) se va (puede ir) recibiendo otro dato, que va entrando por el bit más bajo (0), mientras el que transmitimos va saliendo por el bit más alto (15). Según lo expuesto hasta ahora, la secuencia de lectura de datos de la EEPROM sería como se indica en la siguiente figura: 3 SISTEMAS ELECTRÓNICOS DIGITALES Supongamos que queremos escribir programa que nos permita leer el registro de estado (status register) de la EEPROM. Así, enviar un comando a la EEPROM requiere al menos de los siguientes pasos: 1- Activar la memoria, poniendo el pin CS a cero. 2- Enviar la instrucción de 8 bits en serie hacia la salida. 3- Ejecutar algunas acciones adicionales según el tipo de comando enviado. 4- Desactivar la EEPROM poniendo el pin CS a 1, de forma que el dispositivo pase a un modo de bajo consumo (stand-by); La función principal del programa podría ser como sigue: main () { int i; // Inicializar módulo SPI2 _TRISD12 = 0; _RD12 = 1; SPI2CON1 = 0x0120; SPI2STAT = 0xA0B8; _RD12 = 0; i = writeSPI2(5); _RD12 = 1; } // // // // // // Verificar el estado de la EEPROM Seleccionamos (activamos)la EEPROM Envía el comando (0x05) y espera a recibir la respuesta, que coloca en el return i recibimos en i Desactiva la EEPROM P5: Comenta cada línea del código anterior y explica el funcionamiento de la función “main” R5: Configuramos el puerto PORTD como salida (y activamos el bit 12 a 1) y el módulo SPI2. A continuación, activamos la memoria EEPROM (RD12 a 0) y enviamos el dato “5”, que es el comando para leer el registro de estado de la memoria (RDSR), y, cuando la rutina anterior recibe el byte esperado, lo pone en el “return”, para que lo recibamos en “i”. Para terminar, desactivamos le EEPROM (RD12 a 1), para que quede es estado de bajo consumo. 4
© Copyright 2024