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
Vielen Dank für die produktiven Antorten insbesondere von Peter. Werde es dann mal so umsetzen, wenn es selber so verwendest!
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
Ich finde es recht exotisch, in einem Gerät herum zu jumpern, während dies eingeschaltet ist ... Gruß Jobst
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.