Mehrere Master für i2c-Geräte

Ich habe einen DS1307 RTC-Chip, den ich mit mehreren Mastern verbinden möchte. Einer, ein ATMega-Chip, muss eigentlich immer nur Zeitdaten vom Chip abrufen, und der andere (wahrscheinlich nur ein ATTiny) wird nur dazu da sein, drahtlose Zeitaktualisierungen zu empfangen und die Zeit auf der RTC zu aktualisieren. Mir ist klar, dass ich diese drahtlose Aktualisierungsfunktion einfach in den ATMega-Chip einbauen könnte, aber ich versuche, an einer modularen RTC-Karte zu arbeiten, die, was den ATMega betrifft, genau die gleiche ist wie jede andere ähnliche RTC wie die DS1307 oder DS3231 (Chronodot).

Die Frage ist, kann ich alles einfach an die gleichen zwei i2c-Busleitungen anschließen und mit der RTC von BEIDEN Chips kommunizieren? Wenn ja, muss ich irgendetwas tun, um sicherzustellen, dass nicht beide gleichzeitig versuchen? Da i2c bereits mehrere Slave- Geräte unterstützt, gehe ich davon aus, dass dies generell für mich erledigt werden sollte. Aber im Allgemeinen sollte dies funktionieren. Ich bin damit einverstanden, dass der ATMega versucht, die Zeit zu bekommen und warten muss, ob die RTC aktualisiert wird. Was sowieso selten wäre, vielleicht höchstens stündlich.

Gedanken?

Antworten (1)

Du hast Recht. Multimaster muss von Ihnen gehandhabt werden. i2c Multi-Master-Beschreibung . Die Hauptsache für ein richtiges Multimaster-System ist, dass es die Arbitrierungslogik versteht und erkennen kann, wann das System beschäftigt ist. Ersteres ist schwieriger als letzteres. Um zu erkennen, wann das System beschäftigt ist, muss jeder Multi-Master in der Lage sein, auf eine Startbedingung zu prüfen und auf eine Stoppbedingung zu warten, bevor er versucht, den Bus zu verwenden. Arbitrierungslogik ist für Situationen, in denen beide Master gleichzeitig versuchen könnten, den Bus zu übernehmen.

Aber es gibt andere Möglichkeiten, dies außerhalb des i2c-Standards zu tun. Sie können für jeden der Master einen zusätzlichen Pin verwenden und ein einfaches Besetztzeichen zum Standard machen.

Überprüfen Sie, ob der Busy-Pin eingeschaltet ist.

Wenn Aus, setzen Sie eine Statusvariable auf Ein und einen Busy-Pin auf Ein und sprechen Sie dann mit der RTC. Wenn Sie fertig sind, setzen Sie Variable und Pin auf Off.

Wenn Ein, prüfen Sie, ob die Statusvariable Ein ist (Habe "I" die Statusvariable auf Ein gesetzt?). Wenn nein, Schleife, bis der Busy-Pin ausgeschaltet ist.

Während viele Aspekte von I2C ziemlich clever sind, hat Multi-Master einige Einschränkungen. Unter anderem, wenn zwei Master gleichzeitig zu sprechen beginnen, wird ein Schlichtungsfehler nicht erkannt, es sei denn, sie versuchen, unterschiedliche Dinge zu sagen. Bevor dies geschieht, können viele Bytes ausgetauscht werden, und in einigen Fällen kann es überhaupt nicht passieren. Wenn zwei Master beide versuchen, einen „Zähler inkrementieren“ an ein Gerät zu senden, kann jeder Master (korrekt) wahrnehmen, dass das Gerät einen „Zähler inkrementieren“-Befehl erhalten hat, aber daraus schließen (nicht notwendigerweise richtig), dass der Zähler in seinem Namen inkrementiert wird .