- ビットバンギングとは何ですか?
- ビットバンギングを使用する場合
- ビットバンギングによるシリアル通信のアルゴリズム
- SPIを介したビットバンギング
- ビットバンギングの例:ArduinoでのSPI通信
- ビットバンギングのデメリット
- ArduinoでのビットバンギングによるUART
通信インターフェースは、プロジェクトに使用するマイクロコントローラーを選択する際に考慮される要素の1つです。設計者は、選択されているマイクロコントローラーが、製品に使用される他のすべてのコンポーネントと通信するために必要なすべてのインターフェースを備えていることを確認します。マイクロコントローラにSPIやI2Cなどのこれらのインターフェイスが存在すると、そのようなマイクロコントローラのコストが常に増加し、BOMの予算によっては、目的のマイクロコントローラが手頃な価格にならない場合があります。このような状況では、ビットバンギングのようなテクニックが役立ちます。
ビットバンギングとは何ですか?
ビットバンギングは、通信プロセス全体が専用のハードウェアではなくソフトウェアを介して処理されるシリアル通信の手法です。データを送信するには、ソフトウェアを使用してデータを信号とパルスにエンコードします。これらの信号とパルスは、ターゲットデバイスにデータを送信するためのTxピンとして機能するマイクロコントローラーのI / Oピンの状態を操作するために使用されます。データを受信するために、この手法では、通信ボーレートによって決定される特定の間隔の後にRxピンの状態をサンプリングします。ソフトウェアは、同期、タイミング、レベルなど、この通信を実現するために必要なすべてのパラメータを設定します。これらは通常、ビットバンギングが使用されていない場合に専用ハードウェアによって決定されます。
ビットバンギングを使用する場合
ビットバンギングは通常、必要なインターフェイスを備えたマイクロコントローラが利用できない場合、または必要なインターフェイスを備えたマイクロコントローラに切り替えるのに費用がかかりすぎる場合に使用されます。したがって、同じデバイスが複数のプロトコルを使用して通信できるようにする安価な方法を提供します。以前はUART通信のみが有効になっていたマイクロコントローラーは、ビットバンギングを介してSPIおよび12Cを使用して通信するように装備できます。
ビットバンギングによるシリアル通信のアルゴリズム
ビットバンギングを実装するためのコードは、マイクロコントローラーによって異なり、シリアルプロトコルによっても異なる場合がありますが、ビットバンギングを実装するための手順/アルゴリズムはすべてのプラットフォームで同じです。
たとえばデータを送信するには、以下の擬似コードを使用します。
- 開始
- スタートビットを送信
- 受信機のボーレートに対応するタイミングを待つ
- データビットを送信
- 受信機のボーレートに再び対応する期間を待ちます
- すべてのデータビットが送信されたかどうかを確認します。いいえの場合は4に進みます。はいの場合は7に進みます。
- ストップビットを送信
- やめる
データの受信は少し複雑になる傾向があり、通常は割り込みを使用して、受信側のピンでデータが利用可能になるタイミングを決定します。これにより、マイクロコントローラーが処理能力を浪費しないようにすることができます。特定の実装ではマイクロコントローラーのI / Oピンを使用しますが、おそらく処理されない場合でも、ノイズやエラーが発生する可能性が高くなります。割り込みを使用してデータを受信するアルゴリズムを以下に説明します。
- 開始
- Rxピンの割り込みを有効にする
- 割り込みがトリガーされたら、スタートビットを取得します
- ボーレートに応じてタイミングを待つ
- Rxピンを読む
- すべてのデータが受信されるまで、4から繰り返します
- ボーレートに応じてタイミングを待つ
- ストップビットを確認してください
- やめる
SPIを介したビットバンギング
上記のように、プロトコルごとにビットバンギングの動作は異なるため、実装を試みる前に、各プロトコルについて読んで、データのフレーミングとクロッキングを理解することが重要です。SPIモード1を例にとると、クロックの基本値は常に0であり、データは常にクロックの立ち上がりエッジで送受信されます。SPIモード1通信プロトコルのタイミング図を以下に示します。
これを実装するには、次のアルゴリズムを使用できます。
- 開始
- SSピンをローに設定して通信を開始します
- マスター出力スレーブ入力(MOSI)のピンを、送信するデータの最初のビットに設定します
- クロックピン(SCK)をハイに設定して、データがマスターによって送信され、スレーブによって受信されるようにします。
- マスターインスレーブアウト(MISO)の状態を読み取り、スレーブからデータの最初のビットを受信します
- SCKをLowに設定して、データを次の立ち上がりエッジで送信できるようにします
- すべてのデータビットが送信されるまで2に進みます。
- SSピンをHighに設定すると、送信が停止します。
- やめる
ビットバンギングの例:ArduinoでのSPI通信
例として、Arduinoでビットバンギングを介したSPI通信のアルゴリズムを実装して、以下のコードを使用してSPIを介してデータをビットバンギングする方法を示しましょう。
まず、使用するArduinoのピンを宣言します。
const int SSPin = 11; const int SCKPin = 10; const int MISOPin = 9; const int MOSIPin = 8; バイトsendData = 64; //送信される値 byteslaveData = 0; //スレーブから送信された値を格納するため
次に、ピンの状態が宣言されている void setup() 関数に移動し ます 。データを受信する唯一のピンであるため、マスター入力スレーブ出力(MISO)ピンのみが入力として宣言されます。他のすべてのピンは出力として宣言されます。ピンモードを宣言した後、SSピンはHIGHに設定されます。これは、プロセスにエラーがなく、低に設定されている場合にのみ通信が開始されるようにするためです。
void setup() { pinMode(MISOPin、INPUT); pinMode(SSPin、OUTPUT); pinMode(SCKPin、OUTPUT); pinMode(MOSIPin、OUTPUT); digitalWrite(SSPin、HIGH); }
次に、データを送信するための ループ を開始し ます 。このループはデータを繰り返し送信し続けることに注意してください。
SSピンをローに書き込んで ループ を開始し、通信の開始を開始し、事前定義されたデータをビットに分割して送信する bitbangdata 関数を呼び出します。これが完了したら、SSピンをHIGHに書き込んで、データ送信の終了を示します。
void loop() { digitalWrite(SSPin、LOW); // SS低 slaveData = bitBangData(sendData); //データ送信 digitalWrite(SSPin、HIGH); // SSが再び高くなります }
bitbangdata() 関数は、以下が書き込まれます。この関数は、送信されるデータを受け取り、それをビットに分解し、アルゴリズムのステップ7に示されているように、送信用のコードをループすることによってデータを送信します。
byte bitBangData(byte _send)//この関数は、ビットバンギングを介してデータを送信します { byte _receive = 0; for(int i = 0; i <8; i ++)//バイト内の8ビット { digitalWrite(MOSIPin、bitRead(_send、i)); // MOSIを設定 digitalWrite(SCKPin、HIGH); // SCKハイ bitWrite(_receive、i、digitalRead(MISOPin)); // MISOをキャプチャします digitalWrite(SCKPin、LOW); // SCKが低い } return _receive; //受信したデータを返します }
ビットバンギングのデメリット
ただし、ビットバンギングにはいくつかの欠点があり、特定のソリューションでの実装の信頼性が低くなる可能性があるため、ビットバンギングを採用することはよく考えられた決定である必要があります。ビットバンギングは、プロセスによって消費される高い処理能力のために、マイクロコントローラーによって消費される電力を増加させます。専用ハードウェアと比較して、ビットバンギングを使用すると、特にデータ通信が他のタスクと同時にマイクロコントローラーによって実行されている場合に、グリッチやジッターなどの通信エラーが発生します。ビットバンギングによる通信は、専用ハードウェアを使用した場合の数分の1の速度で行われます。これは特定のアプリケーションで重要であり、ビットバンギングを「あまり良くない」選択にする可能性があります。
ビットバンギングは、以下を含むすべての種類のシリアル通信に使用されます。RS-232、非同期シリアル通信、UART、SPI、およびI2C。
ArduinoでのビットバンギングによるUART
ビットバンギングの一般的な実装の1つは、Arduinoソフトウェアシリアルライブラリです。これにより、Arduinoは専用のハードウェアUARTピン(D0およびD1)を使用せずにUARTを介して通信できます。これにより、ユーザーはArduinoボードのピン数がサポートできる数のシリアルデバイスを接続できるため、柔軟性が大幅に向上します。