Hola, aqui hay un ejemplo de comunicacion SPI en 2 pics 16f877a. El Maestro transfiere 6 bytes al esclavo, y el esclavo responde con 0x01 por cada byte recibido. El compilador utilizado es el PICC y la simulacion esta hecha en proteus. Les adjunto imagenes de proteus.
Codigo de Maestro:
#include <SPI_Master.h>
#byte SPIBUF=0x13
BYTE ADDR=0xFF;
#int_EXT
void EXT_isr(void)
{
BYTE rx;
BYTE tiempo=50;
output_bit(PIN_C2, 0); //Habilita SS
//BYTE 0
spi_write(0xF0); //dato enviado
while(!spi_data_is_in());
rx=SPIBUF; //dato recibido
delay_us(tiempo);
//BYTE 1
spi_write(0xF1); //dato enviado
while(!spi_data_is_in());
rx=SPIBUF; //dato recibido
delay_us(tiempo);
//BYTE 2
spi_write(0xF2); //dato enviado
while(!spi_data_is_in());
rx=SPIBUF; //dato recibido
delay_us(tiempo);
//BYTE 3
spi_write(0xF3); //dato enviado
while(!spi_data_is_in());
rx=SPIBUF; //dato recibido
delay_us(tiempo);
//BYTE 4
spi_write(0xF4); //dato enviado
while(!spi_data_is_in());
rx=SPIBUF; //dato recibido
delay_us(tiempo);
//BYTE 5
spi_write(0xF5); //dato enviado
while(!spi_data_is_in());
rx=SPIBUF; //dato recibido
output_bit(PIN_C2, 1); //Deshabilita SS
}
void main()
{
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_4|SPI_SAMPLE_AT_END);
output_bit(PIN_C2, 0);
output_bit(PIN_C2, 1);
while(true);
}
CODIGO DEL ESCLAVO:
#include <SPI_Slave.h>
#byte SPIBUF=0x13
BYTE BUFFER_SIZE=7;
BYTE i=0;
BYTE BUFFER[6];
#int_SSP
void SSP_isr(void)
{
for(i=0;i<BUFFER_SIZE;i++) {
while(!spi_data_is_in());
BUFFER=SPIBUF; //Read from the Master
SPIBUF=0x01; //Write to the Master
i=i+1;
}
}
void main()
{
enable_interrupts(GLOBAL);
enable_interrupts(INT_SSP);
setup_spi(SPI_SLAVE|SPI_L_TO_H|SPI_CLK_DIV_4|SPI_SAMPLE_AT_END);
SPIBUF=0x01;
while(true);
}