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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.