Comunicación serial SPI «botones y leds», Pic C Compiler
Por
/
En esta sección aprenderás a realizar una comunicación serial SPI con dos microcontroladores PIC. El objetivos es enviar comandos por el puerto SPI a un microcontrolador PIC para que encienda diferentes LED´s.
Comunicación serial SPI
SPI (Serial Peripheral Interface) es un protocolo de comunicación serial sincrónica que se utiliza para la transferencia de datos entre dispositivos electrónicos. Se compone de una sola línea de reloj de sincronización (SCLK) y dos líneas de datos: MOSI (Master Output Slave Input) y MISO (Master Input Slave Output).
En una comunicación SPI, un dispositivo maestro envía comandos y datos a uno o varios dispositivos esclavos, y los dispositivos esclavos responden con los datos solicitados. El maestro controla la comunicación estableciendo la frecuencia de reloj y eligiendo el dispositivo esclavo con el que quiere comunicarse mediante una línea de selección de esclavos (SS).
Los dispositivos que se comunican a través de SPI deben estar configurados para trabajar en la misma velocidad de reloj y tener los mismos ajustes de formato de datos, como la longitud de la palabra de datos y la polaridad y fase del reloj.
SPI se utiliza comúnmente en sistemas embebidos, especialmente en aplicaciones que requieren alta velocidad de transferencia de datos y baja complejidad de hardware. Algunos ejemplos de dispositivos que utilizan SPI son sensores, controladores de pantalla, tarjetas de memoria, entre otros.
Circuito de conexión
Programación PIC de Maestro
Inicialmente se establecen los parámetros de la comunicación SPI.
Para enviar un comando el PIC esclavo inicialmente se envía un pulso de bajada, seguido del comando y para finalizar la transmisión se envía un pulso de subida.
Para enviar el comando correspondiente solo cuando cambie de estado el botón, es decir cuando esta pulsado y cuando no esta pulsado se utilizan las variable para registrar el estado anterior del botón y solo cuando el estado actual sea diferente del estado anterior se enviara un nuevo comando.
Cuando se recibe un comando se habilita la interrupción y se aloja en la sub-rutina «recibe()», donde se realiza la lectura del comando recibido con «spi_read()» y finalmente el comando recibido se guarda en la variable «dato».
#INT_SSP
void recibe()
{
dato = spi_read();
return;
}
Se utiliza una sentencia switch para realizar una instrucción dependiendo del comando recibido.
void led()
{
switch (dato)
{
case 0x01:
OUTPUT_BIT(LED1,1);
break;
case 0x02:
OUTPUT_BIT(LED1,0);
break;
case 0x03:
OUTPUT_BIT(LED2,1);
break;
case 0x04:
OUTPUT_BIT(LED2,0);
break;
case 0x05:
OUTPUT_BIT(LED3,1);
break;
case 0x06:
OUTPUT_BIT(LED3,0);
break;
default:
break;
}
return;
}
Una vez recibido el comando y realizado la instrucción correspondiente el programa regresa a la función «main()» donde espera a recibir un nuevo comando por el puerto SPI.