4-Maestro-Esclavo ( SPI )

Este proyecto consiste en comunicar dos PIC 18F4550 mediante el Bus SPI, haciendo que uno actúe como maestro y otro como esclavo.


El bus interfaz con periféricos serie (SPI) fue desarrollado originalmente por Motorola a finales de los 80 en los microcontroladores serie 68000. Hoy en  día se puede encontrar en teléfonos móviles, PDA, etc,  para comunicar la CPU con los distintos periféricos.


El Bus SPI es un bus de tres líneas sobre el que se transmiten paquetes de información de 8bits. Cada dispositivo conectado al bus puede funcionar como transmisor y receptor al mismo tiempo, este tipo de comunicación se denomina full dúplex.


Hay dispositivos que solo son transmisores y otros solo receptores. Algunos, como las memorias EEPROM, son transmisores y receptores.

Los dispositivos conectados se pueden dividir en maestros y esclavos.

Los maestros son los que inician la transferencia de información y generan las señales de reloj y control.

Los esclavos son los dispositivos controlados por el maestro.

El bus utiliza las siguientes líneas:

Master Out - Slave In (MOSI): Conexión para la entrada de datos serie.

Master in- Slave out (MISO): Conexión para la salida de datos.

Clock (SCLK): Señal de reloj.

Slave select (SS): Selección.



Con respecto al I2C, el SPI alcanza velocidades muy superiors al utilizer lineas independientes de transmission y recepción.

En los PIC18 el SPI puede alcanzar frecuencias de 12 Mhz frente a 1Mhz del I2C.

La ventaja del I2C es que solo utiliza dos líneas, la de datos y la de reloj ( Sin contar GND) independientemente de los esclavos que tengas conectados dado que se seleccionan por software, por el contrario el SPI utiliza tres líneas para comunicarse y otra más para seleccionar.

Para esta practica hay que hacer dos programas por separados, uno para maestro y otro para esclavo.

El esclavo mostrará en un Display 7 segmentos las letras “ ‘J’  ‘O’  ‘S’ ‘E’  “ en intervalos de un segundo de forma continua.

PROGRAMA MAESTRO:

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////
//   AUTOR: José Antonio Pelayo                                        NOVIEMBRE/2011
////////////////////////////////////////////////////////////////////////////////////
//   PROGRAMA:    Comunicación SPI                      VERSIÓN:    1.0
//   DISPOSITIVO: PIC 18F4550                           COMPILADOR:    CCS vs4.109
//   Entorno IDE: MPLAB                                 SIMULADOR:    Proteus 7.7 sp2
//   TARJETA DE APLICACIÓN: ___                         DEBUGGER:    ICD3

/////////////////////////////////////////////////////////////////////////////////                            
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
//       
//       
// Comunicar dos microcontroladores mediante el bus SPI(Maestro)
////////////////////////////////////////////////////////////////////////////////////
 #include <18f4550.h>
 #fuses INTHS                     //Selecciona el oscilador interno
 #use delay(internal=4000000)        //poner el oscilador interno a 4Mhz
///////////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES                                                            //
///////////////////////////////////////////////////////////////////////////////////



char taBCD[]=0b0001110,0b0111111,0b1101101,0b1111001;////Escribe Jose
int contador;



///////////////////////////////////////////////////////////////////////////////////


void main()
{
setup_spi(spi_master | spi_l_to_h | spi_clk_div_16);//Habilito como maestro
for(;;)
{
for(contador=0;contador<4;contador++)//for para ir recorriendo el array
{
spi_write(taBCD[contador]);//Envio por SPI el array
delay_ms(1000);
}
contador=0;//Reinicio el for y consecuentemente la posición en el array
}
}


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

PROGRAMA ESCLAVO:

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////
//   AUTOR: José Antonio Pelayo                                       NOVIEMBRE/2011
////////////////////////////////////////////////////////////////////////////////////
//   PROGRAMA:    Comunicación SPI                       VERSIÓN:    1.0
//   DISPOSITIVO: PIC 18F4550                           COMPILADOR:    CCS vs4.109
//   Entorno IDE: MPLAB                                 SIMULADOR:    Proteus 7.7 sp2
//   TARJETA DE APLICACIÓN: ___                         DEBUGGER:    ICD3

/////////////////////////////////////////////////////////////////////////////////                            
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
//       
//  Comunicar dos microcontroladores mediante el Bus SPI (esclavo)    
////////////////////////////////////////////////////////////////////////////////////
 #include <18f4550.h>
 #fuses INTHS                     //Selecciona el oscilador interno
 #use delay(internal=4000000)        //poner el oscilador interno a 8Mhz
///////////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES                                                            //
///////////////////////////////////////////////////////////////////////////////////
char taBCD[]=0b011100,0b0111000,0b011100,0b011100,0b011100,0b011100,0b011100,0b011100,0b011100,0b011100;
int contador;
///////////////////////////////////////////////////////////////////////////////////


void main()
{
 setup_spi(spi_slave | spi_l_to_h | spi_clk_div_16| SPI_XMIT_L_TO_H);//habilito como esclavo

for(;;)
 {
 if(spi_data_is_in())
 {                                 // si hay un dato entrante por el SPI lo saca por el puerto D         
 OUTPUT_D(spi_read());
}

}
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


Y finalmente la simulación en Proteus.


                                         DESCARGA PROGRAMA