質問

プラットフォーム-ARM9

I2Cを介してARM9に接続されているサードパーティデバイスがあります。私の問題は、I2C読み取り/書き込みがねじれていることです。 IRQラインはアサートされているように見えますが、読み取るデータがある場合はアサート解除されません。サードパーティのデバイスがアドレスパケットをNACKするため、読み取りは失敗します。したがって、その後の書き込みは失敗します。

私の割り込み処理は大丈夫かどうか疑問に思っています。 IRQを処理するISRで、割り込みを無効にし、割り込みハンドラーの登録を解除し、I2Cバスから読み取りを行うようタスクに信号を送ります。最後に、割り込みを再度有効にします。

タスクが上記の信号を処理するとき、I2Cバスからデータを読み取ろうとしますが、これは失敗します。最後に、読み取り試行後は常にISRを再登録します。読み取り信号の処理中に発生する割り込みの無効化/有効化はありません。

私の質問は、I2Cバスの読み取り/書き込み時に割り込みを無効にする必要があるのですか?

適切なRTOSを使用するプログラミング言語はcです。

役に立ちましたか?

解決

重要なことは、RTOS /システムがネストされた例外をサポートする準備ができているかどうかです。正当な理由がない限り、ネストされた例外を回避し、ISRに入るときはすべての割り込みを無効にし、離れるときは再度有効にすると、事態はより単純になります。

I2C割り込みの処理中に他の優先度の高い割り込みを許可したい場合は、I2C割り込みのみを無効にします。 ISRに入るときに割り込みハンドラーの登録を解除するのはかなり珍しいことです。これにより、予期しない動作が発生する場合があります。登録されたハンドラーがない場合、割り込み自体が有効になり、割り込みが発生します。そのため、ハンドラーを登録解除する代わりに、I2C割り込みを単純に無効にします(おそらく既にそうしていますが、見たとおり、ハンドラーの登録と割り込みの有効化は2つの異なることです)。

問題を解決するための優れた戦略は、中断することなくデバイスと通信しようとすることです。シリアル形式で読み取り/書き込みを試みて、すべてがブロックされていても問題ではありません-それは単なるテストです。これはデバッグがはるかに簡単で、成功したら割り込みバージョンに移行できます。

他のヒント

ほとんどの割り込みを確認またはクリアする必要があります。割り込みの有効化/無効化、登録/登録解除、および処理について言及します。割り込みが確認されているか、クリアされているか、リセットされていることを確認してください。多くの場合、これには、割り込み番号またはビットを割り込み保留レジスタに書き戻すことが含まれます。特定のARMマニュアルまたはRTOSマニュアルを確認してください。

ターゲットプラットフォームで割り込みを有効/無効にする必要があるかどうかは、特定のハードウェア/ RTOS実装に依存します。残念ながら、すべてのARMマイクロコントローラーベンダー(STMicro、Freescale、Okiなど)には、I2Cハードウェアを異なる方法で実装する能力があり、IRQをクリアする方法に異なる要件がある場合があります。

ハードウェアデータシートのコピーを見つけることをお勧めします(および/または特定のハードウェアの部品番号をここに投稿して、ベンダーのドキュメントをご提供できるようにいたします)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top