IIC通信协议

概述

之前在学习DS18B20温度传感器过程中,采用了1-wire单线总线的数据传输模式,而最近刚到手的GY-906非接触式温度采集模块则是采用的IIC通信协议,由此我打算更深一步的了解IIC在51单片机的工作原理。

1.IIC工作原理

I2C总线是PHLIPS公司推出的一种串行总线,它只有两根双向信号线。一根是数据线SDA(serial data I/O),另一根是时钟线SCL(serial clock)。
如下图所示,IIC总线上可以挂多个器件,而每个器件都有唯一的地址,这样可以标识通信目标。数据的通信的方式采用主从方式,主机负责主动联系从机,而从机则被动回应数据。
在这里插入图片描述
I2C总线通过上拉电阻接正电源。当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。

2.I2C总线传输协议

SCL为高电平期间,数据线上的数据必须保持稳定,只有SCL信号为低电平期间,SDA状态才允许变化。
在这里插入图片描述

3.I2C的起始和终止信号

SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
在这里插入图片描述

4.I2C字节的传送与应答

每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。
应答位的作用
主机在发送数据时,每次发送一字节数据,都需要读取从机应答位,当从机空闲可以接收该字节数据时,从机会发出应答(一帧数据的第9位为“0”),当从机正忙于其他工作的处理来不及接收主机发送的数据时,从机会发出非应答(一帧数据的第9位为“1”)主机则应发出终止信号以结束数据的继续传送,主机通过从机发出的应答位来判断从机是否成功接收数据。
当主机接收数据时,它收到最后一个数据字节后,必须向从机发出一个结束传送的信号。这个信号是由对从机的“非应答”来实现的。然后,从机释放SDA线,以允许主机产生终止信号。
接下来为IIC的读写数据流程:
在这里插入图片描述在这里插入图片描述
I2C总线的数据传送有严格的时序要求。I2C总线的起始信号、终止信号、发送“0”及发送“1”的模拟时序 :51单片机是没有IIC外接引脚的,所以这里我们一般通过软件编程的方式连普通IO口来模拟IIC的数据传输和应答。
在这里插入图片描述

5.代码部分

(1)I2C起始信号程序

void I2C_Start()
{
	SCL = 1;
	_nop_(); //1.08506us
	SDA = 1;
	delay_5us();
	SDA = 0;
	delay_5us();
} 

(2)I2C终止信号程序

void I2C_Stop()
{
	SDA = 0;
	_nop_();
	SCL = 1;
	delay_5us();
	SDA = 1;
	delay_5us();
}

(3)I2C主机检测从机应答

bit Test_ACK()
{
	SCL =  1;	
	delay_5us();
	if (SDA)
	{
		SCL = 0;
		I2C_Stop();
		return(0);
	}
	else
	{
		SCL = 0;
		return(1);
	}
}

(4)I2C主机发送应答

void Master_ACK(bit i)
{
	SCL = 0;
	_nop_();
	if (i)
	{
		SDA = 0;
	}
	else
	{
		SDA = 1;
	}
	_nop_();
	SCL = 1;//数据保持稳定
	_nop_();
	SCL = 0;
	_nop_();
	SDA = 1;
	_nop_();
}

这里需要注意得是主机做的都是编程控制,从机做的都是自主控制,也可以说是硬件控制,如主机给应答信号是编程控制,但是从机给应答信号是硬件控制,我们只需要检查在SDA为高期间,SCL保持低电平一些时间,即可判定从机给了主机应答信号。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值