SGP30 · I2C 0x58

SGP30 I2C 无应答排查资料

SGP30 是 Sensirion 的 TVOC / CO₂eq 数字气体传感器,I2C 地址固定为 0x58。客户反馈“扫描不到”“初始化失败”“Missing ACK”时,优先检查供电、电平、SDA/SCL、焊点、地址格式和总线速度。

Quick Facts

  • 接口:I2C
  • 地址:0x58,不能改
  • 输出:TVOC / eCO2
  • SKU:U54
SGP30 TVOC / CO₂eq 空气质量气体传感器模块SKU:U54;1688 链接已补充。产品表内旧记录如 0403 / 0404 / R1709-2 / T38-2 可作为内部追溯,网页主 SKU 先用 U54。
查看 1688 商品

Important Specs

关键参数先确认

这里把“芯片本体”和“模块板”分开写,避免客户直接按裸芯片参数或 5V 模块参数误判。

项目说明排查意义
通信接口I2C不是 UART、SPI,也不是模拟输出
7 位地址0x58Arduino / ESP32 / MicroPython 通常直接用 0x58
STM32 HAL 写地址0x58 << 1 = 0xB0逻辑分析仪看到 0xB0 通常是对的
STM32 HAL 读地址(0x58 << 1) | 1 = 0xB1这是 7 位地址左移后的读方向
I2C 速度最高 400 kHz;排查先用 100 kHz长线、杜邦线、上拉弱时先降速
芯片本体供电SGP30 芯片本体不是 5V 芯片不要把裸芯片当 5V 传感器接
模块供电以 U54 模块板说明和实物为准模块可能带稳压/电平转换/上拉电阻

Wiring

Arduino / ESP32 I2C 接线

常见模块只需要 VCC、GND、SDA、SCL 四根线。5V 主控能不能直接接,要以当前模块是否带稳压和电平转换为准。

SGP30 Arduino ESP32 I2C 接线与无应答排查图
SGP30 模块Arduino UNO / NanoESP32 常用接法说明
VCC / VIN5V 或 3.3V3.3V 优先以 U54 模块说明为准;裸芯片板不要直接按 5V 处理
GNDGNDGND必须共地
SDAA4GPIO21I2C 数据线
SCLA5GPIO22I2C 时钟线

Power

供电说明:芯片本体和模块板不要混淆

SGP30 芯片本体不是普通 5V 芯片。淘宝/1688 上销售的一般是模块板,板上可能已经加了稳压、电平转换、I2C 上拉电阻或 VIN 输入保护。

情况建议
裸 SGP30 芯片不能直接接 3.3V / 5V,需要按官方电源设计
带 VIN 引脚的 SGP30 模块按模块说明接 VIN,常见可能支持 3.3V 或 5V
模块标注只支持 3.3V不要接 5V
模块标注支持 5V VIN可以用 5V 接 VIN,但仍要确认 SDA/SCL 电平是否适合主控
重点:客户说“3.3V 供电无应答”时,要确认模块 VIN 是否需要 5V。如果模块板设计为 5V VIN 输入,3.3V 接 VIN 可能因为稳压压差不够导致模块不工作。

Troubleshooting

扫描不到 0x58 的排查流程

1

确认模块型号

SGP30 应扫到 0x58。若是 SGP40/SGP41,地址和输出逻辑不同,不要混用代码。

2

只接一个模块

先把 OLED、其它传感器全部拔掉,只保留 SGP30,排除地址冲突和总线拖死。

3

查四根线

VCC、GND、SDA、SCL 不要反接;UNO/Nano 是 A4/A5,不是 D4/D5。

4

降速和换线

先用 100 kHz,线尽量短。杜邦线接触不良时,I2C 扫描会间歇失败。

5

检查电平

5V Arduino 要确认模块板带电平转换;裸芯片转接板不能直接承受 5V I2C。

6

检查焊点

排针虚焊、SDA/SCL 焊盘连锡、GND 没焊牢,都会导致无应答。

ACK / Address

0x58、0xB0 和 Missing ACK 怎么看

很多 STM32 客户会把地址格式看混。`0x58` 是 7 位地址;`0xB0` 是左移一位后的写地址。地址对了,不代表模块已经应答,还要看 ACK 位。

现象判断
扫描到 0x58I2C 通信基本正常
Write to 0xB0 + ACKSTM32 地址和硬件通信正常
Write to 0xB0 + Missing ACK / NAK主控发出了 SGP30 地址,但模块没有应答
SCL 没波形主控 I2C 没运行或引脚配置错
SDA/SCL 一直低总线被拉死,可能短路、接反、模块异常
SDA/SCL 空闲不是高电平上拉、电平或供电异常
STM32 HAL 地址写法
#define SGP30_ADDR_7BIT  0x58
#define SGP30_ADDR_HAL   (SGP30_ADDR_7BIT << 1)  // 0xB0

if (HAL_I2C_IsDeviceReady(&hi2c1, SGP30_ADDR_HAL, 3, 100) == HAL_OK) {
    // SGP30 found
} else {
    // No ACK
}

Arduino Test

先扫描,再跑 SGP30 示例

Arduino IDE 库管理器安装 Adafruit SGP30Adafruit BusIO。代码先扫描 I2C,再初始化 SGP30。

sgp30_i2c_scanner_and_test.ino
#include <Wire.h>
#include "Adafruit_SGP30.h"

Adafruit_SGP30 sgp;

void setup() {
  Serial.begin(115200);
  Wire.begin();          // UNO/Nano: SDA=A4, SCL=A5
  Wire.setClock(100000); // 排查阶段先用 100kHz

  if (!sgp.begin()) {
    Serial.println("SGP30 not found. Check 0x58 / wiring.");
    while (1) delay(1000);
  }
  Serial.println("SGP30 found.");
}

void loop() {
  if (sgp.IAQmeasure()) {
    Serial.print("TVOC "); Serial.print(sgp.TVOC); Serial.print(" ppb\t");
    Serial.print("eCO2 "); Serial.print(sgp.eCO2); Serial.println(" ppm");
  }
  delay(1000);
}

下载完整 .ino 文件

Customer Reply

淘宝客户简短话术

您好,SGP30 正常 I2C 地址是 0x58,这个地址不能改。扫不到时先只接 SGP30 一个模块,确认 VCC、GND、SDA、SCL 四根线;UNO/Nano 是 SDA 接 A4、SCL 接 A5,ESP32 常用 SDA 接 21、SCL 接 22。建议 I2C 速度先降到 100kHz,并检查排针是否焊牢。

如果您用的是 5V Arduino,请确认模块板是否支持 5V 接入;如果是裸芯片小板,I2C 电平可能不能直接接 5V。可以发一下模块正反面和接线图,我们帮您确认供电和线序。

如果逻辑分析仪显示 Write to 0xB0 + Missing ACK,地址格式通常没错,0xB0 对应的就是 SGP30 的 7 位地址 0x58 左移一位。现在重点看模块为什么没有 ACK,请检查供电、GND 共地、SDA/SCL 是否接反、I2C 上拉和模块型号是否确认为 SGP30。

如果 Keil 工程还有芯片型号找不到、Device Pack 缺失、编译失败等问题,需要先把 STM32 工程环境处理好。程序没有正常下载运行前,不能直接判断 SGP30 模块损坏。建议先用最简单的 I2C 扫描程序测试是否能扫到 0x58。

References

官方与公开资料