Forum: Mikrocontroller und Digitale Elektronik I2C-Controller Adressierung


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Patrick G. (gschwend92)


Lesenswert?

Hallo an alle,

Bin neu hier im Forum und hoffe daher, dieser Beitrag ist im richtigen 
Thema gelandet. Kenn mich noch nicht so aus.

Nun zu meiner Frage: Ich würde gerne mit einem Raspberry Pi per I2C 
diverse Transistormodule ansteuern. Die IO-Module würde ich dabei selbst 
entwickeln mit einem MCP23017 oder ähnlich. Das Problem ist nun aber die 
Adressierung der Controller. Der Standard I2C-Bus wird laut Wikipedia 
spezifiziert mit 7 Adressbits mit denen insgesamt 112 Slaves adressiert 
werden können (restlichen 16 Adressen für Sonderzwecke reserviert).

Der MCP23017 und auch alle anderen I2C Controller die ich gefunden habe 
haben aber nur 3 Pins für die Adressierung. Die 7 Slaves welche damit 
angesteuert werden können, sind für mein Projekt aber leider zu wenig. 
Gibt es eine Möglichkeit, die restlichen Adressbits zu verwenden? Oder 
gibt es andere Controller mit 7 Adresspins?

Bin um jede Hilfe dankbar...

Viele Grüsse,
Patrick

von Oliver S. (oliverso)


Lesenswert?

Stichwort „i2c multiplexer“

Oliver

von Thomas W. (Gast)


Lesenswert?


von Wolfgang (Gast)


Lesenswert?

Patrick G. schrieb:
> Gibt es eine Möglichkeit, die restlichen Adressbits zu verwenden?

Die restliche Adressbits musst du sogar verwenden, wenn du mit dem 
MCP23017 sprechen möchtest. Im Datenblatt FIGURE 3-4 bzw. 3-6 siehst du, 
dass die anderen vier Bits der Adresse fest auf 0b0100 liegen.

von Wolfgang (Gast)


Lesenswert?

p.s.
Warum verwendest du nicht den MCP23S17.
Damit hättest du mehr Freiheit, weil du die über \CS auseinanderfädeln 
kannst.

von Bauform B. (bauformb)


Lesenswert?

Manche LED-Treiber mit I2C verstehen über 100 Adressen. Allerdings wird 
mit so vielen ICs die kapazitive Belastung u.U. zu hoch. Die haben aber 
auch 16 oder mehr Ausgänge pro Baustein, z.B.
PCA9685, 6 Adress-Pins, 16 Push-Pull Ausgänge
PCA9955B, 3 Adress-Pins aber 125 Adressen, 16 Ausgänge
IS31FL3265A, 2 Adress-Pins aber 16 Adressen, 18 Ausgänge
Die letzten beiden haben eigentlich nur Ausgänge, aber sie können 
messen, ob ein Ausgang offen oder kurzgeschlossen ist. Die 
Fehlererkennung kann man als Eingang missbrauchen.

Es gibt auch extreme I/O-Expander, der CY8C9560A hat 6 bis 7 
Adress-Pins, mehr Push-Pull I/O als ich zählen mag (ca. 60) und noch ein 
paar Gimmicks. Und Digikey und Mouser haben den auf Lager.

Etwas kleiner sind die CY8C9540A und CY8C9520A. Oder noch ein ganz 
normaler: PCA9506 mit nur 3 Adress-Pins, aber 40 I/O.

Edit: PCA9554 und PCA9554A haben auch nur 3 Adress-Pins, 8 Adressen und 
8 I/O, aber der feste Teil der Adresse ist unterschiedlich. Also kann 
man 16 Bausteine anschließen.

: Bearbeitet durch User
von Patrick G. (gschwend92)


Lesenswert?

Besten Dank für die schnellen Antworten.

Das mit dem Multiplexer ist ein guter Tipp, werde ich sicher mal 
anschauen.

@Wolfgang: Der MCP23S17 verwendet den SPI-Bus, da ich aber den I2C 
nehmen möchte, habe ich diesen Controller nicht weiter angeschaut.

@Bauform: Gute Idee mit dem LED-Treiber PCA9685. Der CY8C9520A ist aber 
im Moment glaub der beste Kandidat für meine Zwecke.

Nochmal Danke für die schnelle Hilfe und noch einen schönen Abend.

von Carsten-Peter C. (carsten-p)


Lesenswert?

Hallo, ich nehme gerne einen  ATtiny als I2c Slave. Da kann ich die 
Adressen frei wählen.
Gruß Carsten

von Stefan F. (Gast)


Lesenswert?

