extern void MCU_DlyXus(INT32U nus);
//设置gpio方向:输入或者输出
static void GPIO_BitDir_IN()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GP_GetPin(GPIO_I2C_DAT);
GPIO_Init(GP_GetPort(GPIO_I2C_DAT), &GPIO_InitStructure);
}
static void GPIO_BitDir_OUT()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GP_GetPin(GPIO_I2C_DAT);
GPIO_Init(GP_GetPort(GPIO_I2C_DAT), &GPIO_InitStructure);
}
static void GPIO_Clk_BitDir_OUT()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd =
GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GP_GetPin(GPIO_I2C_CLK);
GPIO_Init(GP_GetPort(GPIO_I2C_CLK), &GPIO_InitStructure);
}
void I2C_Delay(void)
{
MCU_DlyXus(4);
}
void I2C_Start(void)
{
GPIO_BitSet(GPIO_I2C_DAT,IOHILO_HI);
I2C_Delay();
GPIO_BitSet(GPIO_I2C_CLK,IOHILO_HI);
I2C_Delay();
GPIO_BitSet(GPIO_I2C_DAT,IOHILO_LO);
I2C_Delay();
GPIO_BitSet(GPIO_I2C_CLK,IOHILO_LO);
I2C_Delay();
return;
}
void I2C_Stop(void)
{
I2C_Delay();
GPIO_BitSet(GPIO_I2C_DAT,IOHILO_LO);
I2C_Delay();
GPIO_BitSet(GPIO_I2C_CLK,IOHILO_HI);
I2C_Delay();
GPIO_BitSet(GPIO_I2C_DAT,IOHILO_HI);
}
void I2C_ReadAck(void)
{
GPIO_BitSet(GPIO_I2C_DAT,IOHILO_LO);
GPIO_BitSet(GPIO_I2C_CLK,IOHILO_HI);
I2C_Delay();
GPIO_BitSet(GPIO_I2C_CLK,IOHILO_LO);
I2C_Delay();
}
BOOL I2C_WriteByte(INT8U cData)
{
INT8U i;
GPIO_BitSet(GPIO_I2C_CLK,IOHILO_LO);
I2C_Delay();
for(i = 0; i < 8; i++)
{
if ((cData & 0x80) == 0x00)
{
GPIO_BitSet(GPIO_I2C_DAT,IOHILO_LO) ;
}
else
{
GPIO_BitSet(GPIO_I2C_DAT,IOHILO_HI);
}
cData <<= 1;
I2C_Delay();
GPIO_BitSet(GPIO_I2C_CLK,IOHILO_HI);
I2C_Delay();
GPIO_BitSet(GPIO_I2C_CLK,IOHILO_LO);
I2C_Delay();
}
I2C_Delay();
GPIO_BitDir_IN();
GPIO_BitSet(GPIO_I2C_DAT,IOHILO_HI);
I2C_Delay();
GPIO_BitSet(GPIO_I2C_CLK,IOHILO_HI);
I2C_Delay();
i = GPIO_BitGet(GPIO_I2C_DAT);
GPIO_BitSet(GPIO_I2C_CLK,IOHILO_LO);
I2C_Delay();
GPIO_BitSet(GPIO_I2C_DAT,IOHILO_LO);
GPIO_BitDir_OUT() ;
if (i == 0x00)
{
return TRUE;
}
return FALSE;
}
char I2C_ReadByte(void)
{
INT8U i,r;
GPIO_BitDir_IN();
GPIO_BitSet(GPIO_I2C_DAT,IOHILO_HI);
r = 0;
for (i = 0; i < 8; i++)
{
I2C_Delay();
GPIO_BitSet(GPIO_I2C_CLK,IOHILO_HI);
I2C_Delay();
r <<= 1;
if (GPIO_BitGet(GPIO_I2C_DAT) != 0x00)
{
r++;
}
I2C_Delay();
GPIO_BitSet(GPIO_I2C_CLK,IOHILO_LO);
}
I2C_Delay();
GPIO_BitSet(GPIO_I2C_DAT,IOHILO_LO);
GPIO_BitDir_OUT() ;
I2C_Delay();
return(r);
}
void I2C_Initialize(void)
{
GPIO_Clk_BitDir_OUT();
GPIO_BitDir_OUT();
GPIO_BitSet(GPIO_I2C_DAT,IOHILO_HI);
GPIO_BitSet(GPIO_I2C_CLK,IOHILO_HI);
return;
}