天天看點

PIC單片機之SPI從機架構

#include <pic.h>

#include<string.h>

#include<STDIO.H>

__CONFIG(0x3F32); //晶片配置字  選擇HS模式振蕩器,關WDT

typedef     unsigned  char uchar;

typedef   unsigned  int  uint;

uchar resive=0;

uchar resive1=0;

uchar send_buf[16]={'S',0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xc,0xD,0xe,0xf};

uchar send_num=0;

uchar resive_flag=0;

#define CS RA5

uchar spi_data_buf;

//函數名稱:delay_ms

//函數功能:軟體延時T*ms

//傳回值:無

void delay_ms(uint T)  //機關時間Tms延時

{

  uchar time;

  while(T--)

  for(time=0;time<250;time++);

}

/

 //序列槽初始化

void UART_INT()

{

  PIR1|=0x30;

  SYNC=0;

  SPEN=1;

  RCIE=1;

  CREN=1;

  TXIE=1;

  TXEN=1;

  BRGH=1;

  RCIF=0;

  RX9=0;

  TX9=0;

 SPBRG=0X19;//異步接收   波特率9600

 TRISC7=1;

 TRISC6=0;

}

//函數名稱:SPI_INIT

//函數功能:SPI初始化  作為從機

//傳回值:無

void SPI_INIT()

{

    PIR1|=0x08; //SPI中斷使能

    TRISC3=1;  // SCK 輸入

    TRISC4=1; //  SDI 輸入

    TRISC5=0; //  SDO 輸出

    TRISA5=1; //  SS  輸入

    SSPBUF=0x00;

    SSPCON=0x34; // SSPEN  CKP  SSPM 0100

    SSPIE=1;    

    SSPIF=0;

}

//函數名稱:spi_send_byte()

//函數功能:SPI發送資料

//傳回值:無

void spi_send_byte(unsigned char byte)

{

 SSPBUF = byte;

 while(BF==0); //等待發送完畢

 SSPIF = 0;

}

void main()

{

 SPI_INIT();//SPI初始化

    UART_INT();

 INTCON|=0xC0;  //從模式時候打開

 while(1)

   {

     uart_send(resive1);

delay_ms(1000);

uart_send(resive);

//uart_send(resive_buf);

delay_ms(1000);

   }

}

void interrupt isr(void)

{

    if(SSPIF==1)

    {

      SSPIF=0;

      resive=SSPBUF;

      if((resive)==0x05 && (resive_flag==0))

      {

       resive_flag=1;

       SSPBUF=send_buf[send_num];

       send_num++;

       if(send_num>15)

         {

           send_num=0;

          }

      }

     else

    {

      SSPBUF=0X55;

    }

      WCOL=0;

    }

  else if(RCIF)

    {

      RCIF=0;

      resive1=RCREG;

    }

    else if(TXIF&&TXIE)

   {

      TXIE = 0;

    }

}

繼續閱讀