/*-------------------------------------------

程序名称：IIC从动收发程序
日期版本：2018/6/15 <V1.1>

备注：由于SDA/SCL口为漏极开路输出，故在该口线
      上需要接外部上拉电阻，否则无法正常工作。

*本程序由 中微半导体有限公司 &应用支持部& 编写整理
*公司网址 www.mcu.com.cn
*技术支持QQ 3001082102  罗工
            3001085706	陈工
-------------------------------------------*/
//从动模式


#include <cms.h>


//--------------------------------------

#define 	I2C_SCL_IO				TRISB1	//SCL，时钟口
#define 	I2C_SDA_IO				TRISB2	//SDA，数据口

//--------------------------------------
//发送/接收数组定义（根据实际需要修改）
#define		RECE_BUFFER_LENGTH		4		//定义接收缓冲区大小(byte)
#define		SEND_BUFFER_LENGTH		4		//定义发送缓冲区大小(byte)

unsigned char Recebuffer[RECE_BUFFER_LENGTH];//接收数据缓存
unsigned char Sendbuffer[SEND_BUFFER_LENGTH];//发送数据缓存	

//--------------------------------------
//函数声明部分（无需修改）
void Set_IIC_Slave();						//从动模式设置初始化
//--------------------------------------




//--------------------------------------
//测试示例
void main()
{
	Set_IIC_Slave();						//IIC从动模式初始化
	while(1)
	{
		asm("nop");
		asm("clrwdt");
		OSCCON = 0x71;						//8MHz内部时钟
				
		INTCON = 0xC0;						//全局中断使能
		

		TRISA = 0;
		PORTA = Recebuffer[0];

		Sendbuffer[0] = Recebuffer[0];		//从机发送给主机的数据
		Sendbuffer[1] = 0x8;
		Sendbuffer[2] = 0xD;
		Sendbuffer[3] = 0xF;
	}
}



	
//中断服务函数
void interrupt ISR(void)
{
	static unsigned char rececount=0,sendcount=0;
	if(SSPIF)					//IIC中断
	{
		SSPIF = 0;
		if(RW)					//1-读，0-写
		{	
			//发送数据		
			SSPBUF = Sendbuffer[sendcount];
			if(++sendcount >= SEND_BUFFER_LENGTH)
			{
				sendcount = 0;
			}
			asm("nop");			//延时准备数据

			CKP = 1;			//数据准备完毕,释放时钟
		}
		else
		{
			//接收数据
			if(DA)				//DA为1-收到的是数据，DA为0-收到的是地址
			{
				Recebuffer[rececount] = SSPBUF;
				if(++rececount >= RECE_BUFFER_LENGTH)
				{
					rececount = 0;
				}
			}
			else
			{
				SSPBUF;			//必须读出SSPBUF
				rececount = 0;
				sendcount = 0;
			}
			SSPOV = 0;
		}
	}
}


/***********************************************
函数名称：Set_IIC_Slave
函数功能：初始化IIC模块
入口参数：无
出口参数：无
备注：
************************************************/
void Set_IIC_Slave()
{	
	I2C_SCL_IO = 1;				//SDA及SCL为输入口使能IIC后自动为开漏输出
	I2C_SDA_IO = 1;
	SSPSTAT = 0X80;				//清除状态位，标准100KHz
	SSPCON = 0X36;				//从动模式，7位地址，使能端口及时钟
	SSPCON2 = 0X00;			
	SSPADD = 0XA0;				//设备从地址
	SSPIE = 1;					//使能MSSP中断
}	