サーチ…


備考

チップセレクト信号

ほとんどのスレーブはアクティブなローチップセレクト入力を持っています。したがって、チップセレクトピンを初期化して使用する適切なコードは次のとおりです。

#define CSPIN 1 // or whatever else your CS pin is
// init:
pinMode(CSPIN, OUTPUT);
digitalWrite(CSPIN, 1); // deselect

// use:
digitalWrite(CSPIN, 0); // select
... perform data transfer ...
digitalWrite(CSPIN, 1); // deselect

スレーブの選択を解除することは、スレーブが選択されている間にMISOラインを駆動する可能性があるため、スレーブの選択を解除することと同じくらい重要です。多くの奴隷がいるかもしれませんが、1人だけがMISOを運転するかもしれません。スレーブが適切に選択解除されていない場合、2つ以上のスレーブがMISOを駆動している可能性があり、出力間の短絡を招き、デバイスを損傷する可能性があります。

トランザクション

トランザクションは2つの目的を果たします。

  • 特定のコンテキスト内でSPIを使用し始めるときと終了するときにSPIに指示する
  • 特定のチップにSPIを設定する

クロックラインは、異なるSPIモードで異なるアイドル状態を持ちます。スレーブが選択されている状態でSPIモードを変更すると、スレーブが混乱する可能性があるため、スレーブを選択する前に必ずSPIモードを設定してください。 SPIモードは、 SPISettings渡されるSPI.beginTransactionオブジェクトで設定できます。

SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
digitalWrite(CSPIN, 0);
... perform data transfer ...
digitalWrite(CSPIN, 1);
SPI.endTransaction();

SPISettingsは他の場所に保存することもできます:

SPISettings mySettings(1000000, MSBFIRST, SPI_MODE0);
SPI.beginTransaction(mySettings);

コードの別の部分がbeginTransaction()endTransaction()の呼び出しの間にSPIを使用しようとすると、エラーが発生する可能性があります。

Arduinoリファレンス:SPISettingsも参照してください

割り込みサービスルーチンでのSPIの使用

SPIをISR内で使用する必要がある場合、他のトランザクションは同時に発生していない可能性があります。 SPIライブラリは、これを容易にするためにusingInterrupt(interrupt_number)を提供します。 beginTransaction()endTransaction()呼び出しの間に割り込みが発生しないように、 beginTransaction()が呼び出されるたびに割り込みを無効にすることによって動作します。

Arduino参照:SPI:usingInterruptも参照してください

基本:SPIとチップセレクトピンを初期化し、1バイト転送を実行する

#include <SPI.h>
#define CSPIN 1

void setup() {
  pinMode(CSPIN, OUTPUT); // init chip select pin as an output
  digitalWrite(CSPIN, 1); // most slaves interpret a high level on CS as "deasserted"

  SPI.begin();

  SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
  digitalWrite(CSPIN, 0);

  unsigned char sent = 0x01;
  unsigned char received = SPI.transfer(sent);
  // more data could be transferred here

  digitalWrite(CSPIN, 1);
  SPI.endTransaction();

  SPI.end();
}

void loop() {
  // we don't need loop code in this example.
}

この例:

  • チップセレクトピンを正しく初期化して使用する(備考参照)
  • SPIトランザクションを適切に使用する(備考参照)
  • SPIを使用して1バイトを転送するだけです。ここでは使用されていない配列の転送方法もあります。


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow