割り込み負荷が大きい場合のI2C読み取り/書き込み障害


10

私のシステムでは、I2Cを使用していますが、(他のソースからの)割り込み負荷が大きいと、I2C通信が簡単に中断されます。これはI2Cの予想される動作ですか?割り込みの負荷にもかかわらず、私は期待していましたが、I2Cは正確にタイムクリティカルなインターフェイスではなく、クロックがデータで提供されるため、それでも問題ありません。

更新:

プロセッサはSTM32です。割り込みはADCが原因です。読み取りイベント中に割り込みを無効にできないため、i2c通信をより安定させることができる解決策を見つける必要があります。STM32はマスターで、スレーブは別のデバイス(加速度計)です。

Update2:

ロジックアナライザーをクロックに小さなフライングケーブルで接続すると、問題が解決します。興味深いことに、割り込みの負荷はなく、読み取りと書き込みはうまく機能します。割り込みの負荷がある場合は機能しません。ただし、プローブをクロックに接続すると、割り込み負荷でも読み取りと書き込みが機能します。容量の問題がどこかにあると思います。


1
すべての質問はシステムの設計に依存するため、質問は非常に一般的です。I2Cの処理方法は、実際にはバス上のデバイスに依存します。それらを無視して後で来ることができますか?FPGAでは、多くのことを処理してこれを回避するロジックを設計できます。繰り返しになりますが、マイクロコントローラーと他に何があるかについての詳細情報が必要です。通常、ここでの適切な解決策は、RTOSを使用してタスクを適切に設計することです。
Gustavo Litovsky 2013

探すべき2つのこと、プルアップまたはi2cマスターとスレーブへの電源の電圧低下、またはemiまたは容量の問題。割り込みの負荷については、マスターが割り込みを処理するために停止しているということですか?一部のチップは、無限のクロックストレッチを許可しません。
通行人2013

@GustavoLitovsky正解ですが、CPUサイクルの80%がADC割り込みにサービスを提供しており、非ISRウィンドウ中に読み取りサイクルを実行するのに十分な時間がありません。したがって、OSシステムをどのように設計しても、読み取りは中断されます。
Ktc 2013

@Passerbyあなたは正しいかもしれません。ロジックアナライザーのプローブをクロックラインに接続すると、問題は解消しました。
Ktc 2013

プルアップの現在の値は何ですか。それらを別の値に変更してみましたか?(最初の推測のためだけに10kまたは4k7または2kを試してください)
Tom L.

回答:


9

これはソフトウェアの問題であり、割り込みの処理に時間がかかりすぎており、I2Cルーチンがそれを処理できない(そのため、2つの点で正しくありません)。私はいくつかの同様の状況を経験しました。

最初:割り込みでできる限り少ないことを行う必要があります。データの読み取りと保存のみを行い、ISRの外部で実行できる処理を実行しないでください。計算ではCPUサイクルが大量に消費され、CPUは他に何もできません。その割り込み中に。

次に、DMAを調査して自動化し、割り込みがほぼバックグラウンドの自動化プロセスになるようにします。

3番目:I2Cが重要な場合は、それも割り込みに入れますが、優先順位を確認してください!

4番目:I2Cルーチンが失敗する理由を解明します。I2C自体が非常に断続的なタイミング、一時停止、待機などに耐えられるため、これを可能にするためにルーチンを変更する必要がある場合があります。

5番目:割り込みを「チェーン」できるかどうかを確認します。ADC読み取りをより効率的に処理できるか、ADCを別のモードにして、中断する前により多くの作業を行うことができます(たとえば、すべての読み取りが利用可能になるまで待機します)。次に、8つの個別のADCチャネル読み取りのための8つの個別の割り込みではなく、1つのヒットですべてを読み取ります)。

6番目:オシロスコープまたはロジックアナライザー、およびボード上の予備のIOピンを使用して、コードの各ビットに費やしている時間を追跡し、スピードアップできるかどうかを確認します。(機能/ ISRに入るときにピンをハイに設定し、終了時に再びローに設定します)。

第7:ADCの読み取りが本当に必要かどうかを判断します。遅くなると状況が悪化しますか?それは直感に反しますが、時々遅くなると実際にはより良い結果が得られ、信号を平均化し、スパイク/過渡現象を削減して問題を引き起こしたり、削除するために追加の処理が必要になることがあります。モーター制御PIDルーチンを1/4の速度で実行することにより改善し、プロセスのCPU時間の負荷を解放しました。


提案をありがとう。問題はどういうわけかハードウェアを指しています。
Ktc 2013

4

他のものでビジーなバススレーブは、通信の最後まで実行できるようになるまで、時間を購入するためにクロックストレッチを行うことができます。これは、ACK / NACKクロックパルスをすぐに送信せず、応答の準備ができるまで通信を中間状態に維持することによって行われます。

このような状況に対処するには、クロックストレッチが適切な方法です。伸びず、他の悪いことをするデバイス(バスのハング/再起動、有効なアドレスまたはコマンドのNACKなど)は問題があり、整理するためにマスターに余分な負担をかける(コマンドを繰り返す必要がある) 、NACKを追跡するなど)


あなたは正しいですが、問題はホストです。ホストはスレーブではなく、他のものでビジーです。だから私は時計のストレッチを行うことができるかどうかわからない。
Ktc 2013

オンボードのI2Cハードウェアを使用していますか、それともGPIOラインからプロトコルをビットバンギングしていますか?標準では特定のI2Cタイムアウト間隔が定義されていないため、スレーブはマスターがパケットを完了するまで無期限に待機する必要があります。
アダムローレンス

STM32 IC2 APIを使用しています。容量の問題のようです。アップデートをご覧ください。
Ktc 2013

1

STM32の機能に応じて(私はこれを使用したことがありません)、次のいずれかの方法を試すことができます。あなたが何をしようとしているのかについての詳細を提供でき、今ある形で各割り込みがなぜ必要なのかについて説得力のある議論があるなら、より具体的な答えが考えられるかもしれません。ただし、特にあなたの場合、I2Cは十分に遅いため、適切に作成された割り込みルーチンでは問題になりません。

  • 通常、何かに対する割り込みは無効にできます。通常のコントローラーには、マスクできない割り込みが最大で1つまたは2つあり、そのうちの1つがリセットされます。何か(あなたの場合はADCまたはI2C)の割り込み駆動制御が必要ない場合は、そのペリフェラルコードを割り込みを使用しないものに変えてから、割り込みを無効にします。

  • 割り込みハンドラは長くするべきではありません。割り込みベクトル自体からできる限り少ないことを行うようにしてください。割り込みに対する極端な最小限のアプローチは、単に割り込みハンドラルーチン内からフラグを設定し、メインループにそこからのすべての重い作業を実行させることです。特定のアプリケーションとファームウェアアーキテクチャに必要なものは、それほど単純ではない場合があります。それでも、割り込み内からどれだけ実際に実行する必要があるかを確認する努力を払う価値があります。

  • ペリフェラルDMAを使用している場合は、各バイトで中断する代わりにそれを使用します。通常、I2CではなくADCをDMAに配置する方が簡単ですが、チップが異なると実装も異なります。I2C交換をDMAに接続するクリーンな方法があったとしても、私は驚かないでしょう。DMAを使用すると、割り込みの数を減らし、プロセッサコアをデータのすべての単一ブロックを処理する必要がなくなります。

  • データの破損が発生している特定のインスタンスと、データの破損が発生しているメカニズムを特定してください。これははるかに困難ですが、最新のオシロスコープ/ロジックアナライザをクリエイティブに使用すると、いくつかの問題を確認できる場合があります。特に、問題がメモリではなくタイミングに関係していることを確認してください(これはひどいコードとリベラルなコンパイラの組み合わせで可能性があります)

編集:質問へのコメントから、問題のこのインスタンスに関するいくつかの特定のメモ:

  • ADCの読み取りに80%のCPUを使用することは、通常、行う価値のあることではありません。データを収集することは、それを実行することも、データを保存することもできない場合、役に立ちません。
  • どういうわけか大量のデータを(便利に)収集している場合でも、ADC割り込みは、I2Cペリフェラルを完全に抑制してデータが失われるほど長くする必要があります。I2Cは最大で100 / 400KHzで動作します。I2Cのクロックジッタよりも深刻なもののように見えるようにするには、本当に長い割り込みが必要です。

ありがとう。私たちのシステムはこのタイプの複雑で長いISRを必要とします。それは長い話です。あなたは正しいですが、I2Cはこの割り込み負荷の下でも持続する必要があり、持続できません。問題はハードウェアにあると思われます。アップデートを参照してください。
Ktc 2013

その価値については、私の経験では、めちゃくちゃ長いISRを義務付けているように見えるほとんどのユースケースは、実際にはRTOSに値するものです。そして、はい、あなたの最新の編集によると、それはハードウェアの問題のように見えます。ロジックアナライザーがあったラインに小さなコンデンサーを入れてみてください。おそらく大丈夫でしょう。しかし、なぜそれが必要なのかは、答えるのが少し難しいです。I2Cプルアップ抵抗(バスの容量に対して低すぎる可能性があります)を確認し、使用しているI2Cバッファー/リピーターのデータシートを確認します。
チンタラギリシャシャンク2013

0

特定のシステムでは、クロックおよびデータバスにノイズが入る可能性があります。ロジックアナライザーが問題を削除するという事実は、これを示しています。実用的で迅速な実装のために、あなたの観察によって与えられた手がかりに従ってください。400kビット/秒の実装のi2cバスで、同様の観察に基づいて、クロックとデータポイントから12pfと並列に接続された2Mをグランドに接続し、問題が解決されていることを発見しました。これにより、特定のi2c通信に必要な対象帯域外のノイズが除去/フィルタリングされます。試してアドバイスしてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.