#include "soft_i2c.h"
bool SDA_PIN_Stat = true; //标记SDA_PIN输入输出状态
PIN_State SCLState;
PIN_Handle SCLHandle = NULL;
PIN_Config SCLCfg[] =
{
SCL_PIN | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX,
PIN_TERMINATE
};
PIN_State SDAoutState;
PIN_Handle SDAoutHandle = NULL;
PIN_Config SDAOutCfg[] =
{
SDA_PIN | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX,
PIN_TERMINATE
};
PIN_State SDAinState;
PIN_Handle SDAinHandle = NULL;
PIN_Config SDAinCfg[] =
{
SDA_PIN | PIN_GPIO_OUTPUT_DIS | PIN_INPUT_EN | PIN_PULLUP,
PIN_TERMINATE
};
static void SDA_OUT(void)
{
if(!SDA_PIN_Stat)
{
PIN_close(SDAinHandle);
SDAoutHandle = PIN_open(&SDAoutState, SDAOutCfg);
}
SDA_PIN_Stat = true;
}
static void SDA_IN(void)
{
if(SDA_PIN_Stat)
{
PIN_close(SDAoutHandle);
SDAinHandle = PIN_open(&SDAinState, SDAinCfg);
}
SDA_PIN_Stat = false;
}
void SOFT_I2C_PIN_Init(void)
{
SCLHandle = PIN_open(&SCLState, SCLCfg);
SDAoutHandle = PIN_open(&SDAoutState, SDAOutCfg);
SDA_PIN_Stat = true;
}
static void IIC_Start(void)
{
SDA_OUT();
SCL_HIGH;
SDA_HIGH;
SDA_LOW;
SCL_LOW;
}
static void IIC_Stop(void)
{
SDA_OUT();
SDA_LOW;
SCL_HIGH;
SDA_HIGH;
}
static uint8_t I2C_Wait_Ack(void)
{
uint8_t count = 0;
SDA_IN();
SCL_HIGH;
while(SDA_PIN_READ)
{
count++;
if(count > 250)
{
IIC_Stop();
return 1; //返回接收应答失败
}
}
SCL_LOW;
return 0; //返回接收应答成功
}
static void IIC_WriteByte(unsigned char data)
{
uint8_t i;
SDA_OUT();
SCL_LOW; //准备发送数据
for(i = 0; i < 8; i++)
{
if((data & 0x80) > 0)
SDA_HIGH;
else
SDA_LOW;
data<<=1;
SCL_HIGH;
SCL_LOW;
}
}
void Write_Add(uint8_t add, uint8_t comd,uint8_t wdata)
{
IIC_Start();
IIC_WriteByte(add<<1);
I2C_Wait_Ack();
IIC_WriteByte(comd);
I2C_Wait_Ack();
IIC_WriteByte(wdata);
I2C_Wait_Ack();
IIC_Stop();
}
评论0