Hast du erwägt, einfache Schieberegister zu verwenden? Das könnte unter 
Umständen erheblich billiger werden. Ist dann allerdings eher SPI als 
I2C.

von Wolfgang (Gast)


Lesenswert?

Patrick G. schrieb:
> @Wolfgang: Der MCP23S17 verwendet den SPI-Bus, da ich aber den I2C
> nehmen möchte, habe ich diesen Controller nicht weiter angeschaut

Wenn es dein fester Wunsch ist, quäle dich mit der beschränkten 
Adressauswahl der I2C Variante - jeder wie er möchte ;-)

Mit SPI hättest du eine Sorge weniger.

von Andi (Gast)


Lesenswert?

Bei solchen Überlegungen klingeln bei mir immer gleich alle 
Alarmglocken:
Wie lange sollen denn die I2C Leitungen werden?
Was soll geschaltet werden?

Alles im Hinblick auf eventuell auftretende Störungen, die sich bei I2C 
kaum in den Griff kriegen lassen.
Und bei ...

Stefan F. schrieb:
> Hast du erwägt, einfache Schieberegister zu verwenden? Das könnte unter
> Umständen erheblich billiger werden.

... Schieberegister desaströs enden können.

Bitte setzt ihm keinen Floh ins Ohr ;)

Beitrag #7267515 wurde vom Autor gelöscht.
von Steve van de Grens (roehrmond)


Lesenswert?

Wo I²C geht, geht meistens auch SPI. Beide sind für kurze Leitungen 
gedacht. Wenn die Leitungen länger als 20cm sind muss man sich sowieso 
Gedanken um die Leitungsanpassung und Filterung von Störungen machen.

von Peter D. (peda)


Lesenswert?

Steve van de Grens schrieb:
> Wo I²C geht, geht meistens auch SPI.

Nö.
SPI benutzt viel höhere Frequenzen und ist daher deutlich 
störempfindlicher. Wir hatten damit großen Ärger, auch nur über eine 
Backplane auf eine andere Platine zu gehen. Da mußte erstmal mit 
RC-Gliedern und Schmitt-Trigger umständlich entstört werden.
Z.B. der 74HC595 von NXP kann bis 108MHz. Dagegen ist der PCF8574/A mit 
max 100kHz quasi um den Faktor 1000 störfester.

von Bauform B. (bauformb)


Lesenswert?

Peter D. schrieb:
> Steve van de Grens schrieb:
>> Wo I²C geht, geht meistens auch SPI.
>
> Nö.
> SPI benutzt viel höhere Frequenzen und ist daher deutlich
> störempfindlicher.

Nicht nur das. Die I2C-Spec schreibt auch interne Filter an SCL und SDA 
vor. Beim PCA9506 steht z.B. im Datenblatt
1
Input filters on the SDA and SCL inputs
2
suppress noise spikes less than 50 ns.
 Die neueren Chips können noch mehr:
1
Adapts its SDAH and SCLH input filters according to
2
the spike suppression requirement in Hs-mode.

von Patrick G. (gschwend92)


Lesenswert?

Da ich flexibel bleiben möchte und es zwei unterschiedliche Platinen als 
IO-Module geben wird, sehe ich beim I2C einfach mehr Vorteile als beim 
SPI. Die Geschwindigkeit der Kommunikation ist nicht relevant, da nur 
Relais geschaltet und irgendwelche Endschalter eingelesen werden.

Trotzdem behalte ich mir den Tipp mit dem SPI mit Schieberegistern für 
den CS-Pin im Hinterkopf ;)


Andi schrieb:
> Bei solchen Überlegungen klingeln bei mir immer gleich alle
> Alarmglocken:
> Wie lange sollen denn die I2C Leitungen werden?
> Was soll geschaltet werden?
Die Leitungen sind max 1m lang, jedoch liegen die im gleichen Kabelkanal 
wie die 230V Leitungen. Müsste man da geschirmte Kabel nehmen? Oder die 
Taktfrequenz vom I2C drosseln?
Geschaltet werden sollen einfache Relais, z.B. um kleine Wasserpumpen 
anzusteuern. Also nicht zeitkritisch.

von Bauform B. (bauformb)


Lesenswert?

Andi schrieb:
> Wie lange sollen denn die I2C Leitungen werden?
> Bitte setzt ihm keinen Floh ins Ohr ;)

Na dann... also doch einen uC als I/O-Erweiterung. Und UART statt I2C 
und den ultimativen RS-422 Treiber LTC2863-2 :)

Aber im Ernst: heutzutage, mit ±1% internem Takt und internem Flash, ist 
das eine echte Alternative. Und viel flexibler.

