#include "I2C.h"


//模拟I2C

/*****************************CTI2C delay***************************/
void I2C_delay(UINT32 val)
{
	for(int i=0;i<val*60;i++)
	{
		__NOP;
	}
}

/*****************************I2C_Start***************************/
u8 I2C_Start(void)
{
	SCL_High;
	SDA_High;
	I2C_delay(1);
//	SDA_INPUT;
//	I2C_delay(1);
//	if(!GetSDABit) 
//	{
//		SDA_OUTPUT;
//		printf("I2C_Start  BUSY \r\n");	           //总线忙
//		return  FALSE;
//	}
//	SDA_OUTPUT;
	SDA_Low;
	I2C_delay(1);
//	SDA_INPUT;	
//	if(GetSDABit) 
//	{	
//		SDA_OUTPUT;
//		printf("I2C_Start  error \r\n");			//总线错误
//		return  FALSE;
//	}
//	SDA_OUTPUT;
	SCL_Low;
	I2C_delay(1);
	return  TRUE;
}

/*****************************I2C_Stop**************************/
void I2C_Stop(void)
{
	SCL_Low;
	SDA_Low;
	I2C_delay(1);
	SCL_High;
	I2C_delay(1);
	SDA_High;
	I2C_delay(1);
}
/*****************************I2C_SendAck**************************/
void I2C_SendAck(void)
{
	SCL_Low;
	I2C_delay(1);
	SDA_Low;
	I2C_delay(1);
	SCL_High;
	I2C_delay(1);
	SCL_Low;
	I2C_delay(1);
}
/*****************************I2C_SendNoAck**************************/
void I2C_SendNoAck(void)
{
	SCL_Low;
	I2C_delay(1);
	SDA_High;
	I2C_delay(1);
	SCL_High;
	I2C_delay(1);
	SCL_Low;
	I2C_delay(1);
}
/*****************************I2C_WaitAck**************************/
u8 I2C_WaitAck(void)     //返回值 1=ack  0=noack
{
	u8 i=0;
	
	SCL_Low;
	I2C_delay(1);
	SDA_High;
	I2C_delay(1);
	SDA_INPUT;
	SCL_High;
	I2C_delay(1);
	for(i=0;i<201;i++)
	{
		if(GetSDABit==0)
		{
			SCL_Low;
			SDA_OUTPUT;
			I2C_delay(1);
			return 1;
		}
		else if(i==200)
		{
			SCL_Low;
			SDA_OUTPUT;
			I2C_delay(1);
			return 0;
		}
	}
}
/********************I2C写1byte函数,S为需要写的内容*****************/
u8 I2C_write_byte(const u8 s)
{
	u8 ch_data,i=0;
	
	SCL_Low;
	ch_data=s;
	for(i=0;i<8;i++)
	{
		if(ch_data&0x80)	SDA_High;
		else    			SDA_Low;
		I2C_delay(1);
		SCL_High;
		I2C_delay(1);
		SCL_Low;                       
		ch_data=ch_data<<1;
		I2C_delay(1);
	}
}
/****************I2C读1byte函数，返回值为所读数据*****************/
u8 I2C_read_byte(void)
{
	u8 ch_data,i=0;
	
	SDA_High;
	I2C_delay(1);
	SDA_INPUT;
	ch_data=0x00;               
	for(i=0;i<8;i++)
	{
		SCL_High;
		I2C_delay(1);
		ch_data=ch_data<<1;
		if(GetSDABit)  ch_data|=0x01;
		SCL_Low;	
		I2C_delay(1);
	}
	SDA_OUTPUT;
	
	return ch_data;
}

/****************I2C连续写数据*****************/
u8 I2C_BufferWrite(u8* pBuffer, u8 WriteAddr, u16 NumByte)
{
	if (!I2C_Start()) return FALSE;
	I2C_write_byte((I2C_addr<<1) | 0);      //从地址
	if (!I2C_WaitAck())
	{
		I2C_Stop();
		return FALSE;
	}
	I2C_write_byte(WriteAddr);              //寄存器
	I2C_WaitAck();
	while(NumByte--)
	{
		I2C_write_byte(* pBuffer);
		I2C_WaitAck();
		pBuffer++;
	}
	I2C_Stop();
	return TRUE;
}
/****************I2C连续读数据*****************/
u8 I2C_BufferRead(u8* pBuffer, u8 ReadAddr, u16 NumByte)
{
	if (!I2C_Start()) return FALSE;
	I2C_write_byte((I2C_addr<<1) | 0);      //从地址	
	if (!I2C_WaitAck()) 
	{
		I2C_Stop(); 
		return FALSE;
	}
    I2C_write_byte(ReadAddr);              //寄存器						
	I2C_WaitAck();
	I2C_Stop(); 
	I2C_Start();
	I2C_write_byte((I2C_addr<<1) | 0x01);     //从地址	
	I2C_WaitAck();
	while(NumByte)
	{
		*pBuffer = I2C_read_byte();
		if(NumByte == 1)	I2C_SendNoAck();
		else				I2C_SendAck();
		pBuffer++;
		NumByte--;
	}
	I2C_Stop();
	return TRUE;
}