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

#define uchar unsigned char
#define uint  unsigned int

#define		IIC_10BIT_Address		0			//0——7位地址模式，1——10位地址模式

#define	LED4	P2LR0

#define	LED3	P2LR1

#define IICADDH		0XF6	//从机10位地址模式高两位地址，11110 11 0，bit2:bit1有效。bit0位无效，对应主机的读操作（0XF7）或写操作(0XF6)
#define IICADDL		0X5A	//从机10位模式低8位地址或从机7位地址模式7位有效地址，bit0位无效，对应主机的读操作（0X5B）或写操作(0X5A)

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

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

uchar   datatemp[32];
uchar   i=1,j=1;

uchar flag=0;

uint Erom_add;
uchar Arr_erom[32];
uchar Arr_erom2[8];//={"255","255","255","255","255","255","255","255"};

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;
		}
		if(time1>200)
		{
			time1=0;
			LED3=!LED3;
		}
	}

	if(SSCIIF)
	{
		SSCIIF=0;

#if IIC_10BIT_Address				//I2C 10位地址模式地址更新
		if(SSCIUA)
		{
			SSCIADD=IICADDL;
		}
		else SSCIADD=IICADDH;
#endif

		if(SSCIRW==0)				//从模式接收数据
		{
			Temp=SSCIBUFR;
			if(SSCIDA)				//接收到的是数据
			{
				DATA=Temp;
				datatemp[i]=DATA;
				i++;

			}
			else					//接收到的是地址
			{
				ADDR=Temp;
				i=1;
				j=1;
			}
		}
		else						//从模式发送数据
		{
				SSCIBUFR=datatemp[j];
				j++;
				SSCICKP=1;
		}
	}
}

//中断函数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 = 0X03;              //0000 0011 P10为SCK，P11为SDA
	TR2 = 0X00;              //0000 0000
	TR3 = 0X00;				 //0000 0000

	P0LR = 0X38;             //0011 1000
	P1LR = 0X03;             //0000 0000
	P2LR = 0x33;             //0011 0001
	P3LR = 0X50;			 //0101 0000

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

	SSCIADD=IICADDL;

#if IIC_10BIT_Address
	SSCICTL0=0X07;			//10位地址模式
#else
	SSCICTL0=0X06;			//7位地址模式
#endif
	SSCICTL1=0X00;
	SSCISTA=0X00;

	SSCIEN=1;

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

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

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

void main()
{

	init_mcu();
	LED4=1;
	for(i = 0; i < 32; i++)              //给数组2进行赋值，
	{
		datatemp[i] = 0xff;
	}
	while(1)
	{
		iic_data_fun(DATA);
	}
}
