STM32 und Arduino I²C

Gast #5413186
Lesenswert?

Hallo,

Ich lese mit meinem Arduino Uno 2 Sensoren, über I²C, aus und möchte die 
Daten dann ebenfalls über I²C an einen STM32L476 Nucleo übertragen um 
die Daten dort weiter zu verarbeiten.
Ich weiß aber nicht wie ich es hinbekomme das der Arduino und der STM 
richtig miteinander reden.
Gast #5413190
Lesenswert?

Vielleicht hast du da zu viele Baustellen auf einmal eröffnet. 
Beschreibe doch mal, womit du dich auskennst, damit klar ist, wo man 
ansetzen kann.

Weil: So ganz ohne Infos müssten wir mit physikalischen Grundlagen 
beginnen und Englisch lernen. Ein bisschen über Projektmanagement wäre 
auch nicht schlecht.

Denke mal darüber nach, welche Infos wir wohl benötigen könnten, um Dir 
zu helfen. Und dann stelle all diese Infos zusammen. Sonst wird das eine 
never-ending Fragerunde.
Gast #5413219
Lesenswert?

Mit dem Arduino arbeite ich jetzt zum ersten mal.
Mit dem STM arbeite ich schon über ein halbes Jahr, kenne mich also ein 
bissche aus. Für das STM Board benutzte ich die HAL-Bibliotheken von ST.
Mit I²C habe ich auch schon ein paar mal gearbeitet.
Ich hatte auch schon einen Sensor mit dem STM Board in Betrieb, einen 
zweiten dazu scheint aber nicht zu funktionieren, da das zuweisen einer 
neuen I²C-Adresse nicht funktioniert.
Die Sensoren sind VL53L0X Entfernungssensoren.

Ich jetzt dem Arduino die I²C Adresse 8 gegeben, der STM hat die 0. Die 
Sensoren haben 41 und 42.
Sobald Pin 2 des Arduino auf High ist soll der die Daten über I²C an das 
STM Board übertragen.
#5413241
Lesenswert?

rowtag schrieb:
> Ich hatte auch schon einen Sensor mit dem STM Board in Betrieb, einen
> zweiten dazu scheint aber nicht zu funktionieren, da das zuweisen einer
> neuen I²C-Adresse nicht funktioniert.

Das klingt nach einem lösbaren Problem. Nimmst Du eine fertige VL53L0X 
Lib?

rowtag schrieb:
> Ich jetzt dem Arduino die I²C Adresse 8 gegeben, der STM hat die 0. Die
> Sensoren haben 41 und 42.

Der Master hat keine eigene Adresse. Und bei 2 µCs am Bus muss einer 
den Slave spielen - das unterscheidet sich deutlich von dem Code eines 
I²C  Masters. Ich hätte lieber den Bug im STM Code gefixt...
Gast #5413267
Lesenswert?

rowtag schrieb:
> Ich lese mit meinem Arduino Uno 2 Sensoren, über I²C, aus und möchte die
> Daten dann ebenfalls über I²C an einen STM32L476 Nucleo übertragen um
> die Daten dort weiter zu verarbeiten.

Nimm doch gleich ein TEENSY 3.5 (3.6) Board.
Die besitzen einen ARM Controller der mit 180 MHz läuft.
Die haben alles drauf was dein Herz begehrt.
Und das Beste die sind ARDUINO kompatibel!
Gast #5413297
Lesenswert?

Jim M. schrieb:
> Das klingt nach einem lösbaren Problem. Nimmst Du eine fertige VL53L0X
> Lib?

Ja, ich nutzte die API von ST. Ich hab mich auch an Beispielen von ST 
orientiert, und auch die Funktion "VL53L0X_SetDeviceAddress" verwendet.
Diese gibt als Rückgabewert aber immer "VL53L0X_ERROR_CONTROL_INTERFACE" 
zurück. Egal mit welcher I²C Adresse ich es probiere.

