Forum: Mikrocontroller und Digitale Elektronik Adressvergabe I²C


von Schmidts Katze (Gast)


Lesenswert?

Hallo!

Zu I²C findet man viel und doch zu wenig. Daher wäre es nett, wenn 
jemand meine Überlegung bestätigen könnte.

Ich habe am I²C-Bus drei Sensoren. Über einen Adresspin kann man 
auswählen, ob ein Sensor auf die Adresse x1 oder x0 anspricht. Das heißt 
ich kann über den Pin zwischen zwei Adressen wählen. Nun habe ich aber 
drei Sensoren. Kann ich nun an jeweils zwei Sensoren eine 0 vergeben 
(die Adresse ist somit doppelt belegt) und an den Sensor den ich 
abfragen will die 1?
Bei der Abfrage des nächsten Sensors bekommt er die 1, der eben 
Abgefragte wie der Dritte die 0.

Das Prinzip wäre also ähnlich dem Chipselect beim SPI.

"Schaut" der Sensor denn bei der Initialisierung, welche Adresse er hat 
(dann würde es nicht gehen, da ich ihn vor jeder Abfrage neu starten 
müsste) oder vergleicht er seine aktuelle Adresse stets nur bei einer 
Anfrage des Host nach einer bestimmten Adresse?

Da es sich um mehrere Sensoren handelt und um keinen einzelnen (in den 
DB war nichts zu finden) bitte somit von einem allgemeinen I²C-Bus mit 
mehreren Teilnehmern ausgehen.

Ich danke euch für eure Mithilfe!

von Floh (Gast)


Lesenswert?

Schmidts Katze schrieb:
> Das heißt
> ich kann über den Pin zwischen zwei Adressen wählen. Nun habe ich aber
> drei Sensoren.

2 Adressen -> 2 Sensoren an einem Bus. :-)
Jedes Gerät hat eine eindeutige Adresse.
Es gäbe noch eine Möglichkeit über Busmultiplexing zu arbeiten, ist aber 
aufwendig.
Was sind denn das genau für Sensoren?
:-)

von Fabian B. (fabs)


Lesenswert?

Radio Eriwan: ob der Chip seine Adresse immer wieder einliesst oder nur 
einmal kommt auf den Chip an. Viele machen es aber nur ein mal.

"Legal" im Sinne der Adressierung von I²C ist dein Vorgehen jedenfalls 
nicht. Und ich würde nicht erwarten das es geht (s.o.).

Besser wäre es du findest einen Sensor der 2bit zur Adressvergabe hat, 
oder kommst mit zwei Sensoren aus.

Gruß
Fabian

von Schmidts Katze (Gast)


Lesenswert?

Wie gesagt, über einen Adresspin, kann man die Adresse variieren. Legt 
man den Pin auf GND endet die Adresse mit 0. Bekommt der Pin VDD, endet 
die Adresse mit 1.

Deshalb hat der Sensor eine Adresse abhängig des Status an diesem Pin.

Deshalb die Frage, ob ich mehrere Sensoren mit der gleichen Adresse auf 
dem Bus haben kann, die ich nicht abfrage (Adresse mit 0 am Ende), um 
dann die Adresse des Sensors zu ändern, den ich abfragen möchte 
(Adresspin auf High --> Adresse endet mit 1).

@holger: Bitte von einem allgemeinen I²C-Bus ausgehen. Das heißt du 
darfst dir alle ICs mit einer solchen Schnittstelle vorstellen die du 
möchtest!

von Schmidts Katze (Gast)


Lesenswert?

Danke Fabian!

von Dave (Gast)


Lesenswert?

Ich finde die Idee mit dem Multiplexen nicht schlecht. Du könntest 
beispielsweise den PCA9548A von TI benutzen. Du müsstets dadurch aber 
jeweils zusätzlich auch mit diesem Chip kommunizeren, was aber kein 
Problem ist.

