2009-03-13 42 views
2

プラットフォーム - ARM9I2C ISRおよび割り込み

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

私の割り込み処理がokかどうかは疑問です。 IRQを処理するISRでは、割り込みを無効にし、割り込みハンドラの登録を解除し、タスクに信号を送り、I2Cバスから読み出します。最後に、割り込みを再び有効にします。

タスクが上記の信号を処理すると、I2Cバスからデータを読み込もうとしますが、これは失敗します。最後に、私はISRをいつも読んでから再登録します。リード信号の処理中に発生する割込みの禁止/許可はありません。

私の質問はI2Cバスを読み書きするときに割り込みを無効にする必要がありますか?

プログラミング言語は、適切なRTOSを使用して選択します。

+0

IRQが決してアサートされない場合、デバイスから十分なデータおよび/または正しいデータが読み込まれていることを確認して、デバイスがIRQをディアサートするようにしていますか? – bstpierre

+0

デバイスのドキュメントでは、Xデータを常にバスに書き込むように指定しています。そのため、Xバイトだけを読み込もうとしています。 さらに、I2Cを使用してファームウェアをデバイスokにアップデートしています。デバイスが突然IRQラインのデアサートを停止するのは特定のポイントだけです – dubnde

+0

デバイスとプロセッサの間でデータ交換のバーストが発生するまで、これが動作するので競合状態になるかもしれないと考え始めていますが走っています。この時点以前は、コマンドを送信して問題なく応答を得ることができます。 – dubnde

答えて

3

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

I2C割り込みを処理している間に優先度の高い他の割り込みを許可する場合は、I2C割り込みのみを無効にします。 ISRに入るときに割込みハンドラを登録解除することはむしろ珍しいことです。これにより、予期しない動作が発生することがあります。登録されたハンドラがない場合、割り込み自体が有効になり、割り込みが発生します。したがって、ハンドラの登録を解除するのではなく、I2C割り込みを単純に無効にしてください(すでにそうしているかもしれませんが、ハンドラの登録と割り込みの有効化は2種類あります)。

問題を解決するには、割り込みなしでデバイスと通信することをお勧めします。シリアルファッションで読み書きしてみてください。すべてがブロックされていても問題はありません。テストするだけです。これはデバッグがはるかに簡単で、成功した後は割り込みバージョンに移行することができます。

+0

ありがとう、kgiannakakis。非常に有用な答え。私はISRを入力するとすべての割り込みを無効にし、離れると再び有効にします。私はI2C割り込みだけを無効にすることを調査します 登録時の応答は非常に有益です。それを残して調査します あなたのテスト戦略を開始として試みます – dubnde

0

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

ハードウェアのデータシートのコピーを入手することをお勧めします(および/またはベンダーのマニュアルを参照できるように、特定のハードウェアの部品番号をここに記入することをお勧めします)。

+0

ありがとうNate。私はデータシートを持っています.I2Cの実装は仕様に従います。残念ながら、私は契約上の理由で情報を共有することはできません。あなたの洞察は非常に便利です。はい。私は、提案されているようにISRの割り込みを無効/再有効化します。 – dubnde

1

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

関連する問題