CH-341 USB->I2C + CCS811

#6477722
Lesenswert?

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
Gast #6477733
Lesenswert?

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.
#6477842
Lesenswert?

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
#6478007
Lesenswert?

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
Angehängte Dateien:
Gast #6478908
Lesenswert?

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.
#6479273
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren