Solución - EtxeSare

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