AleEirea97 / TP-Proyecto-Info-II

Repositorio para el Proyecto de Informática II 2020
MIT License
0 stars 0 forks source link

TP-Proyecto-Info-II

Repositorio para el Proyecto de Informática II 2020

Descripción:

El tema elegido para el proyecto es el Protocolo de Comunicación SPI.

PROTOCOLO DE COMUNICACIÓN SPI:

El Bus SPI (Serial Peripheral Interface) es un estándar de comunicaciones, usado mayormente para la transferencia de información entre circuitos integrados en equipos electrónicos, en distancias cortas y a alta velocidad, que aceptan un flujo de bits serie regulado por un clock.
Bajo el uso de este protocolo, el equipo que maneja el clock es conocido como Master y cualquier equipo que sea habilitado por él para establecer una comunicación será nombrado como Slave.

Operación:

El SPI es un protocolo sincrónico. La sincronización y la transmisión de datos se realizan por medio de 4 señales:

SPI con un Slave Figura I: Conexión SPI para un Slave.

SPI con múltiples Slaves Figura II: Conexión SPI para múltiples Slaves.

La Cadena de bits es enviada de manera sincrónica con los pulsos del clock, es decir con cada pulso, el Master envía un bit. Para que empiece la transmisión el Master baja la señal SSTE o SS/Select a nivel bajo, con esto el Slave se activa y empieza la transmisión, con un pulso de clock al mismo tiempo que el primer bit es leído.

Modos del SPI:

Existen 4 diferentes modos en los que el Protocolo SPI puede ser inicializado. Esto es: los pulsos del clock pueden estar programados de manera que la transmisión del bit se realice de 4 maneras distintas. Los modos son determinados por el estado de:

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:

Ejemplo de Comunicación

Diagrama de Estados:

Se plantea un diagrama de estados del sistema tratado.

Ejemplo de Comunicación

La máquina será simulada con 2 modos disponibles: Modo 0 y Modo 2. Los estados son:

Flags (Banderas) a utilizar:

Código: main.c -- SWITCH CASE:

#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: main.c -- PUNTERO A FUNCIONES:

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;
}