: Bearbeitet durch User
von Steve van de Grens (roehrmond)


Lesenswert?

Peter D. schrieb:
> SPI benutzt viel höhere Frequenzen

Ich dachte, das der Programmierer die Frequenz beliebig langsam 
festlegt.

Bauform B. schrieb:
> Die I2C-Spec schreibt auch interne Filter an SCL und SDA vor.

Macht Sinn, deswegen schreib ich auch

Steve van de Grens schrieb:
> Wenn die Leitungen länger als 20cm sind muss man sich sowieso
> Gedanken um die Leitungsanpassung und Filterung von Störungen machen.

Patrick G. schrieb:
> Die Leitungen sind max 1m lang, jedoch liegen die im gleichen Kabelkanal
> wie die 230V Leitungen. Müsste man da geschirmte Kabel nehmen?

Muss nicht zwingend sein, hilft aber bestimmt wenn es nicht klappt. Noch 
sicherer ist eine differentielle Übertragung wie bei RS422. Aber bei 1m 
muss man sich schon sehr anstrengen, das Signal nennenswert zu stören.

Bei dir reicht wahrscheinlich ein 51Ω Serienwiderstand am der 
Signalquelle (zum Unterdrücken von Reflexionen im Kabel), sowie ein R/C 
Tiefpass (100Ω,1nF) am anderen Ende des Kabels zum Unterdrücken von 
Hochfrequenten Störungen.

> Oder die Taktfrequenz vom I2C drosseln?

Das würde nur in Kombination mit Filtern helfen. Allerdings willst du 
wohl kaum Frequenzen oberhalb von 50Hz weg filtern und mit der 
Übertragungsrate so extrem runter gehen.

: Bearbeitet durch User
von Bernd (Gast)


Lesenswert?

Man muss die bei SPI möglichen höheren Taktraten ja nicht ausnutzen, 
beide Busse, I2C und SPI kann man prinzipiell beliebig langsam 
betreiben. Falls ein Controller nur I2C unterstützt, kann man SPI auch 
in Software nachbauen. Das Protokoll ist auch nicht wesentlich 
komplexer.

Bernd

von Bauform B. (bauformb)


Lesenswert?

Bernd schrieb:
> Man muss die bei SPI möglichen höheren Taktraten ja nicht ausnutzen

Das hilft nur, wenn man auch Filter einbaut. Die SPI-Chips reagieren ja 
immer gleich schnell auf Störungen, egal, wie niedrig die Taktfrequenz 
ist.

von Wolfgang (Gast)


Lesenswert?

Bauform B. schrieb:
> Das hilft nur, wenn man auch Filter einbaut. Die SPI-Chips reagieren ja
> immer gleich schnell auf Störungen, egal, wie niedrig die Taktfrequenz
> ist.

Filter darf man gerne einbauen, z.B. TP mit Schmitt-Trigger.
Als Vorteil gegenüber I2C hat man es bei SPI mit symmetrisch getriebene, 
solide Pegel (Push-Pull an Stelle von Pull-Up) zu tun und muss sich 
nicht mit bidirektionalen Treibern rumschlagen.

Patrick G. schrieb:
> Die Leitungen sind max 1m lang, jedoch liegen die im gleichen Kabelkanal
> wie die 230V Leitungen.

Na hoffentlich werden dabei die Vorschriften bzgl. der Isolation 
verschiedener  Spannungsbereich nach IEC 60449 und VDE 0100-520 
eingehalten.

von Steve van de Grens (roehrmond)


Lesenswert?

Steve van de Grens schrieb:
> Bei dir reicht wahrscheinlich ein 51Ω Serienwiderstand am der
> Signalquelle (zum Unterdrücken von Reflexionen im Kabel), sowie ein R/C
> Tiefpass (100Ω,1nF) am anderen Ende des Kabels zum Unterdrücken von
> Hochfrequenten Störungen.

Ich habe vergessen zu erwähnen, dass dieser Absatz für SPI gilt, nicht 
für I²C. Bei I²C sind bereits Filter in die Chips integriert (schrieb 
schon jemand anderes).

von c-hater (Gast)


Lesenswert?

Peter D. schrieb:

> SPI benutzt viel höhere Frequenzen und ist daher deutlich
> störempfindlicher.

Das ist doch Quatsch. SPI KANN zwar deutlich höhere Frequenzen 
verwenden, muss es aber NICHT

