Forum: Mikrocontroller und Digitale Elektronik STM32 I2C2 & BME680 Probleme


von S. M. (erfindix)


Angehängte Dateien:

Lesenswert?

Moin,
ich möchte gerne beim einem STM32F103 Controller nutzen um hiermit über 
den I2C-Bus mehrere Geräte zu betrieben. Voraussetzung ist, dass der 
I2C1 als Master und der I2C2 als Slave deklariert wird. Das liegt daran, 
dass der Controller selbst als Slave in einem Bus angeschlossen ist und 
auf Befehle von einem Master wartet. Bei einem Befehl soll dann über den 
anderen I2C-Bus der Controller als Master arbeiten und mehrere Sensoren 
ansprechen, dazu gehört auch ein BME680.
Die Beiden I2C-Busse liegen an den Pins vom STM32 wie folgt an:
SDA1 -> PB7
SCL1 -> PB6
SDA2 -> PB11
SCL2 ->PB10

Das Problem ist, dass keine der Vorhanden Libary’s im Zusammenhang mit 
I2C2 und dem BME680 funktioniert!
1.Möglichkeit mit „TwoWire“  (TwoWire myWire1 (1, I2C_FAST_MODE);)
Fehlermeldung: Der Code hängt sich bei der Initialisierung vom BME auf
2.Möglichkeit mit „Wire“ und „Wire1“ (#include <Wire_slave.h>)
Fehlermeldung: Der Code hängt sich bei der Initialisierung vom BME auf

Der Code selbst funktioniert fehlerfrei. Das heißt, wenn ich nur einen 
der jeweiligen I2C-Kanäle nutze kann ich den Sensor ansprechen und 
auslesen. Nur die Kombination aus beiden I2C-Kanälen funktioniert der 
Code nicht.
Als Libary’s nutze ich die „Adafruit_BME680“. Eine weitere wäre die 
„BME680 von SV-Zahnshin“. Diese funktioniert aber von Grund auf nicht!

Hat jemand vielleicht eine Idee oder Tipp wie es möglich ist beim STM32 
beide I2C-Kanäle zu nutzen (den einen als Slave, den Anderen als Master) 
und dabei einen BME680 an zu sprechen??? Ich würde schon fast darauf 
tippen, dass auch der BME280 oder BMP280 nicht geht.


Master --- BUS ----><--(Slave)###STM32F103###(Master)-->BME680...

von Stefan F. (Gast)


Lesenswert?

Da das alles Open-Source ist, hast hier eine gute Gelegenheit, die 
Bibliotheken zu verbessern. Und wenn du möchtest, kannst du den 
geänderten Code wieder veröffentlichen. Diese Projekte beruhen auf 
gegenseitigem Geben und Nehmen.

von Jim M. (turboj)


Lesenswert?

Die üblichen I²C Libs unterstützen oft nur den Betrieb als Master.

Als Slave müsste man irgendwo die I²C Adresse einstellen können, das 
sehe ich im geposteten Code überhaupt nicht.

Was ist der Master? Wenn ein µC als I²C Slave benutzt wird, müsste der 
Master üblicherweise Clock Stretching unterstützen. Dabei fällt einiges 
- IIRC der RPi - raus.

von S. M. (erfindix)


Lesenswert?

Sorry für die späte Rückmeldung

Ich habe jetzt viele Sachen ausprobiert. Leider bisher nicht ganz zum
Erfolg.
Mit der Libary "#include <Wire_slave.h>" ist es mir möglich die
Komponenten so anzusprechen, dass ich einen Funktionierenden Slave &
Master-Bus am STM habe. Auch weitere I2C Sensoren kann ich als Master
ansprechen und als Slave die Daten weitergeben.

Es funktioniert nur der BME680 nicht!

Mir ist es bisher nicht gelungen die Libary so anzupassen, dass diese
nicht mehr über <Wire.h> sondern über <Wire_slave.h> läuft.
Als Libary für den BME nutze ich die "Adafruit_BME680.h"

: Bearbeitet durch User
von S. M. (erfindix)


Lesenswert?

ich möchte gerne:
--> Adafruit_BME680(TwoWire *theWire = &Wire);

mit der <SoftwareWire.h> nutzen

Eine Veränderung von
Adafruit_BME680(SoftwareWire *theWire = &Wire);
ist nicht erlaubt. Weiß wer wo die "TwoWire*" definiert ist um diese 
dirch die SoftwareWire zu tauschen

: Bearbeitet durch User
von Εrnst B. (ernst)


Lesenswert?

S. M. schrieb:
> Weiß wer wo die "TwoWire*" definiert ist um diese
> dirch die SoftwareWire zu tauschen

Rechts drauf klicken, "Gehe zu Definition", und schon ist das richtige 
File offen.

Leider sieht die Adafruit-Library den Austausch nicht wirklich vor.

: Bearbeitet durch User
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.