回答:
MCUの実際のSPIコントローラーペリフェラルは、多くの場合、インターフェイスをビットバンギングするよりもはるかに高速に実行できます。もちろん、MCUに依存しますが、ビットバンギングが約1 MHzに制限されている場合(運がよければ)、SPIコントローラーが30+ MHzで動作しているのを見て驚かないでしょう。
しかし、それだけではありません。ビットバンギング時、MCUはビットバンギングでビジー状態です。データをシフトアウトし、GPIOラインをいじっています。つまり、他に何もすることはできません。SPIコントローラーを使用する場合、コントローラーはそのすべてを実行するのに忙しく、MCUは他のことを自由に行えます。
したがって、実際のSPIコントローラーを使用すると、実際のSPI転送ははるかに高速になり、MCUは他のことを行うために使用できるいくつかのサイクルを取り戻します。
両方の方法を使用して同じ結果を達成できるという点では違いはありませんが、どちらかを選択する理由はいくつかあります。
SPIペリフェラルを使用すると、プロセッサがI / Oピンをビットバンギングするタイミングの生成を気にする必要がなくなり、他の計算タスクを実行してCPUのプログラミングを簡素化できます。周辺機器はハードウェアに実装されているため、ビットバンギングI / Oよりも高速に実行され、消費電力も少なくなります。アプリケーションでSPI周辺機器のないプロセッサを選択する必要がある場合、I / OをビットバングしてSPIとインターフェイスすることが必要になる場合があります。健全性の理由から、どうしても必要な場合を除き、避けることをお勧めします。
SPIは、マスターがクロックを制御する同期インターフェースです。つまり、マスターであれば、クロック速度とタイミングを選択することができます。スレーブデバイスは、処理可能なクロック周波数にある程度の上限がありますが、通常、クロックがそれを下回る速度は気にしません。より具体的には、通常、各スレーブが再び切り替える前にハイおよびロー状態のクロックを確認する必要がある最小時間があり、クロックエッジを囲むデータラインに最小データセットアップおよびホールド制限があります。スレーブはデータラインを読み取ります。
このため、ファームウェアにSPIマスターを実装するのは非常に簡単です。これは、組み込みのSPIハードウェアがない場合、または何らかの理由でその目的に使用できない場合に、特定のピンを使用するための便宜として頻繁に行いました。ファームウェアでSPIマスターを実行するのは、それと同じくらい簡単です。
多くのSPIスレーブデバイスは非常に高速なので、多くの場合、最小クロックとセットアップ時間は、それぞれが少なくとも1命令サイクル幅であることを確認するだけで満たされます。その場合、コードは非常に短くて高速です。場合によっては、スレーブデバイスがクロックフェーズごとに2つまたは3つの命令サイクルを必要とする可能性がありますが、それを保証することは実際には難しくありません。低レベルSPIビットループでは、次の出力ビットを位置にシフトし、入力ビットを取得して、ループカウンターをチェックする必要があります。通常、2〜3サイクルの最小タイミング要件を満たすには、適切な場所に他のオーバーヘッドを挿入してラインを運転およびサンプリングするときに調整するだけです。速度が重要な場合は、アセンブラプリプロセッサを使用して展開されたループを作成できます。このような手法では、
ファームウェアでSPIマスターを実行することにはいくつかの利点があります。SPIハードウェアは、構成方法が少しおかしい場合があります。スレーブ選択がアサートされるとすぐに何が起こるかという問題が常にあります。最初のビットはデータラインに書き込まれますか?クロックがローから始まり、データラインが立ち下がりエッジでラッチされるとしたらどうでしょうか?これは重要なこともあれば、そうでないこともあります。ファームウェアSPIマスターを使用すると、より寛容になり、異なるスレーブとの通信に同じルーチンを使用できる場合があります。たとえば、MOSI(Master Out Slave In)データラインがクロックの両エッジで安定していることを確認できます。通常、SPIハードウェアはそれを実行しないため、そのようなハードウェアは、その時点で通信しているスレーブに応じて再構成する必要があります。
ファームウェアSPIマスターのもう1つの利点は、SPIシーケンスごとに任意のビット数を選択できることです。通常、ハードウェアは8ビットの倍数に制限されています。ほとんどのデバイスは、全バイト転送を可能にするように設計されていますが、多くの場合、それらを必要としません。たとえば、10ビットのA / Dは、最初に10データビットを送信し、その後、クロッキングを続けると0またはガベージを送信します。ハードウェアSPIを使用している場合、16ビットを転送し、ガベージをマスクする必要があります。すべて正常に動作しますが、ファームウェアSPIマスターは実際には、必要な最小10ビットのみを転送するため、この場合のハードウェアよりも高速になる可能性があります。
ハードウェアSPIマスターの主な利点は、ファームウェアがバイト転送を開始し、その後で他のことを実行できることです。クロッキングは通常、展開されたファームウェアループでさえ達成できるよりも高速です。これらの利点は両方とも特定の状況では重要になる場合がありますが、多くの場合無関係です。ハードウェアを使用してバイトを転送するほとんどのSPIコードは、すぐにハードウェアが転送を完了するまで待機ループに入ります。また、スレーブのタイミング要件を慎重に確認してください。通常、SPIデバイスは全体として高速ですが、スレーブが処理できる最大速度に合わせてハードウェアの速度を下げる必要がある場合があります。
それはすべてマスターの観点からでした。要するに、マスターとしてSPIハードウェアを使用することにはほとんど利点がなく、場合によっては使用しないことにもいくつかの利点があります。ただし、それはスレーブではすべて異なります。マスターはクロックを制御するため、スレーブはマスターが実行するたびにマスターが実行するすべての準備ができている必要があります。多くの場合、タイミング要件は命令時間に比べて非常に短いため、通常、SPIスレーブを実装するハードウェアが必要です。
ファームウェアでSPIスレーブを実行できますが、注意が必要です。サイクルとレイテンシを慎重にカウントする必要があり、通常、特定のマスターが使用することがわかっているプロトコルのサブセットを実装することになります。たとえば、古いアナログコントローラーボードのデジタル版を設計しなければならなかった(アナログでは合理的にできない追加機能が必要であり、より小さく、より安価で、より安定したものが必要でした)。このボードは、SPIバスを介してシステムの残りの部分に接続されています。古いアナログボードには、制御値を設定するための2チャネルD / Aと、測定値を読み取るための2チャネルA / Dがありました。両方を単一のプロセッサに実装するのは難しく、既存のマスターが実際に使用したハードウェアD / AおよびA / D SPIプロトコルのサブセットを把握することも含まれていました。また、SPIクロックレートよりも大幅に高速に実行できるプロセッサも含まれていました。最後に、3つの割り込みを使用しました。1つは各スレーブ選択用で、もう1つはクロックラインの立ち上がりエッジ用です。その最後の1つは、システムで最も優先度の高い割り込みである必要があり、そうでなければ、レイテンシ要件を満たせませんでした。
とにかく、全体的なポイントは、ファームウェアSPIマスターが簡単で、小さく、高速で、柔軟であるということです。そして、それをやめる理由はほとんどありません。一方、スレーブの場合は、ハードウェアを本当に必要とするか、目を覚まし、タイミング、遅延などについて慎重に検討する必要があります。
SPIを何に使用するかによります。最高のデータレートを得ることが目的であれば、ハードウェアは常にビットバンギングよりも高速です(たとえば、ティーンエイジャー3の腕皮質チップは、ハードウェアSPIサポートを使用して22Mbpsでデータをプッシュできますが、ビットバンギングでは〜4.5Mbpsです)また、3-16からの転送ごとに任意のビット数を処理できます-特定のledコントローラーに12ビットのチャンクでデータを送信するときに便利です!))。16Mhzのavrでは、違いはやや極端ではなく、ハードウェアでの最高のデータレートは4 Mbpsから5 Mbpsで、ビットバンギングは2.3 Mbps程度です。
さらに、ハードウェアサポートを使用する場合、問題のマイクロコントローラーに応じて、DMAコントローラーを使用してデータをシフトアウトし、コードを他のデータに戻すことができます。書きます。
上記のすべては、ハードウェアSPIがオプションであるかどうかに依存します。
SPIをビットバンする場合、SSP割り込みを使用して通信を処理することはできません。これは多くの用途のSPIにとってそれほど重要ではありません