Ich habe einen LPC1114 (FN28), für den ich Code schreibe. Derzeit versuche ich, meinem Code eine asynchrone Ansicht der I2C-Schnittstelle bereitzustellen (der Chip verfügt über einen integrierten I2C-Controller). Der Controller selbst ist im Grunde eine Zustandsmaschine, aber da die I2C-Spezifikation kein Timeout oder andere Einschränkungen für die SCL-Taktrate vorgibt, sollte ich in der Lage sein, das Senden zu verzögern (es muss nicht perfekt synchron sein), solange der Controller steuert SCL korrekt, wenn Daten gesendet werden, und hält es niedrig, wenn keine Daten gesendet werden.
Die Idee ist, Daten puffern zu können, die auf dem I2C-Bus gesendet werden sollen. Ein paar Bibliotheken, die ich sehe, gehen damit um, indem sie das Ganze einfach puffern und alles auf einmal bitbangen, was meistens in Ordnung ist, da Sie im Allgemeinen nicht viele Daten über I2C senden, aber ich möchte es richtig machen.
Ich habe den Basiscode eingerichtet und das Problem, das ich beim Übertragen von Daten habe, besteht darin, dass der Controller immer dann, wenn er in den Modus "Daten an Slave senden" wechselt, einen Interrupt auslöst, der mich auffordert, ein Datenbyte zum Senden (oder Senden) auszufüllen ein STOP-Signal). Das Problem ist, wenn ich nichts tue, wird sofort derselbe Interrupt ausgegeben, sodass mein Hauptcode nicht einmal die Möglichkeit hat, ausgeführt zu werden! Was ich möchte, ist die Möglichkeit, dem Controller zu sagen: "Ich habe gerade keine Bytes zu senden, also geben Sie keinen weiteren Interrupt aus, bis ich es Ihnen von meinem Hauptcode aus sage"!
Ich habe etwas aufgerüstet, das funktioniert, indem ich (ab?) das NVIC verwende, um den I2C-Interrupt zu deaktivieren, wenn ich auf Daten warte, und ihn wieder zu aktivieren, wenn ich bereit bin, über die I2C-Schnittstelle zu senden, aber das scheint sehr unorthodox und Ich weiß nicht, ob es wirklich zuverlässig oder sogar korrekt ist, besonders wenn zwischenzeitlich schlimme Dinge mit dem Bus passieren sollten (Busfehler usw.)
Hier ist das Handbuch für den Chip , die Dokumentation für den I2C-Controller befindet sich auf Seite 239. Ich dachte, ich könnte das SI-Steuerbit verwenden, um ihm zu sagen, dass es keinen Interrupt ausgeben soll, bis ich es wieder lösche, aber anscheinend ist das nicht das, wofür es ist.
Hat jemand Erfahrung mit diesem oder ähnlichen I2C-Controllern und weiß, wie ich das erreichen kann, was ich suche? Natürlich muss es möglich sein, da ein Protokoll, bei dem Sie jedes Mal alle Daten im Voraus bereithalten müssen, mir nicht praktikabel erscheint.
Das Deaktivieren des Interrupts, wenn Sie keine Daten zum Senden haben, ist genau der richtige Ansatz für einen Hardware-I2C-Master-Controller.
Wenn die Daten verfügbar sind, aktivieren Sie den Interrupt erneut und Sie nehmen ihn sofort, wodurch das Byte an den Controller übertragen wird.
Chris Stratton
Wouter van Ooijen
Thomas