Question

Plate-forme - ARM9

J'ai un appareil tiers connecté via ARM9 via I2C. Mon problème est que la lecture / écriture d'I2C commence à tourner. Il semble que la ligne IRQ soit affirmée mais jamais annulée lorsqu'il y a des données à lire. La lecture échoue car le périphérique tiers NACKs adresse le paquet. Ainsi, toute écriture ultérieure échoue.

Je me demande si mon traitement des interruptions est correct. Dans l'ISR qui dessert l'IRQ, je désactive les interruptions, annule l'enregistrement du gestionnaire d'interruptions, puis signale à la tâche de lire le bus I2C. Enfin, je réactive les interruptions.

Lorsque la tâche traite le signal envoyé ci-dessus, je tente de lire les données du bus I2C mais cela échoue. Enfin, je réenregistre toujours l’ISR après chaque tentative de lecture. Aucune interruption d’activation / désactivation n’a lieu pendant le traitement du signal de lecture.

Ma question est la suivante: dois-je désactiver les interruptions lors de la lecture / écriture sur le bus I2C?

Le langage de programmation de choix est c utilisant un RTOS propriétaire.

Était-ce utile?

La solution

Un point important est de savoir si votre système RTOS / est prêt à prendre en charge les exceptions imbriquées. Si vous évitez les exceptions imbriquées et désactivez toutes les interruptions lors de la saisie d'un ISR et de la réactivation lors de votre départ, vous simplifiez la tâche à moins qu'il n'y ait une bonne raison de le faire.

Si vous souhaitez autoriser d'autres interruptions de priorité supérieure pendant que vous servez l'interruption I2C, désactivez uniquement l'interruption I2C. Il est plutôt inhabituel de désenregistrer un gestionnaire d'interruptions lors de la saisie d'un ISR. Cela peut entraîner un comportement inattendu. En l'absence de gestionnaire enregistré, l'interruption elle-même est activée et une interruption se produit. Donc, au lieu de désenregistrer le gestionnaire, désactivez simplement l’interruption I2C (vous le faites peut-être déjà, mais comme je le vois, enregistrer un gestionnaire et activer une interruption sont deux choses différentes).

Une bonne stratégie pour résoudre votre problème consiste à essayer de communiquer avec le périphérique sans interruption. Essayez de lire / écrire de manière sérielle, peu importe si tout bloque, c’est juste un test. Ceci est beaucoup plus facile à déboguer et une fois que vous avez réussi, vous pouvez passer à la version des interruptions.

Autres conseils

La plupart des interruptions doivent être acquittées ou supprimées. Vous mentionnez l'activation / la désactivation, l'enregistrement / la désenregistrement et le traitement de l'interruption. Il suffit de vérifier que l’interruption est acquittée et / ou effacée / réinitialisée. Cela implique souvent de réécrire le numéro ou le bit d'interruption dans le registre d'interruption en attente. Consultez le manuel ARM spécifique ou votre manuel RTOS.

La nécessité d'activer / désactiver les interruptions pour votre plate-forme cible dépend de votre implémentation matérielle / RTOS spécifique. Malheureusement, tous les fournisseurs de microcontrôleurs ARM (STMicro, Freescale, Oki, etc.) ont la possibilité de mettre en œuvre leur matériel I2C différemment et peuvent avoir des exigences différentes en matière de suppression de l'IRQ.

Je vous recommanderais de trouver une copie de la fiche technique du matériel (et / ou d'afficher le numéro de pièce du matériel spécifique ici afin que nous puissions vous aider à parcourir la documentation du fournisseur avec vous).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top