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。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