1.IIC介绍

IIC全称为IIC协议,是一种串行通信协议,常用于连接各种传感器和外设设备。该协议使用双线I2C总线,包括串行数据线(SDA)和串行时钟线(SCL),通过在总线上发送和接收数据来实现设备之间的通信。

IIC协议具有简单、灵活、可靠和低成本等特点,被广泛应用于各种电子产品中,如传感器、存储器、显示器等

软件模拟IIC的读写原理详细讲解_起始信号

IIC架构示意图

2.IIC工作大致流程

①主机发送起始信号,从机读取起始信号表示开始接收数据。

②数据传输   其包含了主机向从机发送读写数据和主机从机之间的ACK信号。

③主机发送结束信号,从机读取结束信号表示这一次的数据传输结束。

3.起始信号

软件模拟IIC的读写原理详细讲解_数据传输_02

起始信号架构图

主机保持SCL电平为高电平期间SDA电平由高拉低,表示起始信号,当从机检测到起始信号后,开始数据的传输。

void SGP30_IIC_Start(void)
{
		SGP30_IIC_SCL(1);
		SGP30_IIC_SDA(1);
		SGP30_IIC_SDA(0);
		SGP30_IIC_SCL(0);
}

4.结束信号

软件模拟IIC的读写原理详细讲解_起始信号_03

结束信号架构图

主机保持SCL高电平,期间主机将SDA电平由低拉高,表示结束信号,当从机接收到结束信号后,结束当前数据传输。

void SGP30_IIC_Stop(void)
{
		SGP30_IIC_SDA(0);
		SGP30_IIC_SCL(1);
		SGP30_IIC_SDA(1);
}

5.数据传输过程

5.1数据传输

注意:在数据传输过程中,SCL时钟线一直是由主机操控,SDA是在主机需要得到从机的数据时从机操纵SDA线。当主机需要回馈ACK信号给从机时,主机操控SDA线

只有SCL电平为低电平时,从机控制的SDA才能进行电平的翻转,并且在SCL为高电平期间保持的电平高低才为有效的数据

SCL为高电平期间,SDA不会发生电平翻转。

软件模拟IIC的读写原理详细讲解_写数据_04

IIC数据传输过程电平变化图


5.2主机向发送从机写数据 eg:读取二氧化碳为例

1.主机发送起始信号

2.发送从机起始地址 0x54

0x54

01010100前七位为地址位,W表示第八位为写命令,表示让从机写数据

3.主机接收从机回复的ACK校验

4.主机发送命令码0x03,让从机采集数据

5.主机接收从机回复的ACK校验

6.主机发送0x00(无论是0x03还是0x00都是相关模块的文档内获取的)

7..主机接收从机回复的ACK校验

8.主机发送停止信号表示结束

void SGP30_SendCom(void)
{
	SGP30_IIC_Start();
	SGP30_IIC_SendByte(0x54);
	SGP30_IIC_ReceACK();
	SGP30_IIC_SendByte(0x03);
	SGP30_IIC_ReceACK();
	SGP30_IIC_SendByte(0x00);
	SGP30_IIC_ReceACK();
	SGP30_IIC_Stop();
}


软件模拟IIC的读写原理详细讲解_数据传输_05

IIC写示意图

5.3主机向发送从机读数据

1.主机发送起始信号

2.主机发送从机起始地址0x55

01010101前七位为地址,R表示第八位为读命令,表示主机读从机数据

3.主机接收从机的校验应答

4.主机接收从机发送的数据(从机通过拉高拉低SDA电平产生的)

5.主机回复从机ACK

6.主机发送结束信号

void SGP30_Receive_Date(uint8_t *pBuffer,uint16_t NumToRead)
{
	SGP30_IIC_Start();//1.开始
	SGP30_IIC_SendByte(0x55);//2.写入地址	
	SGP30_IIC_ReceACK();	//3.接收从机应答
	while(NumToRead--)
	{
		*pBuffer++=SGP30_IIC_ReceByte();
		if(NumToRead==0)  //接收完毕,回复ACK
		{
			SGP30_IIC_SendACK(1);
		}
		else
		{
			SGP30_IIC_SendACK(0);	//未接收完成,回复NACK
		}
	}
		SGP30_IIC_Stop();//产生一个停止条件	
}


软件模拟IIC的读写原理详细讲解_数据传输_06

IIC读示意图