SPIまたはI2Cを検討する際のトレードオフ?


117

SPIまたはI2Cインターフェイスを使用する場合、どのようなトレードオフを考慮する必要がありますか?

この加速度計/ジャイロブレイクアウトボードには、各インターフェイスに1つずつ、2つのモデルがあります。どちらかをArduinoプロジェクトに統合する方が簡単でしょうか?

http://www.sparkfun.com/products/11028

ここに画像の説明を入力してください


13
I2CとSPIには長所があります。I2Cはセットアップがより複雑で、一度安定すると、簡単に延長できます(バス配線が長くなりすぎないか、長くならない限り)。SPIはセットアップが簡単です。必要に応じて、非常に簡単にビットバンすることができます。拡張は、すべてのチップ選択でI / Oを消費します。I / Oとコネクタスペースの余裕があり、バスが必要ない場合は、常にSPIを使用します。
ハンス

I2Cはどのように複雑ですか?私は両方のバスを異なるマイクロ(小さなPICと適切なサイズのARM)で使用しましたが、どの場合でもI2Cセットアップは簡単でした(つまり、書き込むレジスタが少なくなりました)。クロック極性とデータサンプリングオプションのため、SPIはより複雑です。
アルマンダス

6
@Armandas-まさか!SPIにはクロック/データ極性の4つの可能なモードがあり、そのうち2つが支配的です-ほとんどすべてのSPIデバイスはクロックの立ち下がりエッジでMISO出力を更新し、クロックの立ち上がりエッジでMOSI入力を読み取ります。データシートを見ると、数分でどれがわかるかがわかります。誤って間違ったモードを選択した場合、オシロスコープのトレースを見るとすぐにわかります。SPIデータエラーはまれであり、I2Cのように奇妙な状態に陥ることはありません。
ジェイソンS

6
私はかつてARMプロセッサでI2Cドライバを記述する必要があったため、I2cはもっと複雑だと言います。私はNXPドキュメントのステートマシンに従いましたが、それは約20ステートの長さでした。最後のバイトの読み取り/書き込みなど、確認応答を理解するのにかなりの時間がかかりました。SPIでこれらの問題が発生したことはなく、クロックとデータを揃える必要があります。
ハンス

1
@JonL、率直に言って、私はOPが使用したい特定のブレイクアウトボードの問題を議論する唯一の人であり、それが利用できないことを指摘しているので、これまでのところ完全な答えを提供した唯一の人ですSPIとI2Cの両方ですが、I2Cのみです。したがって、この特定のボードを使用する場合、I2Cを使用する必要があります。他のインターフェイスは、どのインターフェイス(SPIまたはI2C)がインターフェイスしやすいかを扱っただけで、これについても説明しました。
-tcrosley

回答:


98

概要

  • SPIは高速です。
  • I2Cはより複雑で、ご使用のマイクロコントローラーにI2Cコントローラーがない場合は使いにくいです。
  • I2Cには2行しか必要ありません。

I2Cは、SDAライン上に双方向データを持つバスシステムです。SPIは、データ入力とデータ出力を別々の回線(MOSIとMISO)で行うポイントツーポイント接続です。

基本的にSPIは1組のシフトレジスタで構成され、1つのシフトレジスタにデータを入力し、もう1つのシフトレジスタからデータを出力します。通常、データは8クロックパルスを連続して送信することでバイト単位で書き込まれますが、これはSPIの要件ではありません。必要に応じて、16ビットまたは13ビットの語長を使用することもできます。I2Cでは、SPIの開始シーケンスによって同期が行われますが、SSがHighになることによって行われます(SSはアクティブLow)。これは何クロックパルス後に決定します。13ビットワードを使用する場合、SSは13クロックパルス後に最後にクロックされたビットをラッチします。
双方向データは2つの別々の行にあるため、インターフェースは簡単です。

