1.IIC介绍
IIC全称为IIC协议,是一种串行通信协议,常用于连接各种传感器和外设设备。该协议使用双线I2C总线,包括串行数据线(SDA)和串行时钟线(SCL),通过在总线上发送和接收数据来实现设备之间的通信。
IIC协议具有简单、灵活、可靠和低成本等特点,被广泛应用于各种电子产品中,如传感器、存储器、显示器等
IIC架构示意图
2.IIC工作大致流程
①主机发送起始信号,从机读取起始信号表示开始接收数据。
②数据传输 其包含了主机向从机发送读写数据和主机从机之间的ACK信号。
③主机发送结束信号,从机读取结束信号表示这一次的数据传输结束。
3.起始信号
起始信号架构图
主机保持SCL电平为高电平期间SDA电平由高拉低,表示起始信号,当从机检测到起始信号后,开始数据的传输。
void SGP30_IIC_Start(void)
{
SGP30_IIC_SCL(1);
SGP30_IIC_SDA(1);
SGP30_IIC_SDA(0);
SGP30_IIC_SCL(0);
}
4.结束信号
结束信号架构图
主机保持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数据传输过程电平变化图
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写示意图
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读示意图