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.
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
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
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