#include "Simulated_IIC_Master.h"
#include "Watchdog.h"
#include "rh850_macros.h"



uint8_t IICReceivedACK;

/******************************************************************************
��������IIC_Init
��  �ܣ���ʼ��IIC����
��  ������
����ֵ����
******************************************************************************/
void IIC_Init(void)
{
	EEPROM_SCL_DIR = GPIO_DIR_IN; //SCL???????????,IO?????????,??????SCL?????????????????,???SCL = 1
	IIC_Delay();
	IIC_Delay();

	EEPROM_SDA_DIR = GPIO_DIR_IN; //SDA???????????,IO?????????,??????SDA?????????????????,???SDA = 1
	IIC_Delay();
	IIC_Delay();

	IICReceivedACK = IIC_INVALID_ACK;
}

/******************************************************************************
????????IIC_Start
??  ?????IIC???????????????,???????IIC???
??  ??????
?????????
******************************************************************************/
void IIC_Start(void)
{
	IICReceivedACK = IIC_INVALID_ACK;

	EEPROM_SDA_DIR = GPIO_DIR_IN; //SDA???????????,IO?????????,??????SDA?????????????????,???SDA = 1
	IIC_Delay();
	IIC_Delay();

	EEPROM_SCL_DIR = GPIO_DIR_IN; //SCL???????????,IO?????????,??????SCL?????????????????,???SCL = 1
	IIC_Delay();
	IIC_Delay();

	EEPROM_SDA_DIR = GPIO_DIR_OUT; //SDA???0,???SDA = 0
	EEPROM_SDA_OUT =  0;
	IIC_Delay();
	IIC_Delay();

	EEPROM_SCL_DIR = GPIO_DIR_OUT; //SCL???0,???SCL = 0
	EEPROM_SCL_OUT =  0;
	IIC_Delay();
}

/******************************************************************************
????????IIC_Stop
??  ?????IIC??????????????,??????IIC???
??  ??????
?????????
******************************************************************************/
void IIC_Stop(void)
{
	IICReceivedACK = IIC_INVALID_ACK;

	EEPROM_SDA_DIR = GPIO_DIR_OUT; //SDA???0,???SDA = 0
	EEPROM_SDA_OUT =  0;
	IIC_Delay();
	IIC_Delay();

	EEPROM_SCL_DIR = GPIO_DIR_IN; //SCL???????????,IO?????????,??????SCL?????????????????,???SCL = 1
	IIC_Delay();
	IIC_Delay();

	EEPROM_SDA_DIR = GPIO_DIR_IN; //SDA???????????,IO?????????,??????SDA?????????????????,???SDA = 1
	IIC_Delay();
	IIC_Delay();
}

/******************************************************************************
????????IIC_Transmit_Data
??  ?????IIC?????????1???????
??  ????Data???????????
??????????????????????(ACK)  0 - ACK  1 - NAK
******************************************************************************/
void IIC_Transmit_Data(uint8_t Data)
{
	uint8_t i;

	IICReceivedACK = IIC_INVALID_ACK;

	for (i = 0; i < 8; i++)
	{
		if (Data & 0x80)
			EEPROM_SDA_DIR = GPIO_DIR_IN; //SDA???????????,IO?????????,??????SDA?????????????????,???SDA = 1
		else
		{
			EEPROM_SDA_DIR = GPIO_DIR_OUT; //SDA???0,???SDA = 0
			EEPROM_SDA_OUT =  0;
		}
		IIC_Delay();
		IIC_Delay();

		EEPROM_SCL_DIR = GPIO_DIR_IN; //SCL???????????,IO?????????,??????SCL?????????????????,???SCL = 1
		IIC_Delay();
		IIC_Delay();

		EEPROM_SCL_DIR = GPIO_DIR_OUT; //SCL???0,???SCL = 0
		EEPROM_SCL_OUT =  0;
		IIC_Delay();

		//Data <<= 1;
		Data = (uint8_t)(Data << 1);
	}

	EEPROM_SDA_DIR = GPIO_DIR_IN; //????SDA???????
	IIC_Delay();
	IIC_Delay();

	EEPROM_SCL_DIR = GPIO_DIR_IN; //SCL???????????,IO?????????,??????SCL?????????????????,???SCL = 1
	IIC_Delay();
	IIC_Delay();

	IICReceivedACK = EEPROM_SDA_INPUT;

	EEPROM_SCL_DIR = GPIO_DIR_OUT; //SCL???0,???SCL = 0
	EEPROM_SCL_OUT =  0;
	IIC_Delay();
}

/******************************************************************************
????????IIC_Receive_Data
??  ?????IIC?????????1???????
??  ??????
??????????????????
******************************************************************************/
uint8_t IIC_Receive_Data(void)
{
	uint8_t i;
	uint8_t Data;

	Data = 0;

	EEPROM_SDA_DIR = GPIO_DIR_IN; //????SDA???????
	IIC_Delay();
	IIC_Delay();

	for (i = 0; i < 8; i++)
	{
		Data <<= 1;

		EEPROM_SCL_DIR = GPIO_DIR_IN; //SCL???????????,IO?????????,??????SCL?????????????????,???SCL = 1
		IIC_Delay();
		IIC_Delay();
		IIC_Delay();

		Data |= EEPROM_SDA_INPUT;

		EEPROM_SCL_DIR = GPIO_DIR_OUT; //SCL???0,???SCL = 0
		EEPROM_SCL_OUT =  0;
		IIC_Delay();
		IIC_Delay();
	}

	return Data;
}

/******************************************************************************
????????IIC_Transmit_ACK
??  ?????IIC???????????????
??  ????ACK?????????????? IIC_ACK  ??????
                              IIC_NAK  ?????
?????????
******************************************************************************/
void IIC_Transmit_ACK(uint8_t ACK)
{
	IICReceivedACK = IIC_INVALID_ACK;

	if (ACK > IIC_NAK)
		return;

	if (ACK)
		EEPROM_SDA_DIR = GPIO_DIR_IN; //SDA???????????,IO?????????,??????SDA?????????????????,???SDA = 1
	else
	{
		EEPROM_SDA_DIR = GPIO_DIR_OUT; //SDA???0,???SDA = 0
		EEPROM_SDA_OUT =  0;
	}
	IIC_Delay();

	EEPROM_SCL_DIR = GPIO_DIR_IN; //SCL???????????,IO?????????,??????SCL?????????????????,???SCL = 1
	IIC_Delay();
	IIC_Delay();

	EEPROM_SCL_DIR = GPIO_DIR_OUT; //SCL???0,???SCL = 0
	EEPROM_SCL_OUT =  0;
	IIC_Delay();
}

/******************************************************************************
????????IIC_Receive_ACK
??  ??????????????????????????
??  ??????
??????????????????????????????IIC_ACK         ??????
                                  IIC_NAK         ?????
                                  IIC_INVALID_ACK ??��????????(???????��???)
******************************************************************************/
uint8_t IIC_Receive_ACK(void)
{
	uint8_t ACK;

	ACK = IICReceivedACK;
	IICReceivedACK = IIC_INVALID_ACK;

	return ACK;
}

/******************************************************************************
????????IIC_Delay
??  ??????5us,????????????��???????
        ??????????IIC_5us_DELAY_CALIBRATION????��?????????5us????
??  ????ACK?????????????  0 - ACK  1 - NAK
?????????
******************************************************************************/
void IIC_Delay(void)
{
	uint8_t i;

	for (i = 0; i < IIC_FREQ_CALIBRATION; i++)
		nop();
}