/*-------------------------------------------

程序名称：SPI从动收发程序
日期版本：2018/6/15 <V1.1>

备注：

*本程序由 中微半导体有限公司 &应用支持部& 编写整理
*公司网址 www.mcu.com.cn
*技术支持QQ 3001082102  罗工
            3001085706	陈工
-------------------------------------------*/


#include <cms.h>


//--------------------------------------
#define 	SPI_SCK_IO		TRISB1	//SCK，时钟口方向寄存器
#define 	SPI_SDI_IO		TRISB2	//SDI，数据输入口方向寄存器
#define		SPI_SDO_IO		TRISE3	//SDO，数据输出口方向寄存器
//--------------------------------------
//发送/接收数据定义
volatile unsigned char ReceBuffer;	//接收到的数据
volatile unsigned char SendBuffer;	//待发送的数据

//--------------------------------------
//函数声明部分
void Set_SPI_Slave();
//--------------------------------------



//--------------------------------------
//测试示例
void main()
{
	asm("nop");
	asm("clrwdt");
	OSCCON = 0x71;					//8MHz内部时钟
	
	Set_SPI_Slave();				//初始化SPI通信
	
	INTCON = 0xc0;					//全局中断使能
	
	while(1)
	{
		asm("clrwdt");
	}
}

void interrupt ISR()
{
	//收到时钟SCK信号时发生SPI中断
	if(SSPIF)
	{
		SSPIF = 0;
		ReceBuffer = SSPBUF;		//读出数据
		
		ReceBuffer ^= 0xff;			
		SendBuffer = ReceBuffer;	//需要发送的数据
		
		SSPBUF = SendBuffer;		//写缓存，发送数据
	}
}



/***********************************************
函数名称：Set_SPI_Slave
函数功能：初始化SPI通信
入口参数：无
出口参数：无
备注：
************************************************/
void Set_SPI_Slave()
{
	SPI_SCK_IO = 1;					//SCK输入
	SPI_SDI_IO = 1;					//SDI输入
	SPI_SDO_IO = 0;					//SDO输出
	
	SSPSTAT = 0X00;					//下降沿发送
	SSPCON = 0X25;					//SPI从动模式，时钟=SCK引脚，禁止SS，时钟空闲为低电平
	SSPCON2 = 0;					//禁止IIC
	SSPIE = 1;						//使能SSP中断
}