2 pic 16f877a (SPI) el esclavo puede recibir pero no enviar.

#1
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:
#2
Hola, en SPI cuando el maestro envía un dato al mismo tiempo esta recibiendo un dato también, la función que deberías implementar en tu esclavo seria algo así :

PORTB = dato_recibido(dato_a_enviar);

En el maestro debería ser similar:

PORTB = dato_enviado(dato_a_enviar); // al final de esta función debería haber un return(sspbuf)

Como ves, en ambos se envía y se recibe a la vez.
 
Arriba