標準モードのSPIには、SCLK(シリアルクロック)、MOSI(マスターアウトスレーブイン)、MISO(マスターインスレーブアウト)、SS(スレーブセレクト)の少なくとも4つのラインが必要です。バイデクシオナルモードでは、少なくとも3つのラインが必要です。SCLK(シリアルクロック)、MOSIまたはMISOラインの1つであるMIMO(マスターインマスターアウト)、およびSS(スレーブ選択)です。以下のためになるように複数のスレーブを持つシステムでは、各スレーブのためのSSラインを必要とするスレーブあなたが持っている、標準モードでの行をし、双方向モードでのライン。必要ない場合は、標準モードで、あるスレーブのMOSI信号を次のスレーブのMISOに接続することにより、スレーブをデイジーチェーン接続できます。すべてのスレーブデータを循環する必要があるため、通信速度が低下します。N + 3 N + 2NN+3N+2

tcrosleyが言っているように、SPIはI2Cよりもはるかに高い周波数で動作できます。

I2Cはもう少し複雑です。バスなので、デバイスをアドレス指定する方法が必要です。通信は、独自の開始シーケンスで開始されます。クロック(SCL)が高い間、データライン(SDA)はローに引き下げられます。残りの通信データは、クロックが低い場合にのみ変更できます。この開始シーケンスにより、各通信が同期されます。
通信にはアドレス指定が含まれるため、任意の数のデバイス(最大127)に必要なのは2行だけです。

編集
データラインが双方向であることは明らかですが、これはクロックラインにも当てはまることは注目に値します。スレーブはバス速度を制御するためにクロックストレッチする場合があります。これにより、I2Cはレベルシフトまたはバッファリングに不便になります。(標準モードのSPI回線はすべて単方向です。)

各バイト(アドレスまたはデータ)が送信された後、受信側はSDAに確認応答パルスを送信して受信確認を行う必要があります。マイクロコントローラにI2Cインターフェイスがある場合、これは自動的に処理されます。マイクロコントローラーがサポートしていない場合でもビットバンすることはできますが、読み取りと読み取りにI / Oピンを使用しない限り、各確認応答または読み取りデータに対してI / Oピンを出力から入力に切り替える必要があります書き込み用。

400kHzの標準では、I2CはSPIよりもはるかに低速です。1MHzで動作する高速I2Cデバイスがありますが、20MHz SPIよりもはるかに低速です。


7
I2Cの専門家でなくても使用可能な方法で適切なエラー検出と回復を処理する必要があるI2Cのすべてのコーナーケースを処理するマイクロコントローラーにまだ会っていません。SDAが完了しpain./である、低開催されているとき、私はいつも逃したクロックのケースを処理するために一時的にbitbangingする「スマート」I2Cペリフェラルからバックドロップダウンするために持っていた
ジェイソンS

(しかし、私はあなたの答えの残りに同意するので+1)
ジェイソンS

3.4MHzで動作するI2Cデバイスもありますが、これらを低速デバイスと組み合わせることができるかどうかはわかりません(すべてのデバイスがバスのアドレス指定に従う必要があるため)。また、3.4MHz I2Cのタイミングは少し異なると思います。
ハンス

@Hans-HS I2Cは、より一般的な400kbitデバイスと下位互換性があるようです。率直に言って、(徹底的な調査なしで)HSをサポートするマイクロコントローラを(まだ)見たことがないので、言及したくありませんでした。
-stevenvh

@stevenvh:一部のコントローラーの2線式実装(サイプレスPSOCなど)では、内部クロックの少なくとも1サイクルまたは2サイクルの間、SCKをLowにしてからラッチする必要があります。システムクロックパルスなしではI2C開始条件を検出してクロックストレッチできない理由はわかりませんが、このような動作は、そのようなチップが低いシステムクロック速度で実行されている場合、バス上のすべてのI2Cトランザクションがゆっくり実行してください)。400MHzの動作でさえ、3MHzで動作するPSOCには速すぎます。
-supercat

39

(編集:明確にするために、Olinが正しく指摘しているように、I2C / SPIデバイスのボード間使用に起因するシグナルインテグリティに関係する次の懸念事項の多くがあります。)

より少ないワイヤに強く向かわせる制約がない限り(1つのプロジェクトでは、密閉されたコネクタを使用し、追加のコンタクトがかなり高価になる)、可能な場合はI2Cを避け、SPIに固執します。