Nach 2 Wochen debuggen und rumprobieren kam ich jetzt auf die Idee das 
über den Arduino zu lösen, da es dafür viel mehr Beispiele und fertigen 
Code online gibt.
Gast #5413398
Lesenswert?

Was fehlt Dir denn jetzt?

Ich habe dich so verstanden, dass du den Arduino (welchen denn?) 
verwendest, um den beide Sensor VL53L0X abzufragen und die Daten unter 
einer anderen Adresse erreichbar zu machen.
1
Sensor1 ------+-----Arduino-------------STM32
2
(Slave)       | (Master) (Slave)       (Master)
3
              |
4
Sensor2 ------+
5
(Slave)

Ist das richtig? Oder ist es so?:
1
Sensor1 ------+-----Arduino
2
(Slave)       |   (Master+Slave)       
3
              |
4
Sensor2 ------+-------STM32
5
(Slave)              (Master)

Oder so:
1
Sensor1 ------+-----Arduino
2
(Slave)       |     (Master)       
3
              |
4
Sensor2 ------+-------STM32
5
(Slave)              (Slave)

Oder noch anders?

Hast du andere viel einfachere Alternativen bedacht?:
- Einen zweiten I²C Bus zu verwenden (der STM32L476 hat ja mehrere)
- Einen Multiplexer am I²C Bus zu verwenden um zwischen den beiden 
Sensoren umzuschalten (es gibt so gar spezielle für I²C)
- Mittels XSHUT Pin zwischen parallel geschalteten Chips zu multiplexen
- Soft-I²C (Bit-Banging) auf beliebigen I/O Pins
- Einen kleinen ATtiny ohne Schnickschnack drumherum als Adress-Umsetzer
Wenn ja, welche hast du bedacht und warum nicht verwendet?

I2C Slave Implementierungen für Arduino Module gibt es jede Menge im 
Netz. Welche davon verwendest du? Mit welchem Quelltext? Wie sehen die 
Signale auf dem Bus aus? Hast du einen Logic Analyzer? Wenn nicht, 
besorge Dir einen bevor du weiter machst.

By the way: Hast du das Datenblatt des Sensors gelesen? Da steht nur 
ganz oben links in der Marketing ecke "Programmable I²C address". Es 
fehlt aber die Erklärung, wie man die Adresse nun konkret ändert. Es 
kann also auch sein, dass das gar nicht geht! Vielleicht ist die 
Funktion für den Fall gedacht, dass du eine andere Variante des Chips 
mit anderer fest programmierter Adresse verwenden kannst (das wäre gar 
nicht unüblich).

Hast du die Application Note AN4846 gelesen?
Gast #5413960
Lesenswert?

Ich hab es so gemacht:
1
Sensor1 ------+-----Arduino
2
(Slave)       |   (Master+Slave)       
3
              |
4
Sensor2 ------+-------STM32
5
(Slave)              (Master)


Stefanus F. schrieb:
> Einen Multiplexer am I²C Bus zu verwenden um zwischen den beiden
> Sensoren umzuschalten (es gibt so gar spezielle für I²C)
> - Mittels XSHUT Pin zwischen parallel geschalteten Chips zu multiplexen

Ich brauche die Daten möglichst zeitgleich, und das mit dem XSHUT hat 
nicht funktioniert.


Stefanus F. schrieb:
> Hast du die Application Note AN4846 gelesen?

Hab ich gelesen, hat mir aber nicht all zuviel gebracht.

Am Arduino Uno funktioniert das ändern de I2C Adresse ohne Probleme.
Gast #5414254
Lesenswert?

Bei I2c spricht immer der Master den Slave an.
Master, soll der STM sein.

Du möchtest aber, auf Pin togglen, Daten vom Arduino zum STM senden.
Das geht nur wenn der STM Slave spielt.

Dazu kommt, dass der STM auf Adresse 0 horchen soll.
(wenn ich den anderen Teil interpretiere)

Dazu wird man aber erst den GeneralCall in der Hardware aktivieren 
müssen.
(soweit mir bekannt)
Aber den GeneralCall willst du doch sowieso nicht nutzen, oder?

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