[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.
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.
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.
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.
Ein Chip wie der PCF8575 bietet eine I2C-Eingangs- und -Ausgangserweiterung mit integrierter Interrupt-Funktionalität.
Spannungsspitze