SPIは、ハードウェアおよびソフトウェアベースで簡単に処理できます。ハードウェアには、マスターインスレーブアウト(MISOまたはSOMI)とマスターアウトスレーブイン(MOSIまたはSIMO)の2つの共有データライン、マスターによって生成される共有クロック、デバイスごとに1つのチップセレクトがあります。トランザクションが終了するまで、CSラインがローになり、クロックがサイクルし、基本的に入力ビットをシフトインし、出力ビットをシフトアウトします。トランザクションが終了すると、CSラインはハイになります。CSラインがHighの場合、スレーブデバイスは通信しません。CLKおよびMOSIラインを無視し、MISOピンを高インピーダンス状態にして他の人が使用できるようにします。

複数のSPIデバイスを使用するマイクロコントローラーがあり、SPIペリフェラルが組み込まれている場合、マイクロコントローラーのCS出力をデマルチプレクサー(74HC138など)に送信し、アドレスラインを制御してSPIトランザクション間でデバイスを選択します。レジスタにワードを書き込んで出力用にキューに入れ、CSピンがHighになった後にそれらを読み戻します。

SPI信号はすべて単方向であるため、バッファリングし、デジタルアイソレータを使用してアイソレーションバリアを越えて使用し、LVDSなどのラインドライバを使用してボード間で送信できます。心配する必要があるのは、往復の伝播遅延だけです。これにより、最大周波数が制限されます。


I2Cはまったく別の話です。配線の観点からははるかに単純ですが、SCLとSDAの2本のワイヤだけで、これらのラインは両方とも、外部プルアップを備えたオープンドレインデバイスを使用する共有双方向ラインです。デバイスアドレスを送信することから始まるI2Cのプロトコルがあります。そのため、それぞれが独自のアドレスを持っている場合、複数のデバイスを使用できます。

ハードウェアの観点から、大きなノイズがあるシステムでI2Cを使用することは非常に困難です。I2Cラインをバッファリングまたは分離するには、エキゾチックなICに頼る必要があります-はい、それらは存在しますが、多くはありません:1つのプロジェクトで1つを使用し、1つのアイソレータを使用できることに気付きましたが、直列に2つを使用します。どちらの側が物事の駆動端であるかを把握するために小さな電圧降下を使用し、2つの直列降下は2つ多くでした。

I2Cのロジックレベルのしきい値はVccに依存するため、同じシステムで3V / 3.3Vと5Vのデバイスを使用する場合は、十分に注意する必要があります。

1フィートまたは2フィート以上のケーブルを使用する信号は、ケーブルの静電容量を心配する必要があります。100コンダクター/メートルの静電容量は、多心ケーブルの異常ではありません。これにより、余分な容量を適切に処理し、立ち上がり時間の要件を満たすために、バスを遅くするか、低いプルアップ抵抗を使用する必要があります。

だから、あなたがあなたがうまく設計したと思うシステムを持っているとしましょう、そしてあなたはシグナルインテグリティの問題のほとんどに対処することができ、ノイズはまれですが(まだ存在しています)。何を心配する必要がありますか?

処理するために準備する必要があるエラー条件がたくさんあります。

  • スレーブデバイスは特定のバイトを認識しません。これを検出し、通信シーケンスを停止して再起動する必要があります。(SPIを使用すると、通常、送信したデータをエラーなしで受信したことを確認する場合に、データを読み戻すことができます。)

  • スレーブデバイスから1バイトのデータを読み取っており、クロックラインのノイズのためにデバイスが「催眠」になっています。そのバイトを読み取るために必要な8クロックを送信しましたが、ノイズのため、スレーブデバイスはそれを認識します7クロックを受信し、データラインで0を送信しています。デバイスが8番目のクロックを受信した場合、マスターがデータラインを上げ下げしてACKまたはNACKビットを送信できるように、またはマスターがストップ(P)条件を送信できるように、データラインをハイに解放します。しかし、スレーブはまだデータラインをローに保持しており、別のクロックを待っています。マスターが追加のクロックを試す準備ができていない場合、I2Cバスはデッドロック状態になります。通常のACK / NACK状態を処理するいくつかのマイクロコントローラーを使用しましたが、

  • 本当にひどいのは、マスターが1つのスレーブデバイスにデータを書き込んでおり、別のスレーブがデバイスアドレスを誤って解釈し、送信されたデータがそのアドレスであると考えている場合です。このためにレジスタが誤って設定されることがあるI2Cデバイス(I / Oエクスパンダー)がありました。このケースを検出することはほぼ不可能であり、ノイズに強いために、定期的にすべてのレジスタを設定する必要があります。したがって、このエラーに遭遇した場合、少なくとも短時間で修正されます。(SPIにこの問題が発生することはありません。CSラインにグリッチが発生しても、グリッチが長く続くことはなく、間違ったスレーブデバイスによって誤ってデータが読み取られることはありません。)

