mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: rowtag (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefanus F. (Firma: Äppel) (stefanus)
Datum:

Bewertung
2 lesenswert
nicht 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.

: Bearbeitet durch User
Autor: rowtag (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jim M. (turboj)
Datum:

Bewertung
1 lesenswert
nicht 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...

Autor: Arduino Fanboy D. (ufuf)
Datum:

Bewertung
0 lesenswert
nicht 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.

: Bearbeitet durch User
Autor: Teensy_Fanboy (Gast)
Datum:

Bewertung
-1 lesenswert
nicht 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!

Autor: rowtag (Gast)
Datum:

Bewertung
-1 lesenswert
nicht 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.

Autor: Stefanus F. (Firma: Äppel) (stefanus)
Datum:

Bewertung
1 lesenswert
nicht 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.
Sensor1 ------+-----Arduino-------------STM32
(Slave)       | (Master) (Slave)       (Master)
              |
Sensor2 ------+
(Slave)

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

Oder so:
Sensor1 ------+-----Arduino
(Slave)       |     (Master)       
              |
Sensor2 ------+-------STM32
(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?

: Bearbeitet durch User
Autor: rowtag (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab es so gemacht:
Sensor1 ------+-----Arduino
(Slave)       |   (Master+Slave)       
              |
Sensor2 ------+-------STM32
(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.

Autor: Arduino Fanboy D. (ufuf)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: rowtag (Gast)
Datum:

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

Wie ist das ein Widerspruch?

Autor: Arduino Fanboy D. (ufuf)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.