/******************************************************************************
文 件 名:Simulated_IIC_Master.c
功能描述:IO端口模拟的IIC(I2C)主机函数库文件
作 者:张暄
版 本:V1.0
日 期:2016.12.21
******************************************************************************/
#include "LED_Driver\Simulated_IIC_2_Master.h"
#include "Components.h"
#include "Application.h"
unsigned char u8SimulatedIIC2ReceivedACK;
/******************************************************************************
函数名:IIC_Init
功 能:初始化IIC总线
参 数:无
返回值:无
******************************************************************************/
void Simulated_IIC_2_Init(void)
{
RTE_GPIO_Config(IIC_SCL_27030,RTE_GPIO_DIR_IN);
//SIMULATED_IIC_2_SCL_DIR = 0; //SCL被设置为输入,IO口为高阻状态,总线上SCL信号由上拉电阻拉高,此时SCL = 1
Simulated_IIC_2_Delay();
Simulated_IIC_2_Delay();
RTE_GPIO_Config(IIC_SDA_27030,RTE_GPIO_DIR_IN);
//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;
RTE_GPIO_Config(IIC_SDA_27030,RTE_GPIO_DIR_IN);
//SIMULATED_IIC_2_SDA_DIR = 0; //SDA被设置为输入,IO口为高阻状态,总线上SDA信号由上拉电阻拉高,此时SDA = 1
Simulated_IIC_2_Delay();
Simulated_IIC_2_Delay();
RTE_GPIO_Config(IIC_SCL_27030,RTE_GPIO_DIR_IN);
//SIMULATED_IIC_2_SCL_DIR = 0; //SCL被设置为输入,IO口为高阻状态,总线上SCL信号由上拉电阻拉高,此时SCL = 1
Simulated_IIC_2_Delay();
Simulated_IIC_2_Delay();
RTE_GPIO_Config(IIC_SDA_27030, RTE_GPIO_DIR_OUT|RTE_GPIO_LEVEL_LOW);
//SIMULATED_IIC_2_SDA_DIR = 1; //SDA输出0,此时SDA = 0
//SIMULATED_IIC_2_OUT_SDA = 0;
Simulated_IIC_2_Delay();
Simulated_IIC_2_Delay();
RTE_GPIO_Config(IIC_SCL_27030, RTE_GPIO_DIR_OUT|RTE_GPIO_LEVEL_LOW);
//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;
RTE_GPIO_Config(IIC_SDA_27030, RTE_GPIO_DIR_OUT|RTE_GPIO_LEVEL_LOW);
//SIMULATED_IIC_2_SDA_DIR = 1; //SDA输出0,此时SDA = 0
//SIMULATED_IIC_2_OUT_SDA = 0;
Simulated_IIC_2_Delay();
Simulated_IIC_2_Delay();
RTE_GPIO_Config(IIC_SCL_27030,RTE_GPIO_DIR_IN);
//SIMULATED_IIC_2_SCL_DIR = 0; //SCL被设置为输入,IO口为高阻状态,总线上SCL信号由上拉电阻拉高,此时SCL = 1
Simulated_IIC_2_Delay();
Simulated_IIC_2_Delay();
RTE_GPIO_Config(IIC_SDA_27030,RTE_GPIO_DIR_IN);
//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(unsigned char Data)
{
unsigned char i;
u8SimulatedIIC2ReceivedACK = SIMULATED_IIC_2_INVALID_ACK;
//主机发送器件地址
for (i = 0; i < 8; i++)
{
if (Data & 0x80)
RTE_GPIO_Config(IIC_SDA_27030,RTE_GPIO_DIR_IN);//sda线上是1
//SIMULATED_IIC_2_SDA_DIR = 0; //SDA被设置为输入,IO口为高阻状态,总线上SDA信号由上拉电阻拉高,此时SDA = 1
else
{
RTE_GPIO_Config(IIC_SDA_27030, RTE_GPIO_DIR_OUT|RTE_GPIO_LEVEL_LOW);//sda线上是0
//SIMULATED_IIC_2_SDA_DIR = 1; //SDA输出0,此时SDA = 0
//SIMULATED_IIC_2_OUT_SDA = 0;
}
Simulated_IIC_2_Delay();
Simulated_IIC_2_Delay();
RTE_GPIO_Config(IIC_SCL_27030,RTE_GPIO_DIR_IN);//读取sda上的数据
//SIMULATED_IIC_2_SCL_DIR = 0; //SCL被设置为输入,IO口为高阻状态,总线上SCL信号由上拉电阻拉高,此时SCL = 1
Simulated_IIC_2_Delay();
Simulated_IIC_2_Delay();
RTE_GPIO_Config(IIC_SCL_27030, RTE_GPIO_DIR_OUT|RTE_GPIO_LEVEL_LOW);//拉低scl,允许sda变化
//SIMULATED_IIC_2_SCL_DIR = 1; //SCL输出0,此时SCL = 0
//SIMULATED_IIC_2_SCL = 0;
Simulated_IIC_2_Delay();
Data <<= 1;
}
//主机接收应答
RTE_GPIO_Config(IIC_SDA_27030,RTE_GPIO_DIR_IN);//主机释放总线,从机在sda发送数据
//SIMULATED_IIC_2_SDA_DIR = 0; //设置SDA为输入状态
Simulated_IIC_2_Delay();
Simulated_IIC_2_Delay();
RTE_GPIO_Config(IIC_SCL_27030,RTE_GPIO_DIR_IN);//scl高电平,为了读取从机应答
//SIMULATED_IIC_2_SCL_DIR = 0; //SCL被设置为输入,IO口为高阻状态,总线上SCL信号由上拉电阻拉高,此时SCL = 1
Simulated_IIC_2_Delay();
Simulated_IIC_2_Delay();
u8SimulatedIIC2ReceivedACK = RTE_GPIO_Get_Level(IIC_SDA_27030);//读取从机应答
//u8SimulatedIIC2ReceivedACK = SIMULATED_IIC_2_IN_SDA;
RTE_GPIO_Config(IIC_SCL_27030, RTE_GPIO_DIR_OUT|RTE_GPIO_LEVEL_LOW);//拉低scl,允许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字节数据
参 数:无
返回值:接收到的数据
******************************************************************************/
unsigned char Simulated_IIC_2_Receive_Data(void)
{
unsigned char i;
unsigned char Data;
Data = 0;
RTE_GPIO_Config(IIC_SDA_27030,RTE_GPIO_DIR_IN);//主机释放总线,从机在sda发送数据
//SIMULATED_IIC_2_SDA_DIR = 0; //设置SDA为输入状态
Simulated_IIC_2_Delay();
Simulated_IIC_2_Delay();
for (i = 0; i < 8; i++)
{
Data <<= 1;
RTE_GPIO_Config(IIC_SCL_27030,RTE_GPIO_DIR_IN);////scl拉高,读取从机发送到总线的数据
//SIMULATED_IIC_2_SCL_DIR = 0; //SCL被设置为输入,IO口为高阻状态,总线上SCL信号由上拉电阻拉高,此时SCL = 1
Simulated_IIC_2_Delay();
Simulated_IIC_2_Delay();
Simulated_IIC_2_Delay();
Data |= RTE_GPIO_Get_Level(IIC_SDA_27030);//读取从机数据
//Data |= SIMULATED_IIC_2_IN_SDA;
RTE_GPIO_Config(IIC_SCL_27030, RTE_GPIO_DIR_OUT|RTE_GPIO_LEVEL_LOW);//拉低scl,允许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(unsigned char ACK)
{
u8SimulatedIIC2ReceivedACK = SIMULATED_IIC_2_INVALID_ACK;
if (ACK > SIMULATED_IIC_2_NAK)
return;
if (ACK)
RTE_GPIO_Config(IIC_SDA_27030,RTE_GPIO_DIR_IN);//用参数来确定是否发送应答信号
//SIMULATED_IIC_2_SDA_DIR = 0; //SDA被设置为输入,IO口为高阻状态,总线上SDA信号由上拉电阻拉高,此时SDA = 1
else
{
RTE_GPIO_Config(IIC_SDA_27030, RTE_GPIO_DIR_OUT|RTE_GPIO_LEVEL_LOW);//用参数来确定是否发送应答信号
//SIMULATED_IIC_2_SDA_DIR = 1; //SDA输出0,此时SDA = 0
//SIMULATED_IIC_2_OUT_SDA = 0;
}
Simulated_IIC_2_Delay();
RTE_GPIO_Config(IIC_SCL_27030,RTE_GPIO_DIR_IN);//scl高电平,为了读取从机应答
//SIMULATED_IIC_2_SCL_DIR = 0; //SCL被设置为输入,IO口为高阻状态,总线上SCL信号由上拉电阻拉高,此时SCL = 1
Simulated_IIC_2_Delay();
Simulated_IIC_2_Delay();
RTE_GPIO_Config(IIC_SCL_27030, RTE_GPIO_DIR_OUT|RTE_GPIO_LEVEL_LOW);//拉低scl,允许sda变化
//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 无效的应答信号(应答信号还未收到)
******************************************************************************/
unsigned char Simulated_IIC_2_Receive_ACK(void)
{
unsigned char 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)
{
unsigned char i;
for (i = 0; i < SIMULATED_IIC_2_FREQ_CALIBRATION; i++)
__NOP();
}
/*
unsigned char u8SimulatedIIC2Slave = 0U;
void Simulated_IIC_2_Slave_Service(void)
{
if (u8SimulatedIIC2Slave == 0U)
{
if (stIS31Ctr.u8IS31Refresh >= 1U)
{
u8SimulatedIIC2Slave = 1U;
}
else if ((stPCF85063Ctr.u8PCF85063Read == 1U) || (stPCF85063Ctr.u8PCF85063Write == 1U))
{
u8SimulatedIIC2Slave = 2U;
}
}
if (u8SimulatedIIC2Slave == 1U)
{
IS31_Service();
if (stIS31Ctr.u8IS31Refresh == 0U)
{
u8SimulatedIIC2Slave = 0U;
}
}
else if (u8SimulatedIIC2Slave == 2U)
{
PCF85063_Service();
if ((stPCF85063Ctr.u8PCF85063Read == 0U) && (stPCF85063Ctr.u8PCF85063Write == 0U))
{
u8SimulatedIIC2Slave = 0U;
}
}
}
*/