#include "include.h"

uchar IIC_Rev_BUF[128]={0};

/****************************************************************************************
 * 函数名     ：IIC_Init
 * 函数功能：IIC初始化函数
 * 入口参数：IIC_MODE	1为主机模式，0为从机模式
 * 返回          ：无
****************************************************************************************/
void IIC_Init(unsigned char MODE)
{
	if(MODE == MODE_Master)
	{
		//I2C主机初始化
		TR11=1;	TR10=1;      	//SDA=P1.1，SCL=P1.0
		SSCIEN=0;				//关闭I2C模块，初始化完之后再打开
		SSCICTL0=0x18;			//I2C主控模式
		SSCICTL1=0x00;
		SSCISTA=0x00;
		SSCIADD = 0X4F;//主控模式下，该寄存器[Fosc/(BandRate*4)]-1决定了波特率  49-20K;32-30K;24-40K;19-50K;
		SSCIIF=0;				//清零I2C中断标志
		SSCIEN=1;
	}
	else
	{
		TR11=1;	TR10=1;      	//SDA=P1.1，SCL=P1.0
		SSCIEN=0;				//关闭I2C模块，初始化完之后再打开
		SSCIADD=IIC_Slave_Addr;
		SSCICTL0=0x06;			//7位地址模式
		SSCICTL1=0x00;
		SSCISTA=0x00;
		SSCIEN=1;
		SSCIIE=1;				//打开I2C中断
		SSCIIF=0;				//清零I2C中断标志
	}

}

//启动IIC
static	void Start_I2C(void)
{
	STARTEN=1;			//发送START。由硬件自动清零
	while(STARTEN);
	while(!SSCIIF);
	SSCIIF=0;
}

//停止IIC
static	void Stop_I2C()
{
	STOPEN=1;
	while(STOPEN);
	while(!SSCIIF);
	SSCIIF=0;
}

//发送数据，等待应答
static	void SendB(uchar c )
{
	uchar j=0;
	SSCIBUFR=c;
	while(SSCIBUF);				//发送完成SSCIBUF清零
	j=0;
	while(SSCIACKSTA &&j<200)	//判断是否收到应答
	{j++;}
	while(!SSCIIF);
	SSCIIF=0;
}

//接收数据
static	uchar RcvB()
{
	uchar da=0;
	SSCIRCEN=1;
	while(SSCIRCEN);		//接收完毕，硬件自动清零
	while(!SSCIIF);
	SSCIIF=0;

	da=SSCIBUFR;

	return da;
}

//发送应答，0-应答;1-不应答
static	void ack(uchar a)
{
	if(a)SSCIACKDAT=1;		//应答信号=1，不应答；应答信号=0，应答
	else SSCIACKDAT=0;
	SSCIACKEN=1;			//使能应答信号发送
	while(SSCIACKEN);		//发送完ACKDAT，硬件自动清零
	while(!SSCIIF);
	SSCIIF=0;
}

void IIC_SEND_DATAWrite(uchar addr,	uchar dat)
{
	addr&=0xfe;				//强制地址bit0取0	写操作
	Start_I2C();
	SendB(addr);			//发送7位地址
	SendB(dat);
	Stop_I2C();
}

//void IIC_SEND_DATARead (uchar addr,	uchar lenth)
void IIC_SEND_DATARead (uchar addr)
{
	uchar Rev_temp1,Rev_temp2;
	uchar i;
	addr|=0x01;				//强制地址bit0取1	读操作

	Start_I2C();
	SendB(addr);				//发送7位地址
	Rev_temp1=RcvB();
	ack(0);						//发送结束符号NACK
	Stop_I2C();
	UART_SendBuf(Rev_temp1);

//	Start_I2C();
//	SendB(addr);				//发送7位地址;
//	for(i=0;i<lenth;i++)
//	{
//		if(i<lenth-1)
//		{
//			IIC_Rev_BUF[i]=RcvB();
//			ack(1);
//		}
//		else
//		{
//			IIC_Rev_BUF[i]=RcvB();
//			ack(0);
//		}
//
//	}
//	Stop_I2C();
}