エラー検出(CRCコード)があった場合、これらの条件の多くはプロトコルで適切に処理できますが、これを備えたデバイスはほとんどありません。


これらの条件を処理するには、I2Cマスターデバイスに複雑なソフトウェアを構築する必要があることがわかりました。私の意見では、配線の制約により、SPIではなくI2Cを使用するように強制されない限り、価値はありません。


5
あなたのIICに対する宗教的な嫌悪はここにはありません。IICとSPIの両方は、彼らが何をするかが得意であり、それぞれがその場所を持っています。IICに対する異議のほとんどは、IICの不適切な使用によるものです。IICはオンボードのみと考えるべきですが、インテリジェント電源を制御するために電源業界で日常的に使用されています。IICバッファーが必要な場合は、IICが適切なソリューションではないことを強く示しています。ただし、IICはすべて同じボード上の低速デバイスで非常にうまく機能します。
オリンラスロップ

2
I2Cのロジックレベルのしきい値はVccに依存するため、同じシステムで3V / 3.3Vと5Vのデバイスを使用する場合は、十分に注意する必要があります。いいえ、これは間違っています。IICロジックのしきい値は固定電圧です。あなたは自明のみ3.3 Vにラインを引き上げて5 Vと3.3 Vのシステムを混在させることができます
オーリンラスロップ

5
I2Cの宗教的な嫌悪ではなく、I2Cの実際的な嫌悪です。オンボードシステムを使用すると、はるかに簡単になります。理にかなっているときに使用しますが、ソフトウェアコストが追加され、多くのハードウェアエンジニアは、ソフトウェアの頭痛の原因となるトレードオフを議論せずにI2Cデバイスをボードに貼り付けるだけです。
ジェイソンS

3
IICは電気的に実装するのが少し簡単で、SPIはおそらくファームウェアで少し簡単になるでしょう。ただし、どちらも非常に簡単で、両方の点で簡単です。
オリンラスロップ

2
@Olin-固定の1.5 Vしきい値は過去に使用されたようですが、最新バージョンの仕様によると、実際には0.3 Vccと0.7 Vccです。仕様からのこの引用では、レガシーデバイスの1.5 Vに言及しています。
stevenvh

16

SparkFunのデバイスのブレイクアウトボードは、実際にはI2Cバージョン(MPU-6500)専用です。MPU-6000バージョンは、同じチップ上にSPIとI2Cの両方のインターフェースを備えており、SparkFunにそのチップを搭載したボードがあるとは思われません。そのため、その特定のボードを使用したい場合、I2Cの使用に限定されると思います。ただし、次の理由により、とにかくI2Cを使用することをお勧めします。

一般に、I2CバスはSPIバスよりもハードウェアの観点から使いやすいことがわかります。I2Cは2線式バス(SCL / SDA)です。

SCL – Serial clock.
SDA – Serial data (bidirectional).

SPIは4線バス(SCLK / MOSI / MISO / CS)です。

SCLK– Serial clock.
MOSI – Master-out, Slave-in. Data from the CPU to the peripheral.
MISO – Master-in, Slave out. Data from the peripheral back to the CPU.
CS – Chip select.

1つのI2Cバスに複数のデバイスを接続できます。各デバイスには、チップに組み込まれた独自のアドレスのセットがあります。アドレスは、実際にはすべてのコマンドの最初のバイトとして(読み取り/書き込みビットとともに)バスを介してブロードキャストされます。これは、他のオーバーヘッドと同様に、同じ機能を使用するためにSPIよりも多くのビットをI2Cバスで送信する必要があります。

デバイスの異なるクラス(メモリ、I / O、LCDなど)には異なるアドレス範囲があります。システムで一般的に複数回使用される一部のデバイス(PCF8574 I / Oエクスパンダーなど)は、1つ以上のアドレスライン(PCF8574の場合はAD0-2)を使用します。住所の。MPU-6500には、このようなアドレスライン(AD0)が1つあるため、同じシステムで2つを使用できます。

