Huhu, ich entschuldige mich für den vllt. etwas wirren Titel. Es geht darum, dass ich vorhabe drei Beschleunigungssensoren (MMA8452Q) über den I²C-Bus mit einem Arduino zu verbinden. Da er aber nur zwei verschiedene Adressen unterstützt und ich mit einem Mikrokontroller drei Sensoren ansteuern will, hatte ich vor, einen der drei Sensoren immer auf der Adresse 0x1C laufen zu lassen und die anderen beiden auf 0x1D. Die letzteren beiden werden aber über jeweils einen I²C-bus-repeater (PCA9515) mit dem I²C-Bus vom Arduino verbunden. Die Repeater haben einen Enable-Pin, den ich nun so steuer, dass immer nur einer der beiden Sensoren mit dem I²C-Bus des Arduinos wirklich verbunden ist. Meine Frage nun ist, ob es dem Sensor oder einen I²C-Device generell etwas ausmacht, wenn es für eine kurze Zeit kein Signal mehr auf SCL empfängt? Eigentlich wars das schon, viele Grüße und danke im Voraus
Zunächst müsste man dafür sorgen, dass das Abschalten von SCL nur direkt nach der Abgabe einer Stopbedingung auf den Bus geschieht. Sonst liest das IC sofort nach Wiedereinschalten von SCL die Zufallsdaten am Bus weiter. Zusätzlich muss dafür gesorgt werden, dass der Pegel am SDA-Anschluss des abgeschalteten IC sich nicht ändert, denn dadurch kann eine Start- bzw. Stopbedingung am IC entstehen. Beim Wiedereinschalten zuerst SCL einschalten und unmittelbar anschließend eine Start-Bedingung auf den Bus geben.
http://ics.nxp.com/products/i2cmuxes/ hier ist sowas beschrieben, möglicherweise helfen auch die Datenblätter der entsprechenden Chips. MfG Klaus
Bin im Datenblatt nicht fündig geworden. Aber ist es eigentlich gestattet SA0 während des Betriebs umzusetzen? Wenn ja, dann würde ich SA0 als eine Art Chip-Select benutzen, das Programm spricht immer dieselbe Adresse an und mit 3 zusätzlichen Pins am Arduino (oder einem 4 aus 2 Dekoder) verpasse ich nur dem einen Sensor mit dem richtigen Pegel an seinem SA0 genau die Adresse über die der µC über den Bus zugreift.
>Aber ist es eigentlich gestattet SA0 während des Betriebs umzusetzen?
I.d.R. steht es im Datenblatt wenn der Chip die Adresse nur einmal beim
einschalten liest. Sonst sollte man eigentlich davon ausgehen können das
er die Adresse immer erst bei Adressierung prüft. Dann kann man das mit
dem "Chip select" so machen.
Wenn, dann den SDA auftrennen. Bei SCL auftrennen kriegen sonst die anderen ständig Start/Stop gesendet. Eine elegante Methode ist, einen PCF8574 zur Adreßauswahl (Pin SA0) zu nehmen, damit kann man dann bis zu 8 Slaves auswählen.
Vielen dank schon mal für die Antworten. Die Möglichkeit, die Adressen umzuschalten hatte ich schon probiert, hat aber leider nicht geklappt, was jedoch eventuell am damaligen Schaltaufbau gelegen haben könnte. Ich werds nochmal probieren und dann auch schreiben obs nun doch geklappt hat. @Peter Dannegger: (aber auch an alle anderen) Meinst du damit, wenn ich nun doch meine Repeater verwende, dass ich über diesen Repeater nur das SDA inaktiv schalten soll, aber SCA am Repeater "vorbeileiten" und somit immer mit allen drei Sensoren verbunden lassen soll?
Quirin H. schrieb: > Die Möglichkeit, die Adressen umzuschalten hatte ich schon probiert, hat > aber leider nicht geklappt, was jedoch eventuell am damaligen > Schaltaufbau gelegen haben könnte. Ich werds nochmal probieren und dann > auch schreiben obs nun doch geklappt hat. Was ist denn genau passiert? Hat es gar nicht geklappt (kein Sensor auslesbar), oder hat das Umschalten nicht geklappt (immer der gleiche Sensor wird ausgelesen) oder hat es nur manchmal funktioniert? Probiere das am Besten nochmal aus, es scheint das einfachste zu sein, wenn du einfach 2 bzw. 3 Leitungen von deinem Arduino zu den Sensoren hin legst und diese (ähnlich wie z.B. bei SPI) als Chipselect verwendest.
Getestet wurde das Umschalten mit einem Sensor, und er hat plötzlich dann keine Daten mehr geliefert, aber ich probiers nach den Feiertagen nochmal aus ;) Ob es nun mit den Repeatern auch gehen würde, würd mich trotztem noch immer interessieren. Ich werds zwar auch nach den Feiertagen testen können, aber hat bis dahin schon jemand noch eine kleine Meinung? Bzw. dazu wie man es mit der Methode zum laufen kriegen könnte? Auch wenn ich das eventuell nicht so machen werde, als Alternative und für den Lerneffekt interessiert es mich trotzdem :)
Das geht doch mit der Tatsache zu machen, dass die I2C-Teilnehmer durch die Stopbedingung zuerst alle stillgelegt werden. In diesem Zustand kann man durch einem Multiplexer (4052 oder so) einen der Bausteine mit dem Bus verbinden ( am bequemsten beide schalten, SCL und SDA über den Mux leiten). Anschließend kann man mit Startbedingung alle angeschlossenen IC's zum Mithören auffordern und eines davon mit seiner Startadresse aufwecken und damit arbeiten. Nach der Stopbedingung kann man dann wieder eine andere Verbindung über den Multiplexer aufbauen und mit Startbedingung wieder aufwecken. Man muss halt genau aufpassen, dass dabei nicht ungewollt eine Start- oder Stopbedingung zum falschen Zeitpunkt am falschen IC entsteht. Aber nur per Arduino kriegt mans wohl nicht hin, da muss man bit für bit an SCL und SDA und am Multiplexer arbeiten und das geht am besten in Maschinensprache.
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.