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

程序名称：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_Master();
unsigned char SPI_WR1Byte(unsigned char data);
//--------------------------------------



//--------------------------------------
//测试示例
void main()
{
	asm("nop");
	asm("clrwdt");
	OSCCON = 0x71;			//8MHz内部时钟
	
	Set_SPI_Master();		//初始化SPI通信

	TRISA = 0;
	
	unsigned int times;
	while(1)
	{
		asm("clrwdt");
		
		if(++times >= 40000)
		{
			times = 0;
			
			SendBuffer++;	//需要发送的数据
			ReceBuffer = SPI_WR1Byte(SendBuffer);//发送及接收数据
			
			PORTA = ReceBuffer;
		}
	}
}


/***********************************************
函数名称：Set_SPI_Master
函数功能：初始化SPI通信
入口参数：无
出口参数：无
备注：
************************************************/
void Set_SPI_Master()
{
	SPI_SCK_IO = 0;			//SCK输出
	SPI_SDI_IO = 1;			//SDI输入
	SPI_SDO_IO = 0;			//SDO输出

	SSPSTAT = 0x00;			//中间采样、下降沿发送
	SSPCON = 0x20;			//SPI主控模式，时钟 = FOSC/4，时钟空闲为低
	SSPCON2 = 0;			//禁止IIC
}
/***********************************************
函数名称：SPI_WR1Byte
函数功能：数据发送与接收
入口参数：data - 待发送数据
出口参数：SSPBUF - 接收到的数据
备注：SPI在发送的同时接收数据
************************************************/
unsigned char SPI_WR1Byte(unsigned char data)
{
	unsigned char t = 0;
	SSPBUF = data;
	while(0 == SSPIF)		//等待发送完毕为止
	{
		if(0 == (--t))
		break;
	}
	SSPIF = 0;				//清SSPIF标志位
	return SSPBUF;
}