SPIまたはI2Cインターフェイスを使用する場合、どのようなトレードオフを考慮する必要がありますか?
この加速度計/ジャイロブレイクアウトボードには、各インターフェイスに1つずつ、2つのモデルがあります。どちらかをArduinoプロジェクトに統合する方が簡単でしょうか?
SPIまたはI2Cインターフェイスを使用する場合、どのようなトレードオフを考慮する必要がありますか?
この加速度計/ジャイロブレイクアウトボードには、各インターフェイスに1つずつ、2つのモデルがあります。どちらかをArduinoプロジェクトに統合する方が簡単でしょうか?
回答:
概要
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 + 2
tcrosleyが言っているように、SPIはI2Cよりもはるかに高い周波数で動作できます。
I2Cはもう少し複雑です。バスなので、デバイスをアドレス指定する方法が必要です。通信は、独自の開始シーケンスで開始されます。クロック(SCL)が高い間、データライン(SDA)はローに引き下げられます。残りの通信データは、クロックが低い場合にのみ変更できます。この開始シーケンスにより、各通信が同期されます。
通信にはアドレス指定が含まれるため、任意の数のデバイス(最大127)に必要なのは2行だけです。
編集
データラインが双方向であることは明らかですが、これはクロックラインにも当てはまることは注目に値します。スレーブは、バス速度を制御するためにクロックをストレッチする場合があります。これにより、I2Cはレベルシフトまたはバッファリングに不便になります。(標準モードのSPI回線はすべて単方向です。)
各バイト(アドレスまたはデータ)が送信された後、受信側はSDAに確認応答パルスを送信して受信確認を行う必要があります。マイクロコントローラにI2Cインターフェイスがある場合、これは自動的に処理されます。マイクロコントローラーがサポートしていない場合でもビットバンすることはできますが、読み取りと読み取りにI / Oピンを使用しない限り、各確認応答または読み取りデータに対してI / Oピンを出力から入力に切り替える必要があります書き込み用。
400kHzの標準では、I2CはSPIよりもはるかに低速です。1MHzで動作する高速I2Cデバイスがありますが、20MHz SPIよりもはるかに低速です。
(編集:明確にするために、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を使用するように強制されない限り、価値はありません。
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で動作するため、それほど大きな違いではありません。
一般に、SPIはより高速なバスです-クロック周波数はMHzの範囲になります。ただし、SPIは双方向通信用に少なくとも3本のラインと、バス上の各デバイス用の追加のスレーブ選択を必要とします。
I2Cに必要なデバイスの数に関係なく、2行のみが必要です(もちろん制限内)。ただし、速度はkHzの範囲です(100〜400kHzが一般的です)。
現在、ほとんどのマイクロコントローラーは両方のバスをハードウェアでサポートしているため、どちらも簡単に使用できます。
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
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はそれらを推奨することがたくさんあります。
この質問は、ここの優れた回答で徹底的に調査されましたが、おそらくチップメーカーの観点から提供できるI 2 C に対するもう1つの観点があります。
I 2 Cの電気的インターフェースはオープンコレクターです。ここで、呼吸してその意味を考えてください。I 2 C を使用して、バスの動作電圧に完全に依存しないチップを設計できます。必要なことは、SDAラインをローレベルにプルして、SCLとSDAの電圧をグランド基準のしきい値電圧と比較することです。そして、通常のハイサイド保護構造を除外し、他の構造に置き換えると、システムの残りの部分に依存せずに完全に独自の生活を送ることができるチップを作ることができます-SCL、SDAはチップに電流を供給せず、確かにそれらのピンに電流を供給しません。だからこそ、リアルタイムクロックやその他の低消費電力用のバスとして非常に便利です。
他の回答で言及されていないことの1つは、I2Cが同じバス上の複数のマスターをサポートしているということです。双方向通信が必要で、ポーリングベースの方法を使用したくない場合、I2Cは仕事を完了します。
長距離にわたって、CANは同じ機能を持ち、より堅牢です。ただし、CANはハードウェアサポートとトランシーバーを必要とする非同期プロトコルであるため、低コストのシステムでは選択肢にならない場合があります。