#include <p33fj32mc204.h>
#include <libpic30.h>
#include <spi.h>
_FOSCSEL(FNOSC_FRC);
_FWDT(FWDTEN_OFF);
#define Broadcast 15
#define CSID 2
int Device[15], i,Data;
void configurarSPI(void) {
TRISC = 0x0FF;
TRISA = 0x000;
RPINR20bits.SCK1R = 19;
RPINR20bits.SDI1R = 20;
RPINR21bits.SS1R = 21;
RPOR12bits.RP25R = 7; //SD01
SPI1BUF = 0; //Datasheet specifies the following order for setting SPI1 in slave mode
IFS0bits.SPI1IF = 0; //Clear interrupt flag (no interrupt)
IEC0bits.SPI1IE = 1; //Enable SPI1 interrupts
IPC2bits.SPI1IP = 5; //#Set SPI1 interrupt priority pretty high, higher than all other user interrupts
SPI1CON1 = 0b0000000100011010; //Setup for slave (0,0) mode with SS1 enabled.
SPI1CON2 = 0b0100000000000000; //Do not used framed SPI
SPI1STAT = 0b0000000000000000; //Clear all status bits
SPI1CON1bits.SMP = 0; //Datasheet specifies this must be cleared.
SPI1CON1bits.CKE = 0; //Mode (0,0)
SPI1CON1bits.SSEN = 0; //SS1 disabled
SPI1STATbits.SPIROV = 0; //Make sure no errors
SPI1STATbits.SPIEN = 1; //Start SPI1
}
void spi_init_slave(void)/*sin SS habilitado*/
{
RPINR20bits.SCK1R = 19;
RPINR20bits.SDI1R = 20;
RPOR12bits.RP25R = 7; //SD01
SPI1BUF=0; //limpia el buffer del módulo
IFS0bits.SPI1IF=0; //limpia la bandera de interupción
IEC0bits.SPI1IE=0; //habilita la interrupción del módulo
IPC2bits.SPI1IP=0x3; //prioridad de interrupcion Nº3 (ADC tiene 4)
SPI1CON1bits.MSTEN=0; //como slave
SPI1CON1bits.SMP=0; //debe sere deshabilitado en modo Slave
SPI1STATbits.SPIROV=0; //No receive overflow
SPI1STATbits.SPIEN=1; //habilita el módulo SPI
TRISC = 0x0FF;
TRISA = 0x000;
}
void main (void)
{int x;
spi_init_slave();
TRISC= 0b0111111111;
while(1)
{
while( !DataRdySPI1() ){}
x = ReadSPI1();
PORTA = x;
asm("nop");
WriteSPI1(0xf0);
}
}