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.
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.
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.
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...
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.
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!
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.
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?
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.
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.
Arduino F. schrieb: > Dort ist der STM ein Master. > Liegt also im Widerspruch zu: Wie ist das ein Widerspruch?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.