MCU GPIO模拟I2C

本文详细介绍了I2C通信的初始化过程以及如何通过I2C接口进行数据的读写操作,包括启动、停止、读取应答、写入字节和读取字节的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

缥缈孤鸿_jason

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值