Forum: Mikrocontroller und Digitale Elektronik SPS30 Staubsensor I2C Problem (ESP32)


von Bauteiltöter (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

ich kämpfe seit einigen Tage mit dem I2C-Interface eines Sensirion SPS30 
Staubpartikelsensor.

Der Aufbau ist denkbar einfach, ein ESP32 als Mikrocontroller, zwei 
Pullups (4.7k) und zwei Teilnehmer am Bus:
- der besagte SPS30
- ein Sensirion SCD30 Co2-Sensor.

Programmiert mit den Espressif IDF Framework, kein Arduino.

Die Kommunikation mit dem SPS30 funktioniert eigentlich einwandfrei, ich 
kann z.B. ohne Probleme die Firmware-Version abfragen oder die Messwerte 
lesen (er ließt 0 für alle Werte).

Das Problem ist jetzt, dass ich die Messung nicht gestartet bekomme. 
Laut Datenblatt muss der Sensor dafür drei Bytes ins Register 0x0010 
schreiben:
Byte 0:
  Measurement Output Format
    0x03: Big-endian IEEE754 float values
    0x05: Big-endian unsigned 16-bit integer value
Byte 1:
  dummy byte, insert 0x00
Byte 2:
 Checksum for bytes 0, 1

Die Checksum-Berechnung steht praktischerweise schon als C-Code im 
Datenblatt und gibt auch für das gelieferte Beispiel (0xBEEF = 0x92) das 
richtige Ergebnis.

Für die gewünschte Folge 0x03 0x00 ergibt sich dann 0xAC als Checksumme.
Ob die Messung wirklich läuft lässt sich zum Glück ziemlich einfach 
feststellen. Der SPS30 hat einen kleinen Lüfter um den Staub abzusaugen, 
der läuft nur wenn die Messung aktiv ist.

Der Lüfter bleibt bei mir aus.
Im Anhang ist das Oszibild, da sieht eigentlich alles soweit okay aus - 
0x69 ist die Sensor-Adresse, dann Register 0x0010 und meine Payload 
0x0300AC.
Seltsam finde ich aber, dass SDA und SCL danach low bleiben, wie kann 
das sein? Meines Wissens nach sollte I2C immer Idle high sein.

I2C auf dem ESP funktioniert aber wie gesagt, mit dem SCD30 kann ich ja 
ohne Probleme reden.

Manchmal läuft der Sensor auch an, ich habe z.B. mal mit der 
Checksummen-Berechnung herum gespielt (Checksume über 0x0003 statt über 
0x0300 berechnen lassen). Plötzlich war der Sensor dann an, ich weiß 
aber nicht wann / warum. Ich konnte das ganze auch nicht wieder 
reproduzieren.

Hat jemand eine Idee was da falsch sein könnte?
Ich bin mit meinem Latein erstmal am Ende.

Viele Grüße
Bauteiltöter

von Wolfgang (Gast)


Lesenswert?

Bauteiltöter schrieb:
> Seltsam finde ich aber, dass SDA und SCL danach low bleiben, wie kann
> das sein? Meines Wissens nach sollte I2C immer Idle high sein.

Mindestens beim SCL ist das Sache des Masters, wenn man mal von 
Clock-Stretching absieht. Wie soll dich der Sensor verstehen, wenn du 
ihn falsch ansteuerst.
Vergleich mal deine Signalverläufe mit den Angaben im Datenblatt vom 
Sensor (S.16). Um zu prüfen, ob der L-Pegel auf SCL wirklich vom Master 
kommt, könntest du einen kleinen Widerstand in die Leitung hängen und 
dir die Spannung vor und nach dem Widerstand ansehen. Oder du nimmst 
einfach mal den Sensor vom Bus.
https://www.sensirion.com/fileadmin/user_upload/customers/sensirion/Dokumente/9.6_Particulate_Matter/Datasheets/Sensirion_PM_Sensors_Datasheet_SPS30.pdf

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.