ビットバンギングとは


26

私はマイクロコントローラのプログラミングは初めてです。ATmega32-AコントローラーとCodeVisionAVRコンパイラーを使用しています。SPI通信を使用して正弦波信号を生成するために、波形ジェネレーター(AD9833)を使用しています。サイン波を正常に生成できました。今、私はその信号をセンサーに渡しています。センサーの出力はマルチプレクサを介して選択され、ADCに送信されます。次に、SPI通信を使用してADC値を読み取ります。ADCのレジスタをセットアップするために多くのことを試みました。それでも動作しません。SPI通信コードを確認するには、spi通信を使用した以前のポストADCレジスタ設定を参照してください。USART(RS232)通信を使用して、PC(PuTTY)に値を印刷しています。

誰かがビットバンギングを使用するようにアドバイスしました。私はその概念に新しいです。SPI通信のビットバンギングのコード例を教えてください。その手順を開始する方法は?誰も私に良い材料を提供できますか。外部ハードウェアは必要ですか?

ピン接続を含め、これを書きました。

#define ADC_CS PORTB.3
#define MOSI PORTB.5
#define MISO PINB.6
#define SCK PORTB.7

void send_8bit_serial_data(unsigned char data)
{
    int i;  
    ADC_CS=0;
    for (i = 0; i < 8; i++)
    {
        // consider leftmost bit
        // set line high if bit is 1, low if bit is 0
        if (data & 0x80)
            output_high(PORTB.5);
        else
            output_low(PORTB.5);

        // pulse clock to indicate that bit value should be read
        output_low(PORTB.7);
        output_high(PORTB.7);

        // shift byte left so next bit will be leftmost
        data <<= 1;
    }

    // deselect device
    ADC_CS=1;
}


あなたのコードは、ビット設定と遅延の前にあるべきであるクロック出力が低いことを別にすれば、問題なく見える。タイミングを修正するには、いくつかの遅延が必要です(クロックのロー/ハイはほぼ同じ周期です)スティーブンのコードをもう一度見てください。同様に読みたい場合は、そのためのコードも追加する必要があります。
オリグレイザー

@OliGlaserレジスタをセットアップする通常のSPIコードの代わりに、このコードを直接使用できますか。
ベレンドラ

@verendra-「通常のSPIコード」の意味がわかりません。ハードウェアSPIではなく、ADCは、プロトコルとタイミングに一致する限り、パルスの生成方法を気にしません。
オリグレイザー

回答:


25

ビットバンギングは、マイクロコントローラ内のハードウェアに依存するのではなく、ソフトウェアで一連のパルス全体を作成します。

多くのマイクロコントローラにはハードウェアSPIがあり、出力レジスタに1バイトを書き込むだけで、SPIコントローラーはデータをシフトアウトし、同時にスレーブからデータを受信します。転送が完了すると割り込みを取得し、受信したデータを読み取ることができます。

ただし、一部のマイクロコントローラーにはSPIハードウェアが搭載されていないため、すべてを手動で実行してシミュレートする必要があります。SPIにはさまざまなモードがあります。このパルス図を例として使用します。

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

そのため、専用のSPIコントローラーがすべてのパルス、データシフト、およびタイミングを処理しますが、ビットバンギングを行う場合は、すべてのアクションを自分で行う必要があります。

Make Slave Select low  
Short delay
Do 8 times
  Make the SCK (Serial Clock) pin low 
  Make the MOSI (Master-Out-Slave-In) pin high or low depending on bit 7 of the data  
  Add brief delay  
  Make the SCK output high
  Read MISO (Master-In-Slave-Out) pin
  Shift received data left, and shift the bit just read in as bit 0   
  Add brief delay  
  Shift the data byte 1 bit left
Make Slave Select high again  

ビットバンギングSPIは比較的単純です。たとえば、ビットバンギングI2Cのコードはより複雑になります。UARTプロトコルをビットバンギングする場合は、何らかの方法でタイマーが必要になります。


2
サンプルのcコードを提供できますか。
ベレンドラ

1
@verendra-疑似コードの例を追加しました。これは簡単にCに翻訳できるはずです。
stevenvh

SPI通信を使用してWavefromを正常に生成しています。SPIのみを使用してADC値を読み取ることに問題があります。両方に、またはADC値を読み取るためだけにビットバンギングを使用する必要があります。8ビットを送信するための私のコードを見ていただけますか?しかし、私はそれを使用する方法を混乱させています。SPIコードの代わりにこのコードを直接セットアップレジスタに配置できますか。
ベレンドラ