Gruss
Dave

von H.Joachim S. (crazyhorse)


Lesenswert?

du hast nicht verstanden, was man dir sagen wollte...
x-beliebiger I2C: nein geht so nicht.
_dein_spezieller_i2c_chip_: könnte funktionieren.
Mehr kann man nicht sagen.

von Floh (Gast)


Lesenswert?

Schmidts Katze schrieb:
> Deshalb die Frage, ob ich mehrere Sensoren mit der gleichen Adresse auf
> dem Bus haben kann, die ich nicht abfrage (Adresse mit 0 am Ende), um
> dann die Adresse des Sensors zu ändern, den ich abfragen möchte
> (Adresspin auf High --> Adresse endet mit 1).

Es gibt keine Enablesignale beim i2c.
Daher wird es vielleicht funktionieren, vielleicht nicht. Das kommt eben 
darauf an, ob der Sensor die Adresse jedes mal neu abfrägt oder ob er 
sie intern speichert.

Da solche Dinge aber nicht im Datenblatt stehen, ist es sinnlos, darüber 
zu lamentieren.
:-)

von Peter D. (peda)


Lesenswert?

Schmidts Katze schrieb:
> Deshalb die Frage, ob ich mehrere Sensoren mit der gleichen Adresse auf
> dem Bus haben kann, die ich nicht abfrage (Adresse mit 0 am Ende), um
> dann die Adresse des Sensors zu ändern, den ich abfragen möchte
> (Adresspin auf High --> Adresse endet mit 1).

Ja das geht so.

Du kannst dann einen PCF8574 nehmen, der die 3 Adreßpins umschaltet.


Peter

von Peter D. (peda)


Lesenswert?

Floh schrieb:
> Es gibt keine Enablesignale beim i2c.
> Daher wird es vielleicht funktionieren, vielleicht nicht. Das kommt eben
> darauf an, ob der Sensor die Adresse jedes mal neu abfrägt oder ob er
> sie intern speichert.
>
> Da solche Dinge aber nicht im Datenblatt stehen, ist es sinnlos, darüber
> zu lamentieren.
> :-)

Du hast seine Frage nicht verstanden. Er legt alle nicht anzusprechenden 
Sensoren auf eine Adresse, die der Master niemals sendet. Und somit sind 
sie quasi disabled.

Auf die gesendete Adresse hört also immer nur der selektierte Sensor.
Und damit wird auch kein Datenblatt oder der I2C-Standard verletzt.

Das habe ich selber schon gemacht, funktioniert einwandfrei.


Daneben ist es aber durchaus erlaubt, daß mehrere Slaves auf eine 
Adresse hören, die General-Call-Adresse ist dafür ein Beispiel.
Man kann z.B. eine Init-Sequenz an alle Sensoren zugleich schicken.


Peter

von Schmidts Katze (Gast)


Lesenswert?

Vielen Dank für die produktiven Antorten insbesondere von Peter. Werde 
es dann mal so umsetzen, wenn es selber so verwendest!

von H.Joachim S. (crazyhorse)


Lesenswert?

Genau da kann man eben auf die Schnauze fallen, ist mir auch schon 
passiert.
Waren glaub ich i2c-Eproms von Atmel.
Da wurde die slave-Adresse ausschliesslich beim power-up eingelesen, 
anschliessend der Pegel an den Adresspins komplett ignoriert. Und dann 
funktioniert das Verfahren eben nicht mehr.

von Floh (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Auf die gesendete Adresse hört also immer nur der selektierte Sensor.
> Und damit wird auch kein Datenblatt oder der I2C-Standard verletzt.

Nur der I2c-Standard definiert nicht, dass die eigene Adresse bei jedem 
Adressvergleich neu eingelesen werden muss. Und da liegt der 
Knackpunkt, es kann funktionieren, ist aber von der Implementierung im 
jeweiligen Slave abhängig. :-)

