/***************************************************************
 *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
 *文件名:  lib_iic.c
 *作  者:  Liut
 *版  本:  V1.00
 *日  期:  2017/07/14
 *描  述:  IIC模块库函数
 *备  注:  适用于 ES8P508x芯片
 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
 ***************************************************************/
#include "lib_iic.h"

/***************************************************************
  函数名:I2C_Init
  描  述:I2C初始化
  输入值:I2C_InitStruct:初始化配置结构体地址
  输出值:无
  返回值:无
 ***************************************************************/
void I2C_Init(I2C_InitStruType* I2C_InitStruct)
{
    uint32_t temp;

    if(I2C_InitStruct->I2C_Mode == I2C_Mode_Master)
    {
        if(I2C_InitStruct->I2C_16XSamp != DISABLE)
            temp = SystemCoreClock/24/I2C_InitStruct->I2C_Clk - 1;
        else
            temp = SystemCoreClock/16/I2C_InitStruct->I2C_Clk - 1;

        if(temp > 254)
            temp = 255;

        I2C0->CON.TJP = temp;      //设置时基定时器周期

        I2C0->CON.TJE = 0x1;       //使能时基定时器
    }

    I2C0->CON.SDASE = I2C_InitStruct->I2C_16XSamp;  //16倍采样设置
    I2C0->CON.SCKSE = I2C_InitStruct->I2C_16XSamp; 
    I2C0->CON.SCKOD = I2C_InitStruct->I2C_SclOd;    //端口开漏设置
    I2C0->CON.SDAOD = I2C_InitStruct->I2C_SdaOd;
    I2C0->MOD.MS = I2C_InitStruct->I2C_Mode;       //主从模式设置
    I2C0->MOD.SPAE = I2C_InitStruct->I2C_AutoStop; //自动停止设置
    I2C0->MOD.SRAE = I2C_InitStruct->I2C_AutoCall; //自动寻呼设置
}

/***************************************************************
  函数名:I2C_ITConfig
  描  述:I2C中断配置
  输入值:I2C_IT:需要配置的中断 、 NewState:使能或关闭
  输出值:无
  返回值:无
 ***************************************************************/
void I2C_ITConfig(I2C_TYPE_IT I2C_IT,TYPE_FUNCEN NewState)
{
    if (NewState != DISABLE)
        I2C0->IE.Word |= (uint32_t)I2C_IT;
    else
        I2C0->IE.Word &= ~((uint32_t)I2C_IT);
}

/***************************************************************
  函数名:I2C_SendAddress
  描  述:I2C发送从机地址
  输入值:I2C_Address:7位从机地址,左对齐 0x00~0xfe 、 Mode:读或写
  输出值:无
  返回值:无
 ***************************************************************/
void I2C_SendAddress(uint8_t I2C_Address,I2C_TYPE_RWMODE Mode)
{
    I2C0->CON.SA = I2C_Address>>1;
    I2C0->CON.RW = Mode;
}

/***************************************************************
  函数名:I2C_SetAddress
  描  述:I2C设置地址(适用于从机模式)
  输入值:I2C_Address:7位从机地址,左对齐 0x00~0xfe
  输出值:无
  返回值:无
 ***************************************************************/
void I2C_SetAddress(uint8_t I2C_Address)
{
    I2C0->CON.SA = I2C_Address>>1;
}

/***************************************************************
  函数名:I2C_RecModeConfig
  描  述:I2C配置接收模式
  输入值:RecType:接收模式
  输出值:无
  返回值:无
 ***************************************************************/
void I2C_RecModeConfig(I2C_TYPE_RECMODE RecType)
{
    I2C0->MOD.RDM = RecType;
}

/***************************************************************
  函数名:I2C_TBIMConfig
  描  述:I2C发送缓冲器空中断模式选择
  输入值:Type:空中断模式
  输出值:无
  返回值:无
 ***************************************************************/
void I2C_TBIMConfig(I2C_TYPE_TRBIM Type)
{
    I2C0->IE.TBIM = Type;
}

/***************************************************************
  函数名:I2C_RBIMConfig
  描  述:I2C接收缓冲器满中断模式选择
  输入值:Type:满中断模式
  输出值:无
  返回值:无
 ***************************************************************/
void I2C_RBIMConfig(I2C_TYPE_TRBIM Type)
{
    I2C0->IE.RBIM = Type;
}

/***************************************************************
  函数名:I2C_AckDelay
  描  述:I2C应答延时配置
  输入值:Type:延时时间 、 NewStatus:使能、失能
  输出值:无
  返回值:无
 ***************************************************************/
void I2C_AckDelay(I2C_TYPE_ADLY Type,TYPE_FUNCEN NewStatus)
{
    I2C0->MOD.ADLY = Type;
    I2C0->MOD.ADE = NewStatus;
}

