Repositorio para el Proyecto de Informática II 2020
El tema elegido para el proyecto es el Protocolo de Comunicación SPI.
El SPI es un protocolo sincrónico. La sincronización y la transmisión de datos se realizan por medio de 4 señales:
SCLK (Clock): Es el pulso que marca la sincronización. Con cada pulso de este reloj, se lee o se envía un bit. También llamado TAKT (en alemán).
MOSI (Master Output Slave Input): Salida de datos del Master y entrada de datos al Slave. También llamada SIMO o SDI (Slave Data In) en el equipo Slave.
MISO (Master Input Slave Output): Salida de datos del Slave y entrada al Master. También conocida por SOMI o SDO (Slave Data Out) en el equipo Slave.
SS/Select: Para seleccionar un Slave, o para que el Master le diga al Slave que se active. También llamada SSTE o CS (Chip Select) en el equipo Slave.
Figura I: Conexión SPI para un Slave.
Figura II: Conexión SPI para múltiples Slaves.
MODO 0: CPOL = 0 / CPHA: 0 -> 1. El clock se inicializa en nivel bajo y la trasmisión se realiza cuando pasa a nivel alto (Flanco de Subida).
MODO 1: CPOL = 0 / CPHA: 1 -> 0. El clock se inicializa en nivel bajo y la trasmisión se realiza cuando pasa de nivel alto a nivel bajo (Flanco de Bajada).
MODO 2: CPOL = 1 / CPHA: 1 -> 0. El clock se inicializa en nivel alto y la trasmisión se realiza cuando pasa a nivel bajo (Flanco de Bajada).
MODO 3: CPOL = 1 / CPHA: 0 -> 1. El clock se inicializa en nivel alto y la trasmisión se realiza cuando pasa de nivel bajo a nivel alto (Flanco de Subida).
La siguiente imagen muestra un ejemplo de una comunicación usando el Modo 0:
Se plantea un diagrama de estados del sistema tratado.
La máquina será simulada con 2 modos disponibles: Modo 0 y Modo 2. Los estados son:
init_t: Estado inicial de la máquina. Configura al Master con el modo a utilizar para la trasmisión y la cantidad y habilitación de los Slaves utilizados.
MOSI: Estado del equipo Master. Se encarga de trasmitir al equipo Slave bit a bit de forma sincrónica con la señal de clock. Se trasmitirá 1 byte, o sea 8 veces.
SDI: Estado del equipo Slave. Se encarga de recibir la trasmisión del MOSI del Master de forma sincrónica con la señal de clock.
SDO: Estado del equipo Slave. Se encarga de trasmitir al equipo Master bit a bit de forma sincrónica con la señal de clock. Se trasmitirá 1 byte, o sea 8 veces.
MISO: Estado del equipo Master. Se encarga de recibir la trasmisión del SDO del Slave de forma sincrónica con la señal de clock.
config_t: Configuración del equipo Master.
MHab_t: Habilitación pare trasmitir al equipo Slave configurado.
SHab_t: Indicación desde el Slave utilizado al Master que va a responder.
clock_fby: Indicación de fin de ciclo de clock (El byte se ha trasmitido completamente) para pasar de estados de trasmisión a estados de recepción.
#include "bspi.h"
int main(){
bspi_t master[1] = {}; //MASTER
bspi_t slaves[3] = {}; //SLAVES.
resp_st_t status = {};
init_t(&master,status, &slaves); //MASTER configurado.
while(1){
switch (status.estado){
case MOSI: status = f_MOSI(status, &master);
break;
case SDI: status = f_SDI(status, &master, &slaves);
break;
case SDO: status = f_SDO(status, &master, &slaves);
break;
case MISO: status = f_MISO(status, &master);
break;
}
}
return 0;
}
Código final con el uso de Puntero a funciones.
#include "bspi.h"
int main(){
bspi_t master[1] = {};
bspi_t slaves[3] = {};
resp_st_t status = {};
init_t(&master,status, &slaves);
resp_st_t (*BSPI[4])(resp_st_t, bspi_t*, bspi_t*) = { f_MOSI, f_SDI, f_SDO, f_MISO };
while(1){
status = ( *BSPI[status.estado] )(status,&master,&slaves);
}
return 0;
}