Und wann man das dann auch nicht tut, sondern im Bereich "normaler" 
I2C-Komunikation bis maximal 400kHz bleibt, sieht das mit den Signalen 
sogar deutlich besser aus, weil beide Flanken aktiv getrieben werden. 
Das bissel Klingeln an den Flanken bekommt man leicht weg. Insbesondere 
deshalb, weil sie AC-mäßig halt in etwa gleich sind, im Unterschied zu 
I2C.

Blöd ist halt nur die höhere Zahl von Signalen. Das ist der einzige 
Nachteil. Und natürlich kann man mit entsprechenden Peers auch noch 
diesen Nachteil veringern oder gar komplett loswerden, durch 
Daisy-Chaining. Handelt sich damit allerdings das Risiko des 
Totalausfalls beim Bruch einer einzelnen Strippe ein.

So what: auch bei I2C kann ein einzelner toter Peer den gesamten Bus 
totlegen oder auch ein Masse-Schluss auf einer der beiden Signale.

von M. K. (sylaina)


Lesenswert?

Patrick G. schrieb:
> Der MCP23017 und auch alle anderen I2C Controller die ich gefunden habe
> haben aber nur 3 Pins für die Adressierung. Die 7 Slaves welche damit
> angesteuert werden können, sind für mein Projekt aber leider zu wenig.
> Gibt es eine Möglichkeit, die restlichen Adressbits zu verwenden? Oder
> gibt es andere Controller mit 7 Adresspins?

7 IO-Expander mit 16 Bit sind zu wenig? Du brauchst mehr als 112 IOs um 
Taster einzulesen, Pumpen zu schalten usw.? Mich dünkt man sollte das 
Konzept vielleicht noch mal überdenken. Das klingt nämlich nach einer 
großen Anlage.

Steve van de Grens schrieb:
> Peter D. schrieb:
>> SPI benutzt viel höhere Frequenzen
>
> Ich dachte, das der Programmierer die Frequenz beliebig langsam
> festlegt.

Macht er auch aber so spontan kenne ich kein SPI-Projekt in meinem 
Umfeld, dass weniger als 1 MHz Taktrate verwendet, ich kenne aber jede 
Menge I²C-Projekte, die lediglich mit 100 kHz laufen. Und ich denke, 
darauf wollte Peter hinaus. Klar kann man auch SPI mit 100 kHz laufen 
lassen aber auch meiner Erfahrung nach ist das dann doch recht 
ungewöhnlich für SPI.

von Peter D. (peda)


Lesenswert?

c-hater schrieb:
> Das ist doch Quatsch. SPI KANN zwar deutlich höhere Frequenzen
> verwenden, muss es aber NICHT

Das ist Quatsch, die Störempfindlichkeit hängt ausschließlich vom 
Empfänger ab und nicht von der Datenrate.
Wenn der Empfänger noch auf 100MHz reagiert, kannst Du selbst mit 1Hz 
senden und wirst fehlerhafte Flanken feststellen.
Deshalb wird bei der UART ein Trick angewandt. Der Eingang wird dreifach 
abgetastet, abhängig von der eingestellten Baudrate. Nur dadurch läßt 
sich die Störempfindlichkeit herabsetzen.
Bei I2C werden feste Filter in den Empfänger integriert, die aber 
weniger wirksam sind, wenn der IC auch >100kHz kann.

von Bauform B. (bauformb)


Lesenswert?

Patrick G. schrieb:
> Die Leitungen sind max 1m lang, jedoch liegen die im gleichen Kabelkanal
> wie die 230V Leitungen. Müsste man da geschirmte Kabel nehmen?

Am einfachsten wäre dieses spezielle EIB-Kabel, damit spart man einen 
zweigeteilten Kabelkanal mit Trennwand. Ein Schirm schadet nur, wenn man 
damit eine Erdschleife baut.

> Oder die Taktfrequenz vom I2C drosseln?

Das hilft nicht und ist bei 1m Kabel auch nicht nötig. Bei langen Kabeln 
versucht man, die Pull-Up niederohmiger zu machen und erst wenn das 
nicht reicht, muss die Taktfrequenz gedrosselt werden.

von Wolfgang (Gast)


Lesenswert?

Bauform B. schrieb:
> Ein Schirm schadet nur, wenn man damit eine Erdschleife baut.

Das soll man ja auch nicht. Der Schirm soll die Gehäuse fortsetzen und 
nicht für irgendwelche Signale dienen. Notfalls hilft, ihn nur einseitig 
aufzulegen, kommt halt drauf an, wie das Gesamtkonzept aussieht.

von testo (Gast)


Lesenswert?

Ich würde da ein differenzielles Signal vorschlagen. RS485 zwischen zwei 
Controllern. B steuert dann in der Nähe gelegene Treiber ICs an.

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.