/***************************************************************
  函数名:I2C_TISConfig
  描  述:I2C数据帧传输间隔设置
  输入值:Time:传输间隔
  输出值:无
  返回值:无
 ***************************************************************/
void I2C_TISConfig(I2C_TYPE_TIS Time)
{
    I2C0->MOD.TIS = Time;
}

/***************************************************************
  函数名:I2C_SendByte
  描  述:I2C字节发送
  输入值:Byte:字节数据
  输出值:无
  返回值:无
 ***************************************************************/
void I2C_SendByte(uint8_t Byte)
{
    I2C0->TBW.Byte[0] = Byte;
}

/***************************************************************
  函数名:I2C_SendHalfWord
  描  述:I2C半字发送
  输入值:HalfWord:半节数据
  输出值:无
  返回值:无
 ***************************************************************/
void I2C_SendHalfWord(uint16_t HalfWord)
{
    I2C0->TBW.HalfWord[0] = HalfWord;
}

/***************************************************************
  函数名:I2C_SendWord
  描  述:I2C字发送
  输入值:Word:字数据
  输出值:无
  返回值:无
 ***************************************************************/
void I2C_SendWord(uint32_t Word)
{
    I2C0->TBW.Word = Word;
}

/***************************************************************
  函数名:I2C_RecByte
  描  述:I2C接收-字节
  输入值:无
  输出值:无
  返回值:接收的数据
 ***************************************************************/
uint8_t I2C_RecByte(void)
{
    return I2C0->RBR.Byte[0] ;
}

/***************************************************************
  函数名:I2C_RecHalfWord
  描  述:I2C接收-半字
  输入值:无
  输出值:无
  返回值:接收的数据
 ***************************************************************/
uint16_t I2C_RecHalfWord(void)
{
    return I2C0->RBR.HalfWord[0];
}

/***************************************************************
  函数名:I2C_RecWord
  描  述:I2C接收-字
  输入值:无
  输出值:无
  返回值:接收的数据
 ***************************************************************/
uint32_t I2C_RecWord(void)
{
    return I2C0->RBR.Word ;
}

/***************************************************************
  函数名:I2C_GetRWMode
  描  述:I2C工作读写状态读取
  输入值:无
  输出值:无
  返回值:读/写
 ***************************************************************/
I2C_TYPE_RWMODE I2C_GetRWMode(void)
{
    I2C_TYPE_RWMODE Status = I2C_Mode_Write;

    if(I2C0->CON.RW != 0)
        Status = I2C_Mode_Read;
    else
        Status = I2C_Mode_Write;

    return Status;
}

/***************************************************************
  函数名:I2C_GetTBStatus
  描  述:I2C获取发送缓冲寄存器状态,TB0-TB3全空则返回SET,否则返回RESET
  输入值:无
  输出值:无
  返回值:SET/RESET
 ***************************************************************/
FlagStatus I2C_GetTBStatus(void)
{
    FlagStatus bitstatus = RESET;

    if((I2C0->STA.Word&(uint32_t)0x0f00) != (uint32_t)0x0f00)
        bitstatus = RESET;
    else
        bitstatus = SET;

    return  bitstatus;
}

/***************************************************************
  函数名:I2C_GetFlagStatus
  描  述:I2C获取标志位状态
  输入值:I2C_Flag:选择需要的标志位
  输出值:无
  返回值:SET/RESET
 ***************************************************************/
FlagStatus I2C_GetFlagStatus(I2C_TYPE_FLAG I2C_Flag)
{
    FlagStatus bitstatus = RESET;

    if ((I2C0->IF.Word & (uint32_t)I2C_Flag) != RESET)
        bitstatus = SET;
    else
        bitstatus = RESET;

    return  bitstatus;
}

/*************************************
  函数名:I2C_GetITStatus
  描  述:获取中断使能状态
  输入值:I2C_Flag 中断使能位
  中断类型
  返回值:SET/RESET
 **************************************/
FlagStatus I2C_GetITStatus( I2C_TYPE_IT I2C_Flag)
{
    FlagStatus status = RESET;

    if ((I2C0->IE.Word & (uint32_t)I2C_Flag) == RESET)
        return status;

    if ((I2C0->IF.Word & (uint32_t)I2C_Flag) != RESET)
        status = SET;

    return status;
}

/***************************************************************
  函数名:I2C_ClearITPendingBit
  描  述:I2C中断标志清除
  输入值:I2C_IT:标志位
  输出值:无
  返回值:无
 ***************************************************************/
void I2C_ClearITPendingBit(I2C_CLR_IF I2C_IT)
{
    I2C0->IF.Word = (uint32_t)I2C_IT;
}

/*************************END OF FILE**********************/