Código:
/////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////CODIGO DEL PIC MAESTRO////////////////////////////////////////////////
sbit Chip_Select at RC0_bit;
sbit Chip_Select_Direction at TRISC0_bit;
///////////////////DECLARACION DE VARIABLES////////////////////////////////////
char dato,leer,recepcion;
///////////////////////////////////////////////////////////////////////////////
void setup (void){
TRISB = 0b00000000;
TRISC =0b11010000;
PORTB = 0X00;
PORTC = 0X00;
}
//////////////////////////////////////////////////////////////////////////////
/////////////////////////funciones///////////////////////////////////////////
void setup_spi (void){
sspen_bit =1; // habilito los pines sck,sdi,sdo
ckp_bit =0 ; // polaridad del clock
cke_bit =1 ; // los datos se transmiten por flanco ascendente
sspm0_bit = 0; ///////////////////////////
sspm1_bit = 0;
/// SPI MAESTRO ,CLOCK = Fosc/4
sspm2_bit = 0;
sspm3_bit = 0; ////////////////////// ////
smp_bit=1; // muestreo de los datos (MAESTRO)
}
///////////////////////////////////////////////////////////////////////////////
void enviar_dato(char dato){
Chip_Select = 0; // HABILITO EL ESCLAVO
sspif_bit = 0; // BAJO LA BANDERA DE FIN DE TRANSMICION
leer = sspbuf; // LEO EL REGISTRO SSPBUF
sspbuf = dato; // CARGO EL REGISTRO SSPBUF
while (sspif_bit==0); //ESPERO A QUE TERMINE DE TRANSMITIR/RECIBIR
sspif_bit =0; // BAJO LA BANDERA DE FIN DE TRANSMICION
Chip_Select = 1; // DESHABILITO EL ESCLAVO UNA VEZ QUE TERMINO
}
//////////////////////////////////////////////////////////////////////////////
char dato_recibido(void){
Chip_Select= 0;
leer = sspbuf;
while (SSPSTAT.BF==0);
SSPIF_BIT =0;
recepcion = sspbuf;
Chip_Select =1;
return (recepcion);
}
///////////////////////////////////////////////////////////////////////////////
void main() {
setup();
setup_spi();
while (1){
enviar_dato(0x17); // ENVIA BIEN EL DATO
PORTB = sspbuf; // NO RECIBE EL DATO DEL ESCLAVO..NO ANDA
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////CODIGO DEL PIC ESCLAVO////////////////////////////////////////
v///////////////////DECLARACION DE VARIABLES////////////////////////////////////
char leer,dato;
///////////////////////////////////////////////////////////////////////////////
void setup (setup){
TRISB = 0X00; // TODO EL PUERTOB COMO SALIDA
TRISA5_BIT =1; // HABILITO EL PIN SS (CHIP SELEC)
TRISC = 0b00011000; // RC3 Y RC4 COMO ENTRADAS PARA EL CLOK Y ENTRADA DE DATOS
PORTB = 0X00; // INICIALIZO EL PUERTOB EN BAJO
}
//////////////////////////////////////////////////////////////////////////////
/////////////////////////funciones///////////////////////////////////////////
void setup_spi (void){
sspen_bit =1; // habilito los pines sck,sdi,sdo
ckp_bit =0 ; // polaridad del clock
cke_bit =1 ; // los datos se transmiten por flanco ascendente
sspm0_bit = 0; ///////////////////////////
sspm1_bit = 0;
/// SPI ESCLAVO CON HABILITACION DEL SS
sspm2_bit = 1;
sspm3_bit = 0; ////////////////////// ////
smp_bit=0; // ESTE BIT EN MODO ESCLAVO SIEMPRE SE PONE A 0
}
/////////////////////////////////////////////////////////////////////////////
char dato_recibido() {
while(sspstat.bf==0); //ESPERA A QUE EL BUFFER ESTE LLENO
dato = sspbuf; // CARGO EL SSPBUF EN DATO
sspif_bit =0; // BAJO LA BANDERA DE FIN DE TRANSMICION
return (dato);
}
//////////////////////////////////////////////////////////////////////////////
void enviar_Dato (char dato){
leer = sspbuf;
sspbuf = dato; // CARGO EL REGISTRO SSPBUF
//while (sspif_bit==0); // ESPERA A QUE TERMINE DE TRANSMITIR
}
///////////////////////////////////////////////////////////////////////////////
void main() {
//lcd_init ();
setup();
setup_spi();
while (1){
PORTB = dato_recibido();
//enviar_Dato(0x03);
}
}:
Última edición por un moderador: