/*
 * IIC.c
 *
 *  Created on: 2019-9-2
 *      Author: charles_cai
 */
#include"main.h"

#ifndef IIC_C_
#define IIC_C_

unsigned char Buf[10]={0}; //IIC多字节连续读写使用的缓存空间

/************************
 * 函数名   ：Init_IIC
 * 函数功能：配置IIC
 * 入口参数：无
 * 返回      ：无
 ************************/
void Init_IIC()
{
	SSCIEN=0;				//关闭I2C模块，初始化完之后再打开

	SSCICTL0=0X18;		//I2C主控模式，速度为Fosc/（(SSCIADD+1）*4)
	SSCICTL1=0X00;
	SSCISTA=0X00;
	SSCIADD = 0X27;//主控模式下，做为IIC波特率设置寄存器，79——50K;39——100k
	SSCIEN=1;
}

/************************
 * 函数名   ：Start_I2C
 * 函数功能：IIC主机发起起始信号
 * 入口参数：无
 * 返回      ：无
 ************************/
void Start_I2C(void)
{
	STARTEN=1;			//发送START。由硬件自动清零
	while(STARTEN);
	while(!SSCIIF);
	SSCIIF=0;
}

/************************
 * 函数名   ：Stop_I2C
 * 函数功能：IIC主机发起停止信号
 * 入口参数：无
 * 返回      ：无
 ************************/
void Stop_I2C()
{
	STOPEN=1;
	while(STOPEN);
	while(!SSCIIF);
	SSCIIF=0;
}

/************************
 * 函数名   ：SendB
 * 函数功能：IIC主机发送一个字节的数据
 * 入口参数：c，待发送的单字节数据
 * 返回      ：无
 ************************/
void SendB(unsigned char c )
{
	unsigned char j=0;
	SSCIBUFR=c;
	while(SSCIBUF);		//发送完成SSCIBUF清零
	j=0;
	while(SSCIACKSTA &&j<200)		//判断是否收到应答
	{j++;}
	while(!SSCIIF);  //等待单个字节的数据发送完成
	SSCIIF=0;
}

/************************
 * 函数名   ：RcvB
 * 函数功能：IIC主机接收一个字节的数据
 * 入口参数：无
 * 返回      ：接收的一个字节数据
 ************************/
unsigned char RcvB()
{
	unsigned char da=0;
	unsigned int j=0;
	SSCIRCEN=1;
	while(SSCIRCEN);		//接收完毕，硬件自动清零
	while((!SSCIIF)&&(j<500))  //接收完毕，SSCIIF置位
	{j++;}
	SSCIIF=0;

	da=SSCIBUFR;
	return da;
}
/************************
 * 函数名   ：ack
 * 函数功能：IIC主机发送一个应答信号
 * 入口参数：0是应答，1是不应答
 * 返回      ：无
 ************************/
void ack(unsigned char a)
{
	if(a)SSCIACKDAT=1;//应答信号=1，不应答；应答信号=0，应答
	else SSCIACKDAT=0;
	SSCIACKEN=1;		//使能应答信号发送
	while(SSCIACKEN);	//发送完ACKDAT，硬件自动清零
	while(!SSCIIF);
	SSCIIF=0;
}
/************************
 * 函数名   ：IIC_SEND_DATAWrite
 * 函数功能：IIC主机连续发送多个字节，需要提前将要发送的数据填写到Buf[]中
 * 入口参数：待发送的数据长度
 * 返回      ：无
 ************************/
void IIC_SEND_DATAWrite(unsigned char cnt)
{
	unsigned char i=0;
	Start_I2C();
	SendB(Write_adr);				//发送7位地址

	for(i=0;i<cnt;i++)
		SendB(Buf[i]);
	Stop_I2C();
}
/************************
 * 函数名   ：IIC_SEND_DATARead
 * 函数功能：IIC主机连续读取多个字节
 * 入口参数：无
 * 返回      ：读取的结果放在Buf[]中
 ************************/
void IIC_SEND_DATARead (unsigned char cnt)
{
	unsigned char i=0;

	Start_I2C();
	SendB(Read_adr);				//发送7位地址

	for(i=0;i<(cnt-1);i++)
	{
		Buf[i]=RcvB();
		ack(0);
	}
	Buf[cnt-1] =RcvB();
	ack(1);

	Stop_I2C();
}

#endif /* IIC_C_ */
