Forum: Mikrocontroller und Digitale Elektronik CH-341 USB->I2C + CCS811


von Gerd A. (gerd_a289)


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

von Stefan F. (Gast)


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.

von Gerd A. (gerd_a289)


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

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

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.

von Gerd A. (gerd_a289)


Angehängte Dateien:

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

von Stefan F. (Gast)


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.

von Gerd A. (gerd_a289)


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

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.