/******************************************************************************
�� �� ����Simulated_IIC_Master.c
����������IO�˿�ģ���IIC(I2C)�����������ļ�
��    �ߣ�����
��    ����V1.0
��    �ڣ�2016.12.21
******************************************************************************/

#include "Simulated_IIC_2_Master.h"
 

#include "GPIO.h"
#include "s6j3360_GPIO.h"
uint8_t u8SimulatedIIC2ReceivedACK;


/*I2C  SCL-GPIO��������*/
void SIMULATED_IIC_2_SCL_DIR ( uint8_t x )
{
    if ( x == 1 )
    {
       GPIO_Set_Pin_Direction ( 1, 6, GPIO_DIR_OUT );
    }
    else
    {
       GPIO_Set_Pin_Direction ( 1, 6, GPIO_DIR_IN );
    }
}
/*I2C  SDA-GPIO��������*/
void SIMULATED_IIC_2_SDA_DIR ( uint8_t x )
{

    if ( x == 1 )
    {
        GPIO_Set_Pin_Direction ( 1, 5, GPIO_DIR_OUT );
    }
    else
    {
        GPIO_Set_Pin_Direction ( 1, 5, GPIO_DIR_IN );
    }
}


#define GPIO_IN   0
#define GPIO_OUT  1

void SIMULATED_IIC_2_SCL ( uint8_t x )
{
  GPIO_PODR1_POD6 = x; 
}

void SIMULATED_IIC_2_OUT_SDA ( uint8_t x )
{
  GPIO_PODR1_POD5 = x;
}

uint8_t  SIMULATED_IIC_2_IN_SDA(void)
{
  uint8_t value=0;
  value = GPIO_PIDR1_PID5;
  return value;
}
/******************************************************************************
��������IIC_Init
��  �ܣ���ʼ��IIC����
��  ������
����ֵ����
******************************************************************************/
void Simulated_IIC_2_Init(void)
{

    SIMULATED_IIC_2_SCL_DIR(0); //SCL������Ϊ����,IO��Ϊ����״̬,������SCL�ź���������������,��ʱSCL = 1
    Simulated_IIC_2_Delay();
    Simulated_IIC_2_Delay();

    SIMULATED_IIC_2_SDA_DIR(0); //SDA������Ϊ����,IO��Ϊ����״̬,������SDA�ź���������������,��ʱSDA = 1
    Simulated_IIC_2_Delay();
    Simulated_IIC_2_Delay();

    u8SimulatedIIC2ReceivedACK = SIMULATED_IIC_2_INVALID_ACK;
}

/******************************************************************************
��������IIC_Start
��  �ܣ���IIC�����Ϸ�����ʼ�ź�,����һ��IICͨ��
��  ������
����ֵ����
******************************************************************************/
void Simulated_IIC_2_Start(void)
{
    u8SimulatedIIC2ReceivedACK = SIMULATED_IIC_2_INVALID_ACK;

    SIMULATED_IIC_2_SDA_DIR(0); //SDA������Ϊ����,IO��Ϊ����״̬,������SDA�ź���������������,��ʱSDA = 1
    Simulated_IIC_2_Delay();
    Simulated_IIC_2_Delay();

    SIMULATED_IIC_2_SCL_DIR(0); //SCL������Ϊ����,IO��Ϊ����״̬,������SCL�ź���������������,��ʱSCL = 1
    Simulated_IIC_2_Delay();
    Simulated_IIC_2_Delay();

    SIMULATED_IIC_2_SDA_DIR(1); //SDA���0,��ʱSDA = 0
    SIMULATED_IIC_2_OUT_SDA(0);
    Simulated_IIC_2_Delay();
    Simulated_IIC_2_Delay();

    SIMULATED_IIC_2_SCL_DIR(1); //SCL���0,��ʱSCL = 0
    SIMULATED_IIC_2_SCL (0);
    Simulated_IIC_2_Delay();
}

/******************************************************************************
��������IIC_Stop
��  �ܣ���IIC�����Ϸ���ֹͣ�ź�,��ֹ��ǰIICͨ��
��  ������
����ֵ����
******************************************************************************/
void Simulated_IIC_2_Stop(void)
{
    u8SimulatedIIC2ReceivedACK = SIMULATED_IIC_2_INVALID_ACK;

    SIMULATED_IIC_2_SDA_DIR(1); //SDA���0,��ʱSDA = 0
    SIMULATED_IIC_2_OUT_SDA(0);
    Simulated_IIC_2_Delay();
    Simulated_IIC_2_Delay();

    SIMULATED_IIC_2_SCL_DIR(0); //SCL������Ϊ����,IO��Ϊ����״̬,������SCL�ź���������������,��ʱSCL = 1
    Simulated_IIC_2_Delay();
    Simulated_IIC_2_Delay();

    SIMULATED_IIC_2_SDA_DIR(0); //SDA������Ϊ����,IO��Ϊ����״̬,������SDA�ź���������������,��ʱSDA = 1
    Simulated_IIC_2_Delay();
    Simulated_IIC_2_Delay();
}

/******************************************************************************
��������IIC_Transmit_Data
��  �ܣ���IIC�����Ϸ���1�ֽ�����
��  ����Data�����͵�����
����ֵ��������������ȷ��(ACK)  0 - ACK  1 - NAK
******************************************************************************/
void Simulated_IIC_2_Transmit_Data(uint8_t Data)
{
    uint8_t i;

    u8SimulatedIIC2ReceivedACK = SIMULATED_IIC_2_INVALID_ACK;

    for (i = 0; i < 8; i++)
    {
        if (Data & 0x80)
            SIMULATED_IIC_2_SDA_DIR(0); //SDA������Ϊ����,IO��Ϊ����״̬,������SDA�ź���������������,��ʱSDA = 1
        else
        {
            SIMULATED_IIC_2_SDA_DIR (1); //SDA���0,��ʱSDA = 0
            SIMULATED_IIC_2_OUT_SDA(0);
        }
        Simulated_IIC_2_Delay();
        Simulated_IIC_2_Delay();

        SIMULATED_IIC_2_SCL_DIR(0); //SCL������Ϊ����,IO��Ϊ����״̬,������SCL�ź���������������,��ʱSCL = 1
        Simulated_IIC_2_Delay();
        Simulated_IIC_2_Delay();

        SIMULATED_IIC_2_SCL_DIR(1); //SCL���0,��ʱSCL = 0
        SIMULATED_IIC_2_SCL (0);
        Simulated_IIC_2_Delay();

        Data <<= 1;
    }

    SIMULATED_IIC_2_SDA_DIR(0); //����SDAΪ����״̬
    Simulated_IIC_2_Delay();
    Simulated_IIC_2_Delay();

    SIMULATED_IIC_2_SCL_DIR(0); //SCL������Ϊ����,IO��Ϊ����״̬,������SCL�ź���������������,��ʱSCL = 1
    Simulated_IIC_2_Delay();
    Simulated_IIC_2_Delay();

    u8SimulatedIIC2ReceivedACK = SIMULATED_IIC_2_IN_SDA();

    SIMULATED_IIC_2_SCL_DIR (1); //SCL���0,��ʱSCL = 0
    SIMULATED_IIC_2_SCL(0);
    Simulated_IIC_2_Delay();
}

/******************************************************************************
��������IIC_Receive_Data
��  �ܣ���IIC�����Ͻ���1�ֽ�����
��  ������
����ֵ�����յ�������
******************************************************************************/
uint8_t Simulated_IIC_2_Receive_Data(void)
{
    uint8_t i;
    uint8_t Data;

    Data = 0;

    SIMULATED_IIC_2_SDA_DIR(0); //����SDAΪ����״̬
    Simulated_IIC_2_Delay();
    Simulated_IIC_2_Delay();

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

        SIMULATED_IIC_2_SCL_DIR(0); //SCL������Ϊ����,IO��Ϊ����״̬,������SCL�ź���������������,��ʱSCL = 1
        Simulated_IIC_2_Delay();
        Simulated_IIC_2_Delay();
        Simulated_IIC_2_Delay();

        Data |= SIMULATED_IIC_2_IN_SDA();

        SIMULATED_IIC_2_SCL_DIR(1); //SCL���0,��ʱSCL = 0
        SIMULATED_IIC_2_SCL(0);
        Simulated_IIC_2_Delay();
        Simulated_IIC_2_Delay();
    }

    return Data;
}

/******************************************************************************
��������IIC_Transmit_ACK
��  �ܣ���IIC�����Ϸ���ȷ���ź�
��  ����ACK��ȷ���źŵ����ͣ� SIMULATED_IIC_2_ACK  �϶�Ӧ��
                              IIC_NAK  ��Ӧ��
����ֵ����
******************************************************************************/
void Simulated_IIC_2_Transmit_ACK(uint8_t ACK)
{
    u8SimulatedIIC2ReceivedACK = SIMULATED_IIC_2_INVALID_ACK;

    if (ACK > SIMULATED_IIC_2_NAK)
        return;

    if (ACK)
        SIMULATED_IIC_2_SDA_DIR(0); //SDA������Ϊ����,IO��Ϊ����״̬,������SDA�ź���������������,��ʱSDA = 1
    else
    {
        SIMULATED_IIC_2_SDA_DIR(1); //SDA���0,��ʱSDA = 0
        SIMULATED_IIC_2_OUT_SDA(0);
    }
    Simulated_IIC_2_Delay();

    SIMULATED_IIC_2_SCL_DIR(0); //SCL������Ϊ����,IO��Ϊ����״̬,������SCL�ź���������������,��ʱSCL = 1
    Simulated_IIC_2_Delay();
    Simulated_IIC_2_Delay();

    SIMULATED_IIC_2_SCL_DIR(1); //SCL���0,��ʱSCL = 0
    SIMULATED_IIC_2_SCL(0);
    Simulated_IIC_2_Delay();
}

/******************************************************************************
��������IIC_Receive_ACK
��  �ܣ���ȡ�������Ͻ��յ���ȷ���ź�
��  ������
����ֵ��������������ȷ���ź����ͣ�Simulated_IIC_ACK        �϶�Ӧ��
                                  SIMULATED_IIC_2_NAK         ��Ӧ��
                                  IIC_INVALID_ACK ��Ч��Ӧ���ź�(Ӧ���źŻ�δ�յ�)
******************************************************************************/
uint8_t Simulated_IIC_2_Receive_ACK(void)
{
    uint8_t ACK;

    ACK = u8SimulatedIIC2ReceivedACK;
    u8SimulatedIIC2ReceivedACK = SIMULATED_IIC_2_INVALID_ACK;

    return ACK;
}

/******************************************************************************
��������IIC_Delay
��  �ܣ���ʱ5us,�����շ������е�ʱ�����
        ע�⣺�������IIC_5us_DELAY_CALIBRATION����У׼��ʱʱ����5us����
��  ����ACK��ȷ���źŵ�����  0 - ACK  1 - NAK
����ֵ����
******************************************************************************/
void Simulated_IIC_2_Delay(void)
{
    uint8_t i;

    for (i = 0; i < SIMULATED_IIC_2_FREQ_CALIBRATION; i++)
          asm("nop");
}