SPIバス上に複数のデバイスを配置することもできますが、各デバイスには独自のチップ選択(CS)ラインが必要です。したがって、4線式の説明は少し間違っています。実際には、3線式インターフェイス+デバイスごとに1本の追加線です。Arduinoシリーズのボードには慣れていませんが、多くのチップセレクトラインが必要な場合、さまざまなシールドで使用される一般的なピン割り当てが面倒になるため、ArduinoでSPIを使用するのがより困難になると思います。

ほとんどのArduinoボードは5ボルトで動作し、いくつかの新しいボードは3.3vで動作すると信じています。MPU-6500は3.3vで動作します。5v CPUのI2Cバスの最小入力「高」電圧が3v以下の場合、バスが開いているため、SCLおよびSDAラインの10Kプルアップ抵抗を3.3vに提供するだけでレベル変換の問題を回避できます。コレクタ。CPU上の5v内部プルアップが無効になっていることを確認してください。

しかし、ATmega2560のデータシートをチェックし(例としてADK 5v Arduinoを使用)、その最小入力「高」電圧は0.7 * Vcc、または3.3vを超える3.5vです。したがって、何らかのアクティブレベルが必要です。変換:チップの5v側と3.3v側の両方にプルアップ抵抗を必要とするTI PCA9306は、単一数量でわずか78セントです。

では、なぜI2CではなくSPIを選ぶのでしょうか?主な理由は、SPIがはるかに高速で実行できるためです-場合によっては数十MHzになります。I2Cは一般に400 KHzに制限されています。しかし、これは実際にはMPU-6050 / 6000加速度計では問題になりません。I2Cでは400 KHzで、SPIでは1 MHzで動作するため、それほど大きな違いではありません。


3
I2CではなくSPIを選択するもう1つの理由:すべての回線が単方向であるため、レベルシフターなどが少し簡単になります。
-19:

3
I2CはSPIよりも簡単ですか?!I2Cで唯一簡単なのは、すべてをつなぎ合わせることができる場合の接続性です。それ以外の場合、I2Cではシグナルインテグリティがより厳しくなり、I2Cでは堅牢なソフトウェアの実装がより厳しくなります。
ジェイソンS

2
@JasonS、私はI2Cを使用して多数の組み込みソフトウェアプロジェクトを完了しましたが、投稿で言及したロックアップの問題に遭遇したことはありません。あなたの悪い経験のためにあなたがそれを好きではないことを理解できます。現在、I2C DACを使用してオーディオを出力し、同時にSPIを介してSDカードから次のデータバッファーを読み取る製品を市場に出しています。よく働く。バスの競合が発生し、音声が途切れたため、DACとSDカードの両方にSPIを使用できませんでした。マイクロ(ローエンドのもの)には、SPIとI2Cポートが1つずつしかありません。
tcrosley

1
I2C DACにオーディオを出力できることに感心しました!(最大クロックレートとは何ですか?)短時間の実行でオンボードICを使用している場合、ロックアップが発生する可能性は非常に小さくなりますが、依然として存在します。(また、I2Cにデータを書き込んでいるだけでは、それに出くわすこともありません。欠落している/余分なクロックと思われるものを永遠に待機するデバイスから読み取る必要があります。)
Jason S

