IIC协议总结

IIC有两根线:时钟线和数据线

时钟线控制接受和发送。0:写,1:读。

IIC读写数据:

低电平写8位数据或一个应答位
高电平读。
通常情况下,时钟信号在低电平。
开始阶段(中间要有5us延时):D1C1D0C0
结束阶段(中间要有5us延时):C0D0C1D1
发送8位数据:低电平发,发完延时一会,再让时钟线变为高电平,之后再变为低电平
接受8位数据:时钟线变为高电平,延时一会,读取数据,延时一会,时钟线变为低电平。

void IIC_Start(void)
{
	SDA_OUT();
	SDA(1);
	delay_1us(5);
	SCL(1);
	delay_1us(5);
	SDA(0);
	delay_1us(5);
	SCL(0);
	delay_1us(5);
}
void IIC_Stop(void)
{
	SDA_OUT();
	SCL(0);
	delay_1us(5);
	SDA(0);
	delay_1us(5);
	SCL(1);
	delay_1us(5);
	SDA(1);
	delay_1us(5);
}
void IIC_Send_Ack(unsigned char ack)
{
	SDA_OUT();
	SCL(0);
	if(!ack)
	{
		SDA(0);
	}
	else 
	{
		SDA(1);
	}
	SCL(1);
	delay_1us(5);
	SCL(0);
}
unsigned char IIC_Wait_Ack(void)
{
	char ack = 0;
	unsigned char ack_flag = 10;
	SDA_IN();
	SDA(1);
	delay_1us(5);
	SCL(1);
	delay_1us(5);
	while(ack_flag--)
	{
		if(GETSDA()==0)
		{
			break;
		}
	}
	if(ack_flag==0)
	{
		 ack=1;
	}
	SDA_OUT();
	SCL(0);
	delay_1us(5);
	return ack;
}
void IIC_Write(unsigned char dat)
{
	int i=0;
	SDA_OUT();
	SCL(0);
	for(i=0;i<8;i++)
	{
		if(dat&(0x80>>i))
		{
			 SDA(1);
		}
		else
		{
			SDA(0);
		}
		delay_1us(5);
		SCL(1);
		delay_1us(5);
		SCL(0);
		delay_1us(5)
	}
}
unsigned char IIC_Read(void)
{
	unsigned char i,receive =0;
	SDA_IN(); //SDA设置输入
	for(i=0;i<8;i++)
	{
		SCL(1);
		delay_1us(5);
		if(GETSDA())
		{
			receive |= (0x80>>i);
		}
		delay_1us(5);
	}
	return receive;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一枚嵌入式学习同学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值