Forum: Mikrocontroller und Digitale Elektronik STM32 und Arduino I²C


von rowtag (Gast)


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.

von Stefan F. (Gast)


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.

von rowtag (Gast)


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.

von Jim M. (turboj)


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...

von Einer K. (Gast)


Lesenswert?

rowtag schrieb:
> , der STM hat die 0.
Die GeneralCall Adresse?
Diese solltest du keinesfalls nutzen, wenn du nicht genau weißt, was du 
da tust.
Darauf darf/kann der Slave nicht antworten.

von Teensy_Fanboy (Gast)


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!

von rowtag (Gast)


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.

von Stefan F. (Gast)


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?

von rowtag (Gast)


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.

von Einer K. (Gast)


Lesenswert?

Arduino F. schrieb:
> rowtag schrieb:
>> , der STM hat die 0.
> Die GeneralCall Adresse?

Und dafür die Bewertung -1 ...
Sehr interessant!

rowtag schrieb:
> Ich hab es so gemacht:
Dort ist der STM ein Master.
Liegt also im Widerspruch zu:
rowtag schrieb:
> Sobald Pin 2 des Arduino auf High ist soll der die Daten über I²C an das
> STM Board übertragen.

von rowtag (Gast)


Lesenswert?

Arduino F. schrieb:
> Dort ist der STM ein Master.
> Liegt also im Widerspruch zu:

Wie ist das ein Widerspruch?

von Einer K. (Gast)


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?

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.