回答:
他の人が言ったように、SPIとI2Cは、プルアップ抵抗、クロック周波数などがあれば、長距離で使用できます。
主な代替手段(ノイズ耐性を向上させる)はRS485およびCANです。どちらもノイズの問題を最小限に抑えるために差動ラインを使用し、I2CやSPIよりもこの長さのデータ伝送に適しています。ただし、多くの(何か?)AVRにはCANペリフェラルが組み込まれているとは思わないため、CANの使用がはるかに簡単になります。
バスを選ぶ際に考慮すべき最も重要なことは、デバイス間の通信に使用するプロトコルにCRCまたは同等のものが含まれていることを確認して、メッセージが正しく受信されたかどうかを判断できるようにすることです(CANはこれをパケット)。これを考慮すると、破損したメッセージを再送信できるように、プロトコルの一部としてACK / NACKタイプの応答を持つことも役立ちます。
数フィートでも問題はありません。可能であれば、撚り線を使用してください。SPIは、I2Cの信号は共有回線上にあるのに対して、SPI信号はすべて単方向であるため、I2Cよりもバッファリングがはるかに簡単です(必要な場合)。
AVRマイクロコントローラーはI2CおよびSPIスレーブモードとマスターモードを処理できますか?(両方が必要です)
長距離のI2Cの場合、「I2Cバスリピーター」ソリューションを探してみてください。I2CまたはSPI通信の最大距離は、主にバス内の2つのノード間の距離ではなく、総バス距離を指していることに注意してください。
この種の問題については、RS485を調べてください。これは、差動ラインを介して通信するシリアルバスプロトコルであるため、ツイストワイヤを使用すると、ノイズの可能性が最小限に抑えられます。この方法で非常に長い距離に到達できます。欠点は、回路に余分なRS485エンコーダIC(MAX485など)が必要になることです。
I2Cに対するSPIのまだ言及されていない利点の1つは、すべてのSPIワイヤが単方向であり、常にHighまたはLowに駆動されることです。これにより、I2Cを使用した場合よりもはるかに高速な通信が可能になり、ノイズの影響を受けにくくなり、シンプルなゲートをリピーターとして使用できます。もう1つの便利なオプションは、単純な非同期通信(各方向に1ワイヤー)です。非同期通信の唯一の欠点は、データを交換するために、通常は両側が安定したクロックで「起動」している必要があることです。
私自身のプロジェクトでは、わずかに変更された3線のSPIプロトコルを使用し、満足のいく結果が得られました。ディスプレイビットマップデータ(たまにデータが破損しても大した問題ではない)を10 mbpsで、その他のデータを2.5 mbpsで問題なく送信します。
I2CとSPIはどちらも短距離(数インチ)の長距離用に設計されていますが、適切なケーブルとバス容量全体に注意を払うことで、長距離で使用できます。
SPIの経験はほとんどありませんが、プルアップ抵抗の適切なサイズを常に計算する必要があるため、I2Cはそれほど難しくありません。さらに、非常に使いやすい専用の安価なI2Cバッファーがあります。ただし、ネットワークには適切なサイズのプルアップ抵抗を使用する必要があります。
I2Cを使用して、8フィートの距離で2つのAVRをネットワーク接続し、プルアップ抵抗と高品質で十分にシールドされたツイストケーブルのみを使用しました。
I2Cを介して通信するスター型ネットワークの約80のAVRベースのノードを含むプロジェクトに取り組みました。それは完全な混乱であり、最終的には機能しませんでした。すべてのノードの更新を取得するのに数秒かかり、1つの障害のある接続がネットワーク全体を切断しました。最後に、ノードを作成した人に話を聞いたところ、彼はこのようなプロジェクトでI2Cの使用をやめたと言いました。残念ながら、ここで具体的にI2Cが不適切だった理由はわかりません。
短い距離であれば簡単にできるはずです。できることは、それらの距離とケーブル接続がキャパシタンスとラインインピーダンスの観点から何を意味するかを把握し、それらを通過できる周波数の種類(立ち上がり/立ち下がり時間)を確認することです。特定のポイントを超えて、それらを伝送ラインとして扱うのが最善です。見栄えが悪い場合は、実際にEIA-232や422などの他のシリアルラインに切り替えることができます。これは、両端に余分なチップが含まれている可能性がありますが、伸びることがあります。本当に速く遠くまで行く必要がある場合は、さらに何かが必要になります(イーサネット、ラジオやレーザーは除外しないでください:)。