I2C通讯时序

一、I2C串行总线的组成及工作原理

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

二、I2C总线传输协议

I2C通信一共包含五个时序:起始,终止,应答,发送(写)和接受(读),这五个时序分别由不同的脉冲组合来决定。

数据位有效性:

SCL为高电平期间,SDA必须保持稳定;
SCL为低电平期间,SDA状态允许变化。
在这里插入图片描述

起始/终止时序:

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

应答时序:

每个字节8位,先传最高位,后面跟随一位应答位(即一帧9位)
应答位:从机空闲发出应答“0”、从机繁忙发出非应答“1”;
此时主机应发出终止信号以结束数据的继续传送,主机通过从机发出的应答位来判断从机是否成功接收数据。
(*应答位是从机发出的,数据从主机到从机)
在这里插入图片描述

发送(写)时序:

数据线 起始信号+从机地址(7位)+数据传送方向位(R/T=1/0)
“0”表示主机发送数据(T),“1”表示主机接收数据(R)。
在这里插入图片描述
关于从机地址:这里以AT24C02为例,A0A1A2为地址输入(即I2C可以挂2^3=8个该从机)。
当A0=A1=A2=0时,地址为1010 0000=0xa0。

在这里插入图片描述

接收(读)时序:

读操作与写操作的启动方式相同。共有三种读取操作:当前地址读取,随机地址读取和顺序读取。
数据线 起始信号+从机地址(7位)+数据传送方向位(R/T=1/0)
“0”表示主机发送数据(T),“1”表示主机接收数据(R)。
在这里插入图片描述

软件模拟I2C通讯:

在这里插入图片描述

以上 可知

I2C起始时序程序

void I2C_Start()
{
	SCL = 1;
	_nop_(); //空操作,占一个机器周期1.08506
	SDA = 1;
	delay_5us();
	SDA = 0;
	delay_5us();
} 

I2C终止时序程序

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

主机检测从机应答

bit Test_ACK()
{
	SCL =  1;	//在时钟总线为高电平期间可以读取应答信号
	delay_5us();
	if (SDA)
	{
		SCL = 0;
		I2C_Stop();
		return(0);
	}
	else
	{
		SCL = 0;
		return(1);
	}
}

主机发送应答

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_();
}

参考链接:
[1]: I2C总线规格书和用户手册–NXP
[2]:AT24C02_DataSheet
[3]:清翔电子

发布了1 篇原创文章 · 获赞 4 · 访问量 77

猜你喜欢

转载自blog.csdn.net/qq_43063744/article/details/104797819
今日推荐