I²C-Slave funktionstüchtig nach Trennung von SCL?

#3107356
Lesenswert?

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
#3107421
Lesenswert?

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.
#3107440
Lesenswert?

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.
#3108178
Lesenswert?

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?
Gast #3108254
Lesenswert?

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.
#3108293
Lesenswert?

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 :)
#3108311
Lesenswert?

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.

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