@Steven-表示する図はMSBファーストであるため、7から左にシフトアウトし、0から左にシフトインする必要があります。 。
オリグレイザー

2
@オリ-良い点、私はそれを見逃した。フィードバックをお寄せいただきありがとうございます。規格がない理由は、転送されたビットの数がシフトレジスタの長さに等しい限り、問題ではないからです。最近、一部のマイクロコントローラ(NXP Cortec-M3など)には可変長シフトレジスタがあり、方向が重要になる場合があります。AVRのIIRCでは、MSBファーストまたはLSBファーストを選択できます。
-stevenvh

6

ビットバンギングとは、デバイスから出入りする信号をハードウェアではなくソフトウェアによって生成/サンプリングするという概念を指します。明らかにいくつかのハードウェアが必要ですが、ビットバンギングを使用する場合、各出力の唯一のハードウェアはソフトウェアによって明示的に設定またはクリアできるラッチであり、各入力の唯一のハードウェアはソフトウェアがそれをテストできるようにするインターフェースですhighまたはlow(通常、1つの状態に対して条件分岐を実行しますが、他の状態に対しては実行しません)。

ビットバンギングで達成できる最大速度は、一般に専用ハードウェアで達成できるものの数分の一ですが、プロセッサ速度によって課される制限を超えて、ビットバンギングははるかに用途が広く、状況で使用される可能性があります汎用ハードウェアはあまり適しておらず、専用ハードウェアは費用対効果が高くありません。

たとえば、多くのコントローラには、基本的に次のように動作する「SPIスタイル」ポートがあります。バイトが特定のレジスタに書き込まれると、ハードウェアはいくつかのクロックパルス(通常8)を生成し、各クロックパルスの立ち上がりエッジと立ち下がりエッジで着信データビットをサンプリングします。一般に、コントローラーのSPIスタイルのポートを使用すると、さまざまな機能を構成できますが、場合によっては、プロセッサーを異常な動作をするデバイスと接続する必要があります。デバイスでは、データビットを8以外の倍数で処理する必要がある場合や、同じクロックエッジでデータの出力とサンプリングの両方が必要な場合、またはその他の異常な要件がある場合があります。使用しているコントローラー上の特定のハードウェアが自分の正確な要件をサポートできる場合、すばらしい(構成可能なビット数、個別に構成可能な送信および受信タイミングなどを提供するものもあります)そうでない場合、ビットバンギングが役立つ場合があります。コントローラによっては、SPI風のインターフェイスをビットバンギングするのにハードウェアで処理するのに2〜10倍かかることがよくありますが、要件がハードウェアの要件に合わない場合は、データ交換をよりゆっくりと行う方がよい場合があります全然できない。

ビットバングされたデザインで注意すべき重要な点は、通信するデバイスがビットバングコントローラーですべてのタイミングを生成するのを待機している場合、またはコントローラーが許可されている場合に、最もシンプルで最も堅牢であることです気を散らすことなく、イベントが到着するのを待ちます。イベントが処理する必要がある他のイベントが到着する前に、そのイベントで必要なことをすべて実行できるようになります。デバイスは、比較的短い時間枠内で外部刺激に反応できる必要があるが、そのような刺激を監視するためにそのエネルギーの100%をデバイスに使用できない状況では、はるかに堅牢ではありません。

たとえば、プロセッサがUARTスタイルのデータをそのクロック速度に比べて非常に高い速度でシリアルに送信したい場合(たとえば、毎秒8,192命令を実行しているPICが1200 bpsでデータを出力したい場合)。割り込みが有効になっていない場合、そのような送信は難しくありません(7命令サイクルごとに1ビットをクロックします)。PICが着信1200bpsデータバイトを待機する以外に何もしていない場合、スタートビットを待機する3サイクルループを実行してから、7サイクル間隔でデータのクロックを開始できます。実際、PICがデータの着信バイトが到着したときに送信できるデータのバイトを持っている場合、PICが着信バイトの読み取りと同時にデータのバイトを送信するには、ビットあたり7サイクルで十分です。同様に、そのような回答がオリジナルのトランスミッションに関してタイミングを固定していたなら。一方、PICがビットバン通信を高速で処理する方法はありません。そのため、どちらのデバイスも適切と判断したときにいつでも送信できるようになります(見たときに送信できるデバイスは1つではありません)適合し、送信していないときに好きなことを行い、タイミングのほとんどを何もせずに最初のデバイスからの送信を待機する必要がある1つのデバイス)。

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