【Sensor】SGP30 传感器开发遇到的问题

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值