MCU GPIO模拟I2C

来源:互联网 发布:类似onedrive的软件 编辑:程序博客网 时间:2024/05/17 02:59

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;
}













0 0
原创粉丝点击