Guten Morgen, ich arbeite zur Zeit an einem großen I2C-Bus, bei diesem Bus ist es unvermeidbar, dass es Slaves mit der gleichen I2C-Adresse gibt. Die Slaves sind ICs der Baureihe ATTINY 85. Mein erster Ansatz war das ganze über einen MUX zu steuern, d.h. ein 1:8 MUX schaltet zwischen den verschiedenen Ports durch, auf welchen die Slaves mit der selben Adresse sind: Aufbau: siehe Bild im Anhang Der Ansatz ist geprüft und funktioniert. Meine Frage an dieser Stelle ist, ob man die I2C-Anbindung mittels eines Logikgatters steuern kann. Das kann man sich folgendermaßen vorstellen: Der ATTINY hat, bei meiner Betriebsart, noch zwei unbelegte, nutzbare Pins. Ich würde an diese Pins eine Leitung zu meinem Master legen, welcher dann über die Leitungen die Zahlen 0-3 binär an den Slave übergibt. Slave_1: Adr. 5 aktiviert I2C nur, wenn an den beiden Pins die Zahl 2 anliegt, Slave_2: Adr. 5 aktiviert den I2C nur, wenn an den beiden Pins die Zahl 3 anliegt, etc. Ist das überhaupt möglich, eine Aktivierung des I2C-Busses über zwei Interrupts an den Eingängen des Attiny's zu verwirklichen? Oder "hören" bei dem Aufruf der Adresse immer alle Slaves zu, egal ob deren binäre Nummer an den Pins anliegt und "antworten" dann alle gleichzeitig mit dem ACK-Bit? Ich weiß, dass es möglich ist die I2C-Adressen auf 10-Bit zu erweitern, ich möchte dies aber an dieser Stelle zu vermeiden.
Gibt es einen Grund, warum du keinen "echten" I2C Multiplexer verwenden möchtest? z.B. den TCA9548A
Alle Slaves warten darauf, dass sie ihre eigene Adresse empfangen. Diejenigen, die sich angesprochen fühlen, antworten mit ACK, die anderen halten ihre Füße still. Deine eigentliche Frage kann ich nicht beantworten, weil mir nicht klar ist, was du mit "aktivieren" meinst.
Eine einfache Lösung ist, Du machst den I2C-Master in Software. Wenn der I2C-Master nicht als Interrupt arbeitet, belegt ein SW-Master auch nicht mehr CPU-Zeit, mehr Flash braucht er ja eh nicht. Über ein Maskenbyte legst Du fest, welcher Portpin aktiv ist. Somit kannst Du mit 2 8Bit-Ports bis zu 8 I2C-Busse auswählen. Hier mal für SDA:
1 | #define I2C_SDA_PORT PORTA
|
2 | #define I2C_SDA_PIN PINA
|
3 | #define I2C_SDA_DDR DDRA
|
4 | |
5 | uint8_t i2C_mask; // 0b00000001 ... 0b10000000 |
6 | |
7 | void sda_low(void) |
8 | {
|
9 | I2C_SDA_PORT &= ~i2c_mask; |
10 | I2C_SDA_DDR |= i2c_mask; |
11 | }
|
12 | |
13 | void sda_high(void) |
14 | {
|
15 | I2C_SDA_DDR &= ~i2c_mask; |
16 | I2C_SDA_PORT |= i2c_mask; |
17 | }
|
18 | |
19 | bool sda_in(void) |
20 | {
|
21 | return I2C_SDA_PIN & i2c_mask; |
22 | }
|
Kani schrieb: > Die Slaves sind ICs der Baureihe ATTINY 85. Damit kannst Du doch I²C umsetzen wie es dir passt. Wenn Dir wirklich die 112 möglichen Adressen nicht reichen, definiere Subadressen. Die Tinys müssen sich ja nicht sklavisch an die I2C Spec halten. Sehr großer I²C Bus hört sich nach sehr großen Leitungskapazitäten an. Sicher das I²C das Mittel der Wahl ist um Deine Anforderungen zu erfüllen? Kani schrieb: > I2C-Anbindung mittels eines Logikgatters steuern Und wie erkennt das Logiggatter die Richtung? Analogschalter würde gehen, wenn die der TCA9548 nicht gefällt.
Kani schrieb: > Ich weiß, dass es möglich ist die I2C-Adressen auf 10-Bit zu erweitern, Bei MCs als Slave kannst Du einfach das 1. Datenbyte als 2. Adreßbyte auswerten. Ich bezweifle allerdings, daß man 768 Slaves parallel zuverlässig zum Laufen bringen kann. Schon 128 Slaves halte ich für gewagt.
Kani schrieb: > Mein erster Ansatz war das ganze über einen MUX zu steuern, d.h. ein 1:8 > MUX schaltet zwischen den verschiedenen Ports durch, auf welchen die > Slaves mit der selben Adresse sind: > > Aufbau: siehe Bild im Anhang Naja, könnte man z.B. mit einem 4051 sofort genau so umsetzen. Besser wäre natürlich ein spezialisierter I2C-MUX. Warum also machst du es nicht einfach so? Alles andere wird nur aufwendiger und weniger zuverlässig.
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.