PIC单片机之SPI从机框架

2019-04-15 11:54发布

#include
#include
#include
__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++);
}
//*************************************************************************************
// Send one byte via UART
//*************************************************************************************
void uart_send(unsigned int mydata_byte) {     while(!TRMT);    // make sure buffer full bit is high before transmitting
    TXREG = mydata_byte;       // transmit data
}
/************************************************************/
 //串口初始化
/************************************************************/
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;
    }
  
}