Kann I2C mit momentanen Sensoren verwendet werden?

[Bearbeiten: Klärung der Frage] Ist es möglich, Ereignisse auf I2C-Slaves oder einem funktionalen Äquivalent zu sehen?

Ich bin am Brainstorming für ein neues Projekt. Ich verwende ein ESP-12F als Hauptplatine zum Steuern und Empfangen von Eingaben von verschiedenen angeschlossenen Modulen (z. B. Drucktaste, Strahlsensor, Magnetventil, Verschlussauslöser). Jedes Modul (Slave) ist PIC-basiert und kommuniziert mit dem ESP- 12 (Master) mit I2C. Das Senden von Befehlen für Ventile und Trigger über I2C ist unkompliziert. Ich bin mir jedoch nicht sicher, wie ich I2C für von Slaves ausgelöste momentane Ereignisse verwenden soll.

Soll ich einfach weiterhin Statusanfragen an diese Module senden und auf diese Weise nach Änderungen suchen? Ich denke auch darüber nach, die XOR-Logik zu verwenden, um den Pegel einer anderen Leitung umzuschalten, die ich per Interrupt erkennen kann, um die Statusanforderung auszulösen.

Mein Gerät ist zeitempfindlich, ich möchte eine Antwort auf einen Trigger bis zu vielleicht 50-100 Mikrosekunden erhalten.

Ich bin neu in all dem, also fühlen Sie sich frei, mich bei grundlegenden Dingen zu korrigieren, die ich vermisse.

Bitte stellen Sie eine Frage, Leute können nicht antworten, wenn sie keine direkte Frage zu beantworten haben. electronic.stackexchange.com/help/how-to-answer Dieser Beitrag scheint hauptsächlich auf Meinungen zu basieren. Es gibt viele Möglichkeiten, das zu erreichen, was Sie erreichen möchten. Sie wollen den besten Weg?

Antworten (4)

Die Fachbegriffe sind hier Polling , also den Sensor immer wieder auf Änderungen prüfen, vs Interrupt , bei Bedarf auf eine Änderung aufmerksam gemacht werden.

Nein, I2C stellt kein Interrupt-Protokoll direkt zur Verfügung. Eine Teilmenge von I2C, genannt SMBUS, tut dies. Es hat die SMBALERT#, die das Host-Gerät mit einem einzigen Interrupt-Pin hat, an den alle Slave-Geräte anhängen können, und wenn er ausgelöst wird, liest der Host von der speziellen Alert-Response-Adresse (0001 100x) und jedem Slave, der eine ausstehende hat Alert schreibt seine spezifische Adresse. Der Host liest dann direkt daraus. Wenn mehr als einer eine Warnung anhängig ist, findet eine Schlichtung statt, und der Host muss die ARA mehrmals lesen.

Netter Trick, Sie können den Interrupt-Pin überspringen und trotzdem von der ARA abfragen, und dann versuchen Sie nur, wenn Sie eine gültige Adresse erhalten, vom Slave zu lesen. Dies kann die Anzahl der Abfrageversuche verringern, wenn Sie mehrere Slave-Geräte haben.

Natürlich können Sie dies ganz einfach auf I2C implementieren, wenn Sie die Slave-Geräte und das Host-Gerät programmieren können.

Alternativ können Sie alle Mikrocontroller zu Mastern und Slaves machen, indem Sie ein I2C-Multi-Master-Setup implementieren . Lassen Sie die Module zu Mastern werden und schreiben Sie auf Ihr Hauptgerät. Dann wechselt Ihr Hauptgerät in den Master-Modus, um zurückzulesen.

Oder belassen Sie Ihr Hauptgerät einfach als Slave und lassen Sie die Module als Master bei Bedarf darauf schreiben.

Fantastische Informationen, danke! Ich werde einen guten Blick auf SMBUS werfen. Ich hatte eine Zeit lang überlegt, zwei I²C-Kanäle zu verwenden, aber die Mikrocontroller mit zwei Hardware-I²C-Kanälen waren teurer, und ich konnte nicht viele Informationen zum Bitbangen eines Slave-Geräts finden (nur viele Beispiele für Master-Geräte). Ich habe jedoch nicht daran gedacht, die Geräterollen auf einem einzelnen Kanal zu ändern ... Außerdem eine interessante Idee zur Umkehrung der Master / Slave-Rolle. Ich glaube nicht, dass es in meinen Anforderungen funktionieren wird, da meine Module eine Mischung aus Eingabe- und Ausgabegeräten/Sensoren sein werden.

Der I 2 C-Bus per se hat für einen Slave nicht die Fähigkeit, den Master asynchron zu alarmieren.

Sie können den Slave abfragen, wenn dies Ihren Anforderungen entspricht (z. B. Latenz).

Sie können separate Leitungen für Slave-Geräte hinzufügen, um den Master asynchron zu benachrichtigen. Diese Leitungen wären in Bezug auf den I 2 C-Bus (nicht Teil des I 2 C-Busses selbst) außerhalb des Bandes. Als Beispiel sehen Sie hier einen Standard-I2C-E/A-Expander PCA9554 , der einen Alarmausgang hat.

Danke, gut zu wissen, dass meine Gedanken ziemlich auf dem richtigen Weg waren. Gute Verbindung zum PCA9554-Chip auch. Meine Module werden seriell über externe Kontakte verbunden, daher möchte ich alles entweder über die I²C-Leitungen oder höchstens eine andere Leitung, die alle Module gemeinsam nutzen können. Aber jetzt, wo ich von der parallelen Erweiterung weiß, kann mir das definitiv helfen, einige Entscheidungen zu treffen, danke!

Für eine Interrupt/Request-Zeile würden Sie kein XOR verwenden, da zwei gleichzeitige Requests sich aufheben würden. Wenn Sie eine gemeinsame Interrupt-/Anforderungsleitung haben möchten, verwenden Sie verdrahtetes ODER: Machen Sie die Treiber Open-Drain mit einem Pull-up (genau wie die I2C-Leitungen), das einem Active-Low-Interrupt-Eingang auf Ihrer MCU zugeführt wird. Auf diese Weise weiß Ihr Meister, wenn einer Ihrer Sklaven so tief zieht, dass er alle abfragen muss.

Guter Punkt! Ich hatte nicht an gleichzeitige Ereignisse gedacht. Nicht, dass es sehr wahrscheinlich wäre, aber es wäre schmerzhaft gewesen, einen solchen schwer zu reproduzierenden Fehler aufzuspüren

Ein Chip wie der PCF8575 bietet eine I2C-Eingangs- und -Ausgangserweiterung mit integrierter Interrupt-Funktionalität.

Danke, darauf bin ich noch nicht gekommen. Ich probier es aus!