#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 = 39;//主控模式下，该寄存器[Fosc/(BandRate+1)*4]决定了波特率  ;39-100K,79-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;
	SSCIIF=0;
	SSCIBUFR=c;

	while(SSCIBUF);		//发送完成SSCIBUF清零

	while(!SSCIIF);

	while(SSCIACKSTA && j<100)		//判断是否收到应答
	{j++;}
}

//接收数据
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)
{
	uchar i;

	addr|=0x01;				//强制地址bit0取1	读操作
	Start_I2C();
	SendB(addr);				//发送7位地址
	for(i=0;i<lenth;i++)
	{
		if(i<lenth-1)
		{
			IIC_Rev_BUF[i]=RcvB();
			ack(0);
		}
		else
		{
			IIC_Rev_BUF[i]=RcvB();
			ack(1);
		}

	}
	Stop_I2C();
}
