Hi zusammen, ich hab hoffentlich keine zu blöde Frage: Ich versuche einen CCS811 über i2c auszulesen. Der USB-I2C Adapter funktioniert grundsätzlich, da ich damit einen BME280 oder ADS1115 verwenden kann. Einzig der CCS811 macht Probleme. Ich verwende Python3, smbus2. Dabei passiert folgendes: # mein kleiner i2cdetect erkennt alle 3 Sensoren (ADS1115,CCS811 und BME280) i2c devices found: ['0x48', '0x5a', '0x76'] import smbus2 i2c = smbus2.SMBus(10) import constant as ccs # alle von mir benötigten constants # getting Hardware ID '0x{:02x}'.format(i2c.read_byte_data(ccs.ADDR, ccs.REG_HW_ID)) > '0x81' # Chip ist also der richtige # Boot und APP Firmware Versionen kann ich auch lesen. # Start des Heaters funktioniert auch i2c.write_byte_data(ccs.ADDR, ccs.APP_START,0x00) # wie man am Status sieht: '{:08b}'.format(i2c.read_i2c_block_data(ccs.ADDR,ccs.REG_STATUS,1)[0]) > '00010000' # bit 0 passt # erst beim Setzen der Messmethode verweigert der Sensor den Schreibvorgang i2c.write_i2c_block_data(ccs.ADDR, ccs.REG_MEAS_MODE, bytearray([0b00011000])) # Status Abfrage und auslesen des Error Registers: '{:08b}'.format(i2c.read_i2c_block_data(ccs.ADDR,ccs.REG_STATUS,1)[0]) > '00010001' # Error bit 0 ist gesetzt '{:08b}'.format(i2c.read_i2c_block_data(ccs.ADDR,ccs.REG_ERROR,1)[0]) > '00000010' # bit heißt error beim Schreiben, na toll! Ich kann auch nicht alle Register lesen wie NTC usw. Da folgt dann equivalent ein Lesefehler. Ist das ein Problem der Library smbus2 oder muss der CCS811 evtl. anders behandelt werden? Der CCS811 funktioniert an einem ESP32/8266 übrigens ohne Probleme, scheinbar auch eine andere i2c Implementierung in Micropython. Danke im Fall schneller Hilfe ;) Gruß Gerd
Untersuche die I²C Kommunikation mit einem Logic Analyzer. Die Beispiele auf https://www.onetransistor.eu/2017/09/ch341a-usb-i2c-programming.html könnten dabei helfen. Auch ein analoges Bild zur Signalqualität (Oszilloskop) wäre hilfreich. Wenn du noch Fragen hast, mache mehr Angaben zu deinem System. Welche Betriebssystem, welcher Treiber, welche Bibliothek und welchen Quelltext verwendest du? Ein Schaltplan wäre auch hilfreich, manchmal sind es Kleinigkeiten die dazu führen, dass nicht alles funktioniert.
Also erst mal auf die Schnelle: OS: Linux Ubuntu 18.04.5 Driver: description: i2c-ch341-usb driver v1.0.0 Python Modulinfo: smbus2 0.3.0 Zum Schaltplan gibt es nicht viel zu sagen. USB-Adapter, 4 kleine Kabel zum Minibreakout auf dem ein paar Brücken sitzen und der CCS811 hat zu den 4 I2C Anschlüssen noch WAK gegen Masse, thats it. Ich schau mal ob ich meine Logicanalyzer ans Fliegen kriege. Evtl. hat es auch was mit dem i2c stretching zu tun. Ich hab gelesen, dass Devices den Takt verlangsamen dürfen um Zeit für die Antwort zu bekommen. i2c-Speed ist schon auf 100kbps. Danke und Gruß Gerd
:
Bearbeitet durch User
Gerd A. schrieb: > Zum Schaltplan gibt es nicht viel zu sagen. USB-Adapter, 4 kleine Kabel > zum Minibreakout auf dem ein paar Brücken sitzen und der CCS811 hat zu > den 4 I2C Anschlüssen noch WAK gegen Masse, thats it. Also keine Pull-Up Widerstände? Oder vielleicht sind sie zu hochohmig.
Ich ging davon aus, dass auf diesen Modulen (siehe Bild) alles sitzt was man braucht. Wie gesagt ich hab bis zu 5 Module an ESP32/8266 hängen die ich per mqtt polle und nie Probleme mit der Kommunikation bzw. Signalverfälschungen. Erst mit dem Einsatz des direkten USB zu I²C Interfaces und auch nur bei den CCS811. Aber wie gesagt, ich mach mich Morgen mal mit dem Analyzer auf die Suche. Danke und Gruß Gerd
Ich hoffe du hast alle VCC/GND Anschlüsse miteinander verbunden. Kann man auf dem Foto nicht sehen. Pull-Up Widerstände sind nur manchmal auf den Modulen drauf. Es könnten insgesamt aber auch zu viele sein. Das würdest du beides direkt auf dem Oszilloskop sehen, weil dann die Spannungspegel nicht stimmen oder die Flanken der Signale zu stark abgerundet sind.
Hi Stefan, ich hab mir schon fast gedacht dass es nichts elektrisches ist. Offensichtlich gibt es nicht ungewichtige Unterschiede bei der Behandlung der I²C-Kommunikation: # Beispiel Reset Sequence CCS811 (so gehts leider nicht): i2c.write_i2c_block_data(ccs.ADDR, ccs.APP_RESET, bytearray([0x11, 0xE5, 0x72, 0x8A])) # so funktioniert es (Message erstellen und senden): data = smbus2.i2c_msg.write(ccs.ADDR, [ ccs.APP_RESET, 0x11, 0xE5, 0x72, 0x8A ]) i2c.i2c_rdwr(data) Damit kann ich leben. Ich bekomme den Chip gestartet und kann das Teil initialisieren. Gruß Gerd
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.