Ejemplo de comunicación SPI

Ejemplo de comunicación SPI entre varios microcontroladores formado por un maestro y dos esclavos, en donde los esclavos son los que envían los datos a petición del maestro que muestra el resultado en un LCD

MICROCONTROLADORES

Biblioman

7/24/20112 min read

Ejemplo de comunicación SPI entre varios microcontroladores formado por un maestro y dos esclavos, en donde los esclavos son los que envían los datos a petición del maestro que muestra el resultado en un LCD, para la realización del código se ha utilizado el compilador de CCS

Código del Maestro:

/*--------------------------------------------------------*\
| Comunicación entre PIC's por SPI. Maestro |
| autor: biblioman |
| www.aquihayapuntes.com |
\*--------------------------------------------------------*/

#include <16F877.h>
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
#use delay (clock = 4000000)
#include <LCD.C>

//Definición de registros
#byte PORTA =0x05
#byte PORTB =0x06
#bit RA0= PORTA.0
#bit RA1= PORTA.1
#bit RB0= PORTB.0
#bit RB1= PORTB.1

#define SS1_PIN RB0 //Definición de los pines de control
#define SS2_PIN RB1

void main()
{
int val;
//Configuración puerto SPI por hardware.
setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_64);

SET_TRIS_B( 0xFC ); //RB0 y RB1 como salida, demás pines como entrada.

lcd_init();//inicializo LCD

while(true) {
if (RA0==0){
SS1_PIN=0; //Activo esclavo 1
val=spi_read(0); // lee datos usando read
}
else if (RA1==0) {
SS2_PIN=0; //Activo esclavo 2
val=spi_read(0); // lee datos usando read
}
else
{
SS1_PIN=1; //desactivo los esclavos.
SS2_PIN=1;
}
//Muestro los valores de los esclavos en el LCD
lcd_gotoxy(1, 1);
printf(lcd_putc, "Valor: %d ", val);
delay_ms(10);
}
}

Código Esclavo 1:

/*--------------------------------------------------------*\
| Comunicación entre PIC's por SPI. Esclavo 1 |
| autor: biblioman |
| www.aquihayapuntes.com |
\*--------------------------------------------------------*/

#include <16F876A.h>
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
#use delay (clock = 4000000)

//Definición de registros
#byte PORTB =0x06

void main()
{
int val;
//Configuración dispositivo como esclavo
setup_spi(SPI_SLAVE);

while(true){

val=PORTB;
spi_write(val); //envío el valor que hay en el puerto B
delay_ms(1);

}

}

Código Esclavo 2:

/*--------------------------------------------------------*\
| Comunicación entre PIC's por SPI. Esclavo 2 |
| autor: biblioman |
| www.aquihayapuntes.com |
\*--------------------------------------------------------*/

#include <16F876A.h>
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
#use delay (clock = 4000000)

//Definición de registros
#byte PORTB =0x06

void main()
{
int val;

//Configuración dispositivo como esclavo
setup_spi(SPI_SLAVE);

SET_TRIS_B( 0x0F ); //RB7-RB4 como salidas. RB3-RB0 como entradas.
PORTB=0;//Inicializo salidas puerto B a 0

while(true){

val=PORTB;
spi_write(val); //envío el valor que hay en el puerto B
delay_ms(1);

}

}

El .DNS del circuito lo tenéis aquí.