1
@JasonS、音声は8KHzの音声品質のみです-128ビットの割り込みを使用して各16ビットサンプルを出力しています。I2Cも独自の割り込みで実行されます。空き時間は、SDカードからデータを読み取るために使用されます。書き込み時にロックアップが発生しないことの良い点。ADCを除き、私は通常、出力デバイスにI2Cを使用しています。しかし、WiiリモコンとWiiヌンチャック(3 'ケーブル上)の間の読み取り専用インターフェイス(2つのボタン、加速度計、およびジョイスティック)が400 KHzのI2Cであることをご存知ですか?このデバイスインターフェースをハッキングするウェブに関する多くの情報。
-tcrosley

15

一般に、SPIはより高速なバスです-クロック周波数はMHzの範囲になります。ただし、SPIは双方向通信用に少なくとも3本のラインと、バス上の各デバイス用の追加のスレーブ選択を必要とします。

I2Cに必要なデバイスの数に関係なく、2行のみが必要です(もちろん制限内)。ただし、速度はkHzの範囲です(100〜400kHzが一般的です)。

現在、ほとんどのマイクロコントローラーは両方のバスをハードウェアでサポートしているため、どちらも簡単に使用できます。


4
@Jason:あなたはIICに対してある程度の偏見を持っているように見えますが、それを理由に他の人をdingるのは不公平です。IICとSPIはどちらも「簡単」で、それぞれ独自のしわがあります。SPIには余分な行が必要ですが、これは簡単ではありません。IICはもう少し複雑ですが、ファームウェアの実装をすべて簡単に行うことができます。それほど多くのコードは必要ありません。両方とも自分たちの場所があり、どちらも自分が何をしているのかを知っている人にとっての要因にならないほど簡単です。
オリンラスロップ

5
@Jason:確認したところ、8ビットPICでのIICのファームウェア実装用の汎用IICコードは311行のみで、おそらくその半分以上はコメントです。これにより、開始、配置、取得、停止などのルーチンのレベルでIICバスへの手続き型インターフェイスが提供されます。単純なEEPROMを駆動するためにそれを呼び出すモジュールは272行、おそらく1/2コメントであり、デフォルトデータ、UARTデバッグインターフェイスなどのような高レベルの管理を含みます。これは、10命令少ないかどうかを議論する非常に簡単ですSPIは無意味です。
オリンラスロップ

2
@Andrew Kohlsmith-- I2C is designed for on-board applications.どうやらI2Cデバイスのメーカーはあなたに反対しているようです。テイクTMP100を。製品ページには、明示的に述べている:The TMP100 and TMP101 are ideal for extended temperature measurement in a variety of communication, computer, consumer, environmental, industrial, and instrumentation applications.同じことが当てはまりあるTMP75
コナーウルフ

5
@FakeNameあなたは間違っています。私は13年間、産業用パワーエレクトロニクスをやっていた。(大規模な3フェーズmtorの起動と監視は非常にノイズの多い環境です)SPIの信頼性を高めることではなく、すべての障害モードを計画および考慮してシステムを設計し、必要に応じてシステムに回復オプションを組み込むことです。ノイズスパイクによってI2C(またはSPI)の通信が停止されることはありませんでしたが、I2Cコントローラーだけに頼ってすべてを行うこともありませんでした。それは計画と設計の問題であり、1つのバスが優れているということではありません。
akohlsmith

2
@akohlsmith:シングルマスターシングルスレーブI2Cは、「ビットバン」マスターで堅牢である必要があります。複数のスレーブがあり、2つが異なる方法で同時に「混乱」する場合、バスが回復不能にロックされる可能性があります(たとえば、ゼロで満たされた2つ以上のメモリチップが両方ともマスターがそれらを読み取ろうとしているが、ビットカウンターがその後、それぞれが唯一の他がそれを主張している時間の間にSDAを解放します、そして、それはすべてのスレーブをオーバードライブするのに十分な「高」の強力なを駆動することができない限り、マスターができることは何がバスを解放しません、同期していません。
supercat

12

SPIはI2Cよりもはるかに高速に実行できます(一部のSPIデバイスは60MHzを超えます。「公式」I2C仕様が1MHzを超えるデバイスを許可するかどうかはわかりません)。どちらのプロトコルを使用するスレーブデバイスの実装にもハードウェアサポートが必要ですが、どちらも「ソフトウェアビットバング」マスターを簡単に実装できます。比較的最小限のハードウェアで、ホストが追加のハンドシェイクワイヤを必要とせずに、一度に最大500usのバスを無視することを任意に決定しても、正しく動作するI2C準拠のスレーブを構築できます。ただし、信頼性の高いSPI操作では、ハードウェアサポートがある場合でも、通常、ハンドシェイクワイヤを追加するか、ホストがスレーブの最悪ケースの応答時間に等しい各バイトの後に「手動で」遅延を追加する必要があります。

ぼくがいれば、コントローラーのSPIサポートには、合計3本の単方向ワイヤー(クロックとMOSI [マスター]を使用して、ハンドシェークおよびウェイクアップ機能を持つコントローラー間で8ビット透過の双方向データ転送を提供するいくつかの簡単な追加機能が含まれます-out-slave-in]マスターから; MISO [master-in-slave-out]スレーブから)。比較すると、「ストック」SPIポートを備えたマイクロコントローラー間の効率的で信頼性の高い通信は、両方のプロセッサーが独立して任意の時間遅延する場合、より多くのワイヤ(チップ選択、クロック、MISO、およびMOSIを使用して開始する必要があります)スレーブからのある種の肯定応答ワイヤスレーブが送信するデータを非同期に開始する可能性がある場合(誰かがボタンを押したなど)、「ウェイクアップ」としてさらに別のワイヤを使用する必要があります

I2Cは、「改善された」SPIのすべての機能を提供するわけではありませんが、SPIにはない組み込みのハンドシェイク機能を提供します。多くの実装では、マスターがソフトウェアビットバン。したがって、プロセッサ間通信の場合、SPIが提供できる速度よりも高速が必要で、追加のピンの使用が許容される場合を除き、SPIを介したI2Cを強くお勧めします。少ないピン数が必要なプロセッサー間通信の場合、UARTはそれらを推奨することがたくさんあります。


1MHzを許可するI2Cの高速バージョンがあります。通常のI2Cは400kHzです。
レジスタンス

@TheResistance:通常のI2Cは400kHzでしたが、バージョンは最大1MHzまで仕様化されていました。私が知らないのは、より速いバージョンが指定されているかどうかです。
supercat

仕様によれば、400kbps(kHzではなく、間違ったユニットを使用しました)はFastモードであり、1MbpsはFast-mode Plusであり、最大3.4Mbpsの高速モードがあります。超高速は最大5Mbpsですが、単方向です。
レジスタンス

@TheResistance:ありがとう。それ以降のバージョンについては聞いていませんでした。「単方向」とはどういう意味ですか?SPIスレーブからマスターへの通信の速度は、スレーブがマスターの後にクロックを取得することが保証されているため、マスターからスレーブよりも速くなることがありますが、I2Cの同等のコンセプトはわかりません。リンキーがありますか?
supercat

ここで仕様を見つけます。23ページには、ACKでさえなく、データを返送しない(書き込み専用)デバイスにUltra-fastを使用できると書かれています。
レジスタンス

8

この質問は、ここの優れた回答で徹底的に調査されましたが、おそらくチップメーカーの観点から提供できるI 2 C に対するもう1つの観点があります。

I 2 Cの電気的インターフェースはオープンコレクターです。ここで、呼吸してその意味を考えてください。I 2 C を使用して、バスの動作電圧に完全に依存しないチップを設計できます。必要なことは、SDAラインをローレベルにプルして、SCLとSDAの電圧をグランド基準のしきい値電圧と比較することです。そして、通常のハイサイド保護構造を除外し、他の構造に置き換えると、システムの残りの部分に依存せずに完全に独自の生活を送ることができるチップを作ることができます-SCL、SDAはチップに電流を供給せず、確かにそれらのピンに電流を供給しません。だからこそ、リアルタイムクロックやその他の低消費電力用のバスとして非常に便利です。


4

他の回答で言及されていないことの1つは、I2Cが同じバス上の複数のマスターをサポートしているということです。双方向通信が必要で、ポーリングベースの方法を使用したくない場合、I2Cは仕事を完了します。

長距離にわたって、CANは同じ機能を持ち、より堅牢です。ただし、CANはハードウェアサポートとトランシーバーを必要とする非同期プロトコルであるため、低コストのシステムでは選択肢にならない場合があります。


良い点(マルチマスター上)、割り込みピンを備えたSPIデバイスも見ましたが、1つのデバイスがまだマスターであり、両方とも(双方向)通信をインスタンス化できます。そこのリモートデバイスの場合、もちろん、より堅牢で優れたオプション(CANなど)があります。
ポール

0

SPIプロトコルを使用して、同期クロックが立ち上がるたびにデバイスにビットを直接書き込みます。xnor論理回路を使用して、メモリから「自家製」アドレスを照合し、i2cデバイスであるかのように必要なデバイスを選択できます。

i2cはオーサリング回路をデバイスのフォーマット内に統合しています。標準...などは複雑で異なります。spiでは、spiメモリを使用して画面にビデオを表示できますが、i2cはできません。

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