SPS30 Staubsensor I2C Problem (ESP32)

Gast #6886975
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
Angehängte Dateien:
Gast #6887146
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.