说明:这里采用使用IO模拟的方式来实现I2C
/*SGP30传感器初始化函数*/
void SGP30_Init(void)
{
Start_I2c(); //启动I2C总线
SendByte(SGP30WAddr); //发送SGP30传感器写地址
SendByte(0x20); //发送命令(0x2003|SGP30_IAQ_init)
SendByte(0x03);
Stop_I2c(); //停止I2C总线
}
/*SGP30传感器读取数据函数*/
void SGP30_Data_Read(unsigned int *dat)
{
unsigned char Data01,Data02,Data03,Data04; //读取数据暂存变量
unsigned char CRC; //CRC校验值接收变量
Start_I2c();
SendByte(SGP30WAddr);
SendByte(0x20); //发送命令(0x2008|SGP30_Measure_IAQ)
SendByte(0x08);
Stop_I2c();
DelayMs(10); //必须延时10ms以上,但不宜太长,否则读取不到数据!!!
Start_I2c();
SendByte(SGP30RAddr);
Data01 = RcvByte(); //CO2高位数据
Ack_I2c();
Data02 = RcvByte(); //CO2低位数据
Ack_I2c();
CRC = RcvByte(); //CRC校验值
Ack_I2c();
Data03 = RcvByte(); //TVOC高位数据
Ack_I2c();
Data04 = RcvByte(); //TVOC低位数据
Ack_I2c();
CRC = RcvByte();
NoAck_I2c();
Stop_I2c();
dat[0]=((Data01<<8)|Data02); //拼接CO2数据
dat[1]=((Data03<<8)|Data04); //拼接TVOC数据
}
直接将CO2数据转换为整型数据即可得到二氧化碳浓度数据
因本人水平有限,代码如有不足之处请指出!欢迎大家前来交流!