2009-03-13 9 views
2

Plattform - ARM9I2C ISR und Interrupts

Ich habe ein Drittanbieter-Gerät über I2C an den ARM9 angeschlossen. Mein Problem ist, dass das Lesen/Schreiben von I2C eine Wendung bekommt. Es scheint, dass die IRQ-Leitung aktiviert ist, aber niemals deaktiviert wird, wenn Daten zu lesen sind. Das Lesen schlägt fehl, da das Gerät des Drittanbieters das Adressenpaket NACKt. Daher schlägt jeder nachfolgende Schreibvorgang fehl.

Ich frage mich, ob meine Interrupt-Behandlung in Ordnung ist. In der ISR, die den IRQ bedient, deaktiviere ich Interrupts, melde den Interrupt-Handler ab und signalisiere dann der Task, vom I2C-Bus gelesen zu werden. Schließlich aktiviere ich die Interrupts wieder.

Wenn die Task das oben angegebene Signal verarbeitet, versuche ich Daten vom I2C-Bus zu lesen, dies schlägt jedoch fehl. Schließlich registriere ich die ISR nach jedem Leseversuch immer wieder. Während der Behandlung des Lesesignals erfolgt keine Unterbrechung/Freigabe des Interrupts.

Meine Frage muss ich Interrupts beim Lesen/Schreiben auf den I2C-Bus deaktivieren?

Programmiersprache der Wahl ist c mit proprietary RTOS.

+0

Wenn der IRQ nie deaktiviert wird, sind Sie sicher, dass Sie genug und/oder die richtigen Daten vom Gerät lesen, damit es den IRQ deaktiviert? – bstpierre

+0

Die Gerätedokumentation legt fest, dass immer X-Daten auf den Bus gelegt werden, so dass ich nur versuche, diese X-Bytes zu lesen. Mehr noch, ich benutze den I2C, um die Firmware auf das Gerät zu aktualisieren ok.Es ist nur ein bestimmter Punkt, dass das Gerät plötzlich aufhört, die IRQ-Leitung zu deaktivieren – dubnde

+0

Ich fange an zu denken, dass es eine Race-Bedingung, wie es funktioniert, bis zu diesem Zeitpunkt gibt es einen Burst des Datenaustauschs zwischen dem Gerät und dem Prozessor, wo meine Aufgabe läuft. Vor diesem Zeitpunkt kann ich Befehle senden und Antworten ohne Probleme erhalten. – dubnde

Antwort

3

Eine wichtige Sache ist, ob Ihr RTOS/System bereit ist, verschachtelte Ausnahmen zu unterstützen. Wenn es keinen guten Grund dafür gibt, sind die Dinge einfacher, wenn Sie geschachtelte Ausnahmen vermeiden und alle Interrupts bei der Eingabe eines ISR deaktivieren und beim Verlassen wieder aktivieren.

Wenn Sie andere Interrupts mit höherer Priorität zulassen möchten, während Sie den I2C-Interrupt ausführen, deaktivieren Sie nur den I2C-Interrupt. Es ist ziemlich ungewöhnlich, einen Interrupt-Handler bei der Eingabe eines ISR zu entfernen. Dies kann zu unerwartetem Verhalten führen, wenn kein registrierter Handler vorhanden ist, der Interrupt selbst aktiviert ist und ein Interrupt auftritt. Anstatt also den Handler abzumelden, deaktivieren Sie einfach den I2C-Interrupt (Vielleicht machen Sie das schon, aber wie ich es sehe, sind das Registrieren eines Handlers und das Aktivieren eines Interrupts zwei verschiedene Dinge).

Eine gute Strategie, um Ihr Problem zu lösen, wird sein, zu versuchen, mit dem Gerät ohne Unterbrechungen zu kommunizieren. Versuchen Sie es seriell zu lesen/schreiben, es spielt keine Rolle, ob alles blockiert - es wird nur getestet. Dies ist viel einfacher zu debuggen und nachdem Sie erfolgreich sind, können Sie auf die Interrupts-Version wechseln.

+0

Danke kgiannakakis. Sehr hilfreiche Antworten. Ich deaktiviere alle Interrupts beim Eingeben von ISR und reaktiviere beim Verlassen. Ich werde untersuchen deaktivieren nur die I2C-Interrupt Ihre Antwort auf (un) Registrierung ist sehr informativ. Will untersuchen lassen es läuft Wird versuchen, Ihre Teststrategie als Start – dubnde

0

Ob Sie Interrupts für Ihre Zielplattform aktivieren/deaktivieren müssen, hängt von Ihrer spezifischen Hardware-/RTOS-Implementierung ab. Leider kann jeder Hersteller von ARM-Mikrocontrollern (STMicro, Freescale, Oki usw.) ihre I2C-Hardware anders implementieren und hat möglicherweise andere Anforderungen an das Löschen des IRQ.

Ich empfehle Ihnen, eine Kopie des Hardware-Datenblattes zu finden (und/oder die spezifische Hardware-Teilenummer hier zu veröffentlichen, damit wir Ihnen helfen können, die Herstellerdokumentation mit Ihnen zu besprechen).

+0

Dank Nate. Ich habe das Datenblatt. Die I2C Implementierung folgt der Spezifikation. Leider kann ich die Informationen aus vertraglichen Gründen nicht teilen. Deine Einsicht ist sehr nützlich. Ja. Ich deaktiviere/reaktiviere Interrupts in der ISR wie vorgeschlagen. – dubnde

1

Die meisten Interrupts müssen quittiert oder gelöscht werden. Sie erwähnen das Aktivieren/Deaktivieren, Registrieren/Aufheben der Registrierung und die Behandlung des Interrupts. Überprüfen Sie, ob der Interrupt bestätigt und/oder gelöscht/zurückgesetzt wird. Dies beinhaltet häufig das Zurückschreiben der Interrupt-Nummer oder des Interrupt-Bits in das Interrupt-Pending-Register. Überprüfen Sie das spezifische ARM-Handbuch oder Ihr RTOS-Handbuch.