Frage

Platform - ARM9

Ich habe eine dritte Partei Gerät über I2C zum ARM9 verbunden. Mein Problem ist, das I2C Lese- / Schreib ist in einem Twist bekommen. Es scheint, die IRQ-Leitung aktiviert wird, aber nie de-aktiviert, wenn es um Daten zu lesen ist. Die Lese ausfällt als das Fremdgerät das Adresspaket nacks. So dass jeder nachfolgende Schreib ausfällt.

Ich frage mich, ob meine Unterbrechung in oker Handhabung. In der ISR, die die IRQ-Service, I-Interrupts zu deaktivieren, heben Sie die Registrierung der Handler Interrupt und dann an die Aufgabe signalisieren, aus dem I2C-Bus zu gehen zu lesen. Schließlich habe ich wieder aktivieren, die Interrupts.

Wenn die Aufgabe Dienste das Signal oben gepostet, ich versuche, Daten aus dem I2C-Bus zu lesen, aber dies nicht gelingt. Schließlich habe ich neu registrieren immer die ISR nach je gelesen Versuch. Es gibt keine Unterbrechung aktivieren / deaktivieren, dass stattfindet, das Lesesignals bei der Handhabung.

Meine Frage ist, ich Interrupts tun müssen, um deaktivieren, wenn auf dem I2C-Bus Lesen / Schreiben?

Programmiersprache der Wahl ist c Anstand RTOS verwendet wird.

War es hilfreich?

Lösung

Eine wichtige Sache ist, ob Ihr RTOS / System bereit ist, verschachtelte Ausnahmen zu unterstützen. Es sei denn, es ist ein guter Grund, dies zu tun, sind die Dinge einfacher, wenn Sie verschachtelte Ausnahmen vermeiden und alle Unterbrechungen deaktivieren, wenn eine ISR Eingabe und Wiederfreigabe beim Verlassen.

Wenn Sie andere mit höherer Priorität zulassen mögen Interrupts auftreten, während Sie das I2C-Interrupt dienen, dann deaktivieren nur das I2C-Interrupt. Es ist ziemlich ungewöhnlich, dass ein Interrupt-Handler deregistrieren, wenn ein ISR eingeben. Dies kann zu unerwartetem Verhalten führen, wenn kein registrierter Handler ist, die Interrupt selbst aktiviert ist und eine Unterbrechung auftritt. Anstatt also Aufheben der Registrierung des Handlers, einfach die I2C-Interrupt deaktivieren (Vielleicht machst du schon so, aber wie ich es sehe, einen Handler zu registrieren und ermöglicht einen Interrupt sind zwei verschiedene Dinge).

Eine gute Strategie, um Ihr Problem zu lösen wird, zu versuchen, mit dem Gerät ohne Unterbrechungen zu kommunizieren. Versuchen Sie zum Lesen / Schreiben von ihm in einer seriellen Art und Weise, egal, ob alles blockiert - es ist einfach zu testen. Das ist viel einfacher zu debuggen und nachdem Sie erfolgreich sind Sie auf die Interrupts Version bewegen können.

Andere Tipps

Die meisten müssen Interrupts quittiert oder gelöscht werden. Sie erwähnen die Aktivierung / Deaktivierung, Registrierung / Deregistrierung und Handhabung der Unterbrechung. Überprüfen Sie einfach, dass der Interrupt wird anerkannt und / oder gelöscht / zurückgesetzt. Oft handelt es sich dabei die Interrupt-Nummer oder Bit zurück auf den Interrupt anstehenden Register zu schreiben. Überprüfen Sie die spezifische ARM Handbuch oder Ihre RTOS Handbuch.

Ob Sie / deaktivieren Interrupts für Ihre Zielplattform ermöglichen müssen, ist abhängig von Ihrer Hardware- / RTOS-Implementierung. Leider jeder ARM-Mikrocontroller-Anbieter (STMicro, Freescale, Oki, usw.) hat die Fähigkeit, ihre I2C Hardware unterschiedlich implementieren und unterschiedliche Anforderungen haben kann, wie die IRQ zu löschen.

Ich würde empfehlen, eine Kopie der Hardware Datenblatt finden (und / oder per Post die spezifische Hardware-Teilnummer hier so können wir dazu beitragen, die Herstellerdokumentation übergießen, mit Ihnen).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top