Forum: Mikrocontroller und Digitale Elektronik I²C-Slave funktionstüchtig nach Trennung von SCL?


von M. H. (gummiwipfel)


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

von Peter R. (pnu)


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.

von Klaus (Gast)


Lesenswert?

http://ics.nxp.com/products/i2cmuxes/

hier ist sowas beschrieben, möglicherweise helfen auch die Datenblätter 
der entsprechenden Chips.

MfG Klaus

von Karl H. (kbuchegg)


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.

von Jörg S. (joerg-s)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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.

von M. H. (gummiwipfel)


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?

von Frank K. (fchk)


Lesenswert?

Von NXP gibts I2C Multiplexer/Switches wie PCA9544/PCA9545. Die lösen 
Dein Problem.

fchk

von meckerziege (Gast)


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.

von M. H. (gummiwipfel)


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 :)

von Peter R. (pnu)


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.

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.