Forum: Mikrocontroller und Digitale Elektronik I2C mit Logik-Schaltung aktivieren


von Kani (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Einer K. (Gast)


Lesenswert?

Gibt es einen Grund, warum du keinen "echten" I2C Multiplexer verwenden 
möchtest?
z.B. den TCA9548A

von Stefan F. (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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
}

von M. K. (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.