Skip to content

Troubleshooting

Symptoms you may see while bringing up an SF06 flow meter, their causes and the fix for each.

Start with the error the call returned (sfm::ToString(r.error)): it separates bus problems (BusWrite, BusRead, NoData on every call) from data problems (Crc) and from configuration problems (UnsupportedGas, VariantUnknown).

Nothing answers

Symptom Cause Fix
Every call returns BusWrite, BusRead or NoData Wrong address Check the ADDR strap: open or GND is 0x2A; scan the bus
No pull-ups, or SDA and SCL swapped External pull-ups on both lines; check the connector pin order (SDA is pin 2, SCL pin 5)
The sensor is still starting Wait 20 ms after power-up before the first call
ADDR tied to VDD Not allowed: tie it to GND or leave it open
NotInitialized The port's EnsureInitialized() failed Your bus set-up (for the ESP32 port: call Install() first)

Reads fail

Symptom Cause Fix
NoData on every read No start command, Stop() was sent, or the sensor was reset (IRQn low after a start) Call StartContinuous() again
NoData on some reads Polling faster than results arrive: 2 kHz, or 2 kHz / N with fixed-N averaging Expected: skip the tick, or read on the IRQn edge
Crc now and then Noise, slow edges, weak pull-ups, long cable Stronger pull-ups, shorter wires, 100 kHz
Crc on every read The port returns fewer bytes than asked, or reads with a register byte Fix the port (Porting)

Commands are refused

Symptom Cause Fix
Identifier, averaging or a new start fails The sensor is measuring; it takes these only in idle mode Stop() (it waits the 0.5 ms), then the command
UnsupportedGas The variant has no table for the gas (for example CO2 on an SFM4300-50) Use a calibrated gas (Gases and part families)
VariantUnknown The gas's start code depends on the family ReadProductIdentifier() in idle mode, or AssumeVariant()
NotSupported from SoftReset() The port has no WriteGeneralCallImpl() Add it, or power-cycle the sensor
NotSupported from averaging or sleep SFx6000 part These commands exist only on SF06 parts
ExitSleep() returns BusWrite The port cannot send an address-only write (len == 0) Support empty writes in Write()

Do not bypass UnsupportedGas with AssumeVariant(): a thermal sensor read with the wrong gas table gives a plausible, systematically wrong flow.

Readings look wrong

Symptom Cause Fix
The first readings are a few percent off Warm-up: accuracy is reached about 30 ms after the start Discard readings for 30 ms after each start
A reading lags a step change Average-until-read smooths exponentially when you read less often than every 64 ms (status bit 11) Read at least every 64 ms, or use fixed-N averaging
A constant offset The sensor is not horizontal, or the line pressure is outside 0.66 bar to 7 bar absolute Mount it horizontally with the connector up (Hardware)
The temperature differs from the gas temperature The sensor reports its silicon temperature Expected; insulate the sensor if you need the gas temperature