前言
I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息(词条节选自百度百科)。在众多通信通信协议中,IIC总线因其简单的物理结构,在其诞生后的几十年仍然被广泛的应用。
一、IIC通信过程包含的几个操作
(1)起始信号
在SCL高电平期间,SDA由高变低
(2)停止信号
在SCL高电平期间,SDA由低变高
(3)CPU向IIC总线发送一个字节数据(8bits)
CPU设置IIC总线的SDA口为输入,然后在SCL口的电平跳变下,一位一位的向IIC总线写入数据。在时钟的上升沿通知从机读取SDA上的数据,所以在写入一位数据之后要将SCL拉高,延时之后再拉低,时序图如下图所示。
(4)CPU从IIC总线读取一个字节的数据
CPU设置IIC总线的SDA口为输出,然后在SCL口的电平跳变下,一位一位的从IIC总线读出数据。在时钟的上升沿通知从机读取SDA上的数据,在时钟下降沿通知从机更新数据,所以在读出一位数据之前要将SCL拉高,延时之后再拉低,时序图如下图所示。
(5)CPU向IIC总线发送一个ACK信号
先将SDA拉低,在SDA处于低电平期间,使SCL产生一个脉冲(先拉高,延时后拉低),然后再将SDA拉高。时序图如下图所示。
(6)CPU从IIC总线接收一个ACK信号
先将SDA拉高,在SDA处于高电平期间使SCL产生一个脉冲(先拉高,延时后拉低),在SCL被拉高之后,CPU方可读取IIC总线上的从机ACK信号,CPU向IIC总线发送一个非应答信号同下图。时序图如下图所示,CPU向IIC总线发送一个非应答信号同下图。
二、完整的IIC数据读写过程
1.完整的IIC写数据过程
过程如下图(示例):
2.完整的IIC读数据过程
过程如下图(示例):
第一部分和第二部分所讲,建议配合附录中的代码去理解,这样思路会更加清晰。
附录
1.IIC起始信号
void I2C_Start(void)
{
SDA_High(); //SDA=1
SCL_High(); //SCL=1
Delay();
SDA_Low();
Delay();
SCL_Low();
Delay();
}
2.IIC停止信号
void