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!
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?
:-)
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
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!
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
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.
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.
:-)
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
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
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.
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. :-)
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
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
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.
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
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.
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