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 leer
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í.