1.读取数据
在读取数据时,根据手册可知,发送 I2C Read Header 后会得到 ACK 或 XCK(NACK),如果你得到了 XCK 且不再次发送 I2C Start + I2C Read Header,就会读取错误的 CO2eq 数据。
示例代码:
void SGP30_Measure_IAQ(SGP30_TypeDef *sgp30)
{
uint16_t timeout = 200;
SGP30_I2C_Start();
SGP30_I2C_TransmitByte(SGP30_ADDRESS << 1 | 0x00);
SGP30_I2C_TransmitByte(0x20);
SGP30_I2C_TransmitByte(0x08);
// measurement duration is 10 ms
// i2c read header, if get nack, retry send
SGP30_I2C_Start();
while (SGP30_I2C_TransmitByte((SGP30_ADDRESS << 1) | 0x01))
{
SGP30_I2C_Start();
timeout--;
if (timeout == 0)
{
sgp30->co2eq_raw = 0;
sgp30->tvoc_raw = 0;
sgp30->co2eq_crc = 0;
sgp30->tvoc_crc = 0;
sgp30->co2eq = 0;
sgp30->tvoc = 0;
return;
}
}
sgp30->co2eq = SGP30_I2C_ReceiveByte(Bit_RESET) << 8;
sgp30->co2eq = sgp30->co2eq | SGP30_I2C_ReceiveByte(Bit_RESET);
sgp30->co2eq_crc = SGP30_I2C_ReceiveByte(Bit_RESET);
sgp30->tvoc = SGP30_I2C_ReceiveByte(Bit_RESET) << 8;
sgp30->tvoc = sgp30->tvoc | SGP30_I2C_ReceiveByte(Bit_RESET);
sgp30->tvoc_crc = SGP30_I2C_ReceiveByte(Bit_SET);
SGP30_I2C_Stop();
}
2.I2C 速度太快
如果你写的是软件 I2C,想办法通过 delay 来控制你的 I2C 速度,不然也可能无法正确读取。
3.供电问题
可能不符合 SGP30 的供电要求导致初始化失败或一直卡在 400 ppm CO2eq 和 0 ppb TVOC。