von Peter D. (peda)


Lesenswert?

Floh schrieb:
> Nur der I2c-Standard definiert nicht, dass die eigene Adresse bei jedem
> Adressvergleich neu eingelesen werden muss.

Dem I2C-Standard ist es egal.
Es sollte aber im Datenblatt des jeweiligen ICs stehen, ob die Adresse 
nach Anlegen von VCC nicht mehr geändert werden darf. Kennt jemand so 
einen IC?

Der PCF8574/A läßt sich jedenfalls auf diese Art kaskadieren, wenn man 
mehr als 16 Ports braucht.


Peter

von Jobst M. (jobstens-de)


Lesenswert?

Ich glaube, ich würde den I²C des Prozessors mittels CMOS-Schaltern 
(4053) zwischen zwei Bussen, an denen dann jeweils 2 dieser Sensoren 
sitzen können, umschalten.
Für die Steuerleitung muss dann entweder ein Prozessorpin herhalten oder 
an dem I²C (an der nicht umgeschalteten Seite ) Sitzt ein PCF8574, der 
dieses Steuersignal bereit stellt.

In der SW muss man dann nur berücksichtigen, daß erst umgeschaltet wird, 
wenn keine Kommunikation (mit den Sensoren) mehr auf dem Bus ist.

Gruß

Jobst

von (prx) A. K. (prx)


Lesenswert?

Peter Dannegger schrieb:

> Es sollte aber im Datenblatt des jeweiligen ICs stehen, ob die Adresse
> nach Anlegen von VCC nicht mehr geändert werden darf.

So exotische Fragen findet man evtl. nur in der seltenen Spezialversion 
für Querdenker beantwortet, fürchte ich.

von Peter D. (peda)


Lesenswert?

A. K. schrieb:
> So exotische Fragen findet man evtl. nur in der seltenen Spezialversion
> für Querdenker beantwortet, fürchte ich.

So exotisch finde ich die Frage nicht.
In der Regel erwartet man, daß z.B. wenn ich Jumper umstecke, die 
Änderungen auch wirksam werden, spätestens aber nach einem CPU-Reset.
I2C-ICs haben aber keinen Reseteingang, also sollten sie sich Exotik 
verkneifen.


Ein derart exotisches Verhalten hat mich beim AVR einige Zeit gekostet. 
Ich hab die Watchdog-Fuse gelöscht und der Watchdog blieb trotzdem 
aktiv. Ich mußte erst das STK500 ausschalten, ehe die Fuse übernommen 
wurde.
Der Resettaster hat nicht gereicht.


Peter

von Jobst M. (jobstens-de)


Lesenswert?

Ich finde es recht exotisch, in einem Gerät herum zu jumpern, während 
dies eingeschaltet ist ...


Gruß

Jobst

von Jörg S. (joerg-s)


Lesenswert?

Hab ich beim TDA7309 auch schon so gemacht.

Ich denke das das in den meissten Fällen auch so klappen wird. Es macht 
ja auch wenig sinn die Adresse beim Start extra in eine RAM Zelle zu 
kopieren. Das direkte durchschalten der Pins beim Adressvergleich ist 
wesentlich einfacher.
Bei EEPROMs könnte das tatsächlich etwas anders sein, da dort teilweise 
die Chip-Adresse mit der Adressierung der Speicherbereiche vermischt 
wird.

von Peter D. (peda)


Lesenswert?

Kann vielleicht jemand mal so einen exotischen I2C-IC mit Power-On 
Adreßlatch nennen?
D.h. genaue Bezeichnung, Hersteller.

Oder ist das alles nur ne bloße Vermutung und existiert garnicht?


Peter

von frank (Gast)


Lesenswert?

H.joachim Seifert schrieb:
dazu etwas, wusste nur nicht mehr den Typ:
> Waren glaub ich i2c-Eproms von Atmel.
frank

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.