Autor Tema: SPI en PIC (CCS y Proteus)  (Leído 3432 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado f7peralta

  • PIC10
  • *
  • Mensajes: 1
SPI en PIC (CCS y Proteus)
« en: 05 de Noviembre de 2011, 15:15:18 »
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);
   
}





 

anything