/****************************************************************************************
 *
 * 文  件  名: main.c
 * 项  目  名: 15-SPI_Slave
 * 版         本: v1.0
 * 日         期: 2016年05月16日 11时38分22秒
 * 作         者: Administrator
 * 程序说明：SPI通信例程
 * 			——从机模式
 * 适用芯片：KF8FXXXX系列——KF8F2156、KF8F3156、KF8F4156、KF8F3155、KF8F4155、KF8F4158
 * 			KF8TS27XX系列——KF8TS2708、KF8TS2710、KF8TS2714、KF8TS2716
 * 			KF8VXXX系列——KF8V327、KF8V427、KF8V429
 ****************************************************************************************/
#include<KF8F4158.h>

#define uchar unsigned char
#define uint  unsigned int

#define	LED4	P2LR0

#define	LED3	P2LR1

#define MODE1	SSCICKP=0;CKEGE=0;	//空闲时为低电平，在SCL下降沿发送数据
#define MODE2	SSCICKP=0;CKEGE=1;	//空闲时为低电平，在SCL上升沿发送数据，SS信号必须使能
#define MODE3	SSCICKP=1;CKEGE=0;	//空闲时为高电平，在SCL上升沿发送数据
#define MODE4	SSCICKP=1;CKEGE=1;	//空闲时为高电平，在SCL下降沿发送数据，SS信号必须使能


uint	time=0;
uint   time1=0;
uint    Freq=0;

uchar	Temp=0;
uchar	ADDR=0;
uchar	DATA=0;
uchar	DATAcnt=0;
uchar	ON=0;

void iic_data_fun(uchar control_data);

void delay_ms(uint ms_data)
{
	uint j=0;
	while(ms_data--)
	{
		j=124;
		while(j--)
		{

		}
	}
}

//中断函数0:0X04入口地址
void int_fun0() __interrupt (0)
{
	if(T0IF)
	{
		T0IF = 0;
		T0 = 0X9C;
		time++;
		time1++;
		if(time>Freq)
		{
			time=0;
			if(ON)LED4=!LED4;
		}
	}
}

//中断函数1:0x14入口地址
void int_fun1() __interrupt (1)
{

}

void iic_data_fun(uchar control_data)
{
	switch(control_data)
	{
		case 0XE1:Freq=100;break;
		case 0XE2:Freq=200;break;
		case 0XE3:Freq=300;break;
		case 0XE4:Freq=400;break;
		case 0XE5:Freq=500;break;
		case 0XE6:Freq=600;break;
		case 0XE7:Freq=700;break;
		case 0XAA:ON=0;LED4=1;break;
		case 0X55:ON=1;Freq=0;break;
		default:break;
	}
}

void init_mcu()
{
	OSCCTL = 0x70;           //32M
	_NOP();
	_NOP();

	//端口初始化
	TR0 = 0X06;              //0000 0110
	TR1 = 0Xff;              //0000 0011 P10为SCL，P11为SDI
	TR2 = 0X00;              //0000 0000
	TR3 = 0X7f;				 //0111 0000 P37为SDO，从机输出，P36为SS选择端，设为输入

	P0LR = 0Xff;             //0011 1000
	P1LR = 0X00;             //0000 0000
	P2LR = 0xff;             //0011 0001
	P3LR = 0Xff;			 //0101 0000

	//定时器初始化
	OPTR = 0X83;     //16分频，4us计数1，
	T0 = 0X06;      //1ms定时
	T0IE = 1;
	T0IF = 0;

	//SPI初始化
	SSCIEN=0;				//关闭SPI模块，初始化完之后再打开

	SSCICTL0=0X04;			//SPI 从动模式，时钟 = SCK 引脚。使能SS引脚控制。
	SSCICTL1=0X00;
	SSCISTA=0X00;

	MODE4

	SSCIEN=1;

	SSCIIE=0;				//打开SPI中断
	SSCIIF=0;				//清零SPI中断标志



    //中断初始化
    AIE = 1;		//打开总中断
    PUIE=1;			//使能所有未屏蔽的外设中断
}

uchar SPI(uchar d)
{
	SSCIBUFR=d;
	while(!SSCIIF);
	SSCIIF=0;
	return SSCIBUFR;
}

void main()
{

	init_mcu();
	LED4=1;
	while(1)
	{
		DATA=SPI(DATA);
		iic_data_fun(DATA);
	}
}
