PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C-Fragen: "Bus-Off" erkennen / Gerät trennen



Jaecko
28.10.2008, 08:29
Moin.

Mal 2 Fragen zum I2C-Bus:

#1) Wie könnte man ein Gerät (Slave) dazu bringen, nachzusehen, ob es noch am Bus hängt? Beispiel: Ich hab ein altes Display einer Microwelle umgebaut, so dass ich das per I2C mit Daten versorgen kann (einfacher Slave), z.B. irgendwelche Parameter anzeigen. Wird die Verbindung getrennt, soll das Display dann z.B. auf eine Uhr umschalten und ein entsprechendes Symbol anzeigen.

Meine Idee: Die Busleitungen werden mit 4,7k-Widerständen am Master auf 5V hochgezogen. Direkt am Slave werden die Leitungen mit Widerständen 1...10M gegen GND gezogen. Ein weiterer Eingang des Controllers überwacht dann den Pegel der z.B. Clock-Leitung. Liegt diese im Leerlauf auf Low, muss wohl die Verbindung weg sein.
Hat jemand ne bessere Idee?

#2) Trennen eines I2C-Geräts vom Bus (weil z.B. mehrere Geräte mit der gleichen SlaveID da sind), und Auswahl eines davon per "Chip Select".
Reicht es, wenn ich hier einfach die Clock-Leitung mit nem NPN-Transistor trenne? Die Stromversorgung zu trennen könnte ja evtl. den Bus stören durch das "tote" Bauteil.

mfG

williwilli
28.10.2008, 09:52
Hallo Jaecko,

Gegenfrage: Betreibst Du den I2C-Bus nach den originalen (Phillips-) oder nach RN-Spezifikationen? Und was bedeutet "trennen" für Dich?

- Für die originalen Spezifikationen sehe ich keine einfache Chance auf Bus-Control, da theoretisch auch längere Phasen ohne Aktivität denkbar sind. Du bräuchtest dann Intelligenz, die entscheidet, nach welcher Zeit "vom Bus getrennt" erreicht ist.
Eine "tote" Baugruppe kannst Du einfach vom Bus entfernen (abziehen). Dazu wurde er entworfen...

- Für I2C nach RN-Spezifikationen könntest Du die 5V auf Pin 5/7 verwenden. Auch mit eigener Spannungsversorgung ist's doch möglich, über diese Spannung einen Schalter (Transistor, Mini-Relais etc.) zu betätigen.
Eine "tote" Baugruppe kannst Du immer noch einfach vom Bus entfernen (abziehen); und Inaktivität einer Baugruppe stört den Bus nicht...

Wie Du aber mehrere Baugruppen mit gleicher ID an einem Bus betreiben willst, und wie diese dann entscheiden sollen, welche Baugruppe bei einer ID gemeint ist, bleibt mir ein Rätsel: "Chip Select" gibt es bei I2C nicht.

Jaecko
28.10.2008, 10:45
Naja, codemässig verwend ich als Grundlage die C-Lib von P.Fleury; Stecker ist die RN-Definition.
Fragentechnisch gehts aber um 2 verschiedene "Probleme".

Zum Trennen: Die Idee mit den 5V/12V ist garnicht so schlecht, wird sich wohl auch draus rauslaufen.
Ein Timeout klappt hier ja nicht, da ich ja nicht weiss, ob seit z.B. 1 Stunde das Kabel abgezogen ist oder ob einfach nur 1 Stunde lang nix gesendet wurde.

Zum "Abschalten":
Der "Chip Select" soll nicht über den I2C-Bus, sondern über freie Pins des Masters geschehen, also mehr oder weniger unabhängig davon.

Beispiel: Bei den 24STxx I2C-EEPROMs lässt sich die Adresse ja mit 3 Bit einstellen, d.h. ich kann vom gleichen Typ nur max. 8 haben.
Ich pack jetzt jeweils 8 von denen auf ne Steck-Platine.
Jede Platine soll dann über eine der "CS"-Leitungen anwählbar sein.
Und da stell ich mir eben soetwas vor, wie die Clock-Leitung nur für die jeweils gewählte Platine durchzulassen; für die anderen wird diese getrennt.
Beim Trennen der Stromversorgung hab ich halt die Vermutung, dass die nicht versorgten Slaves den Bus stören.
Ein Relais, das einfach SCL/SDA/+5V wegschaltet, wäre zwar wohl die einfachste Möglichkeit, aber rein schaltungstechnisch sollte die Energie eines Controllerpins zum Schalten reichen, d.h. Relais wird nichts.

Vitis
28.10.2008, 11:16
man könnts auch per protokoll machen ...

so in der art, timer gesteuert get alle 1/2 sekunde n
ping vom master über den bus, kommt der beim slave
nicht mehr an geht er halt in nen anderen modus.
und natürlich auch umgekehrt.
da die twi ja in hardware da ist brauchts da nicht
viel rechenaufwand masterseitig.
und der slave kann interruptgesteuert "aufgeweckt"
werden.

